`/ etc / hosts`とDNSはどのように連携してホスト名をIPアドレスに解決しますか?


10

Linuxでは、/etc/hostsDNS はどのようにしてホスト名をIPアドレスに解決するのですか?

  1. でホスト名を解決できる場合、/etc/hostsDNS /etc/hosts はホスト名を解決した後に適用されますか、または解決されたIPアドレスを/etc/hosts「ホスト名」として処理して 再帰的に解決しますか?
  2. 私のブラウザー(firefoxとgoogle chrome)で、私がに追加すると /etc/hosts

    127.0.0.1 google.com www.google.com
    

    ブラウザのアドレスバーにwww.google.comと入力してEnterキーを押すと、Webサイトに接続できません。からその行を削除/etc/hostsすると、Webサイトに接続できます。/etc/hostsホスト名を解決するためにDNSをオーバーライドするということですか?

    に行を再度追加した/etc/hosts後も、Webページを更新した後でも、Webサイトに接続できます。/etc/hosts再度申請しない ので、ウェブサイトに接続できません。

ありがとう。


9
多くのWebブラウザーは独自のDNSサーバーとDNSキャッシュを実装しており、システムで構成されている名前検索メカニズムを参照しないことに注意してください。つまり、一部のWebブラウザー/etc/hostsは、ローカルで定義されたネームサーバーを完全に無視します。初めて目撃するのはかなり混乱します。(あなたを見て、Chromiumベースのブラウザ!)
クリストファー

@クリストファー私は同じことを言うためにここに来ていました。関連unix.stackexchange.com/questions/363498/...
ルイF・リベイロ

@Christopher / etc / hostsに行を再度追加した後も、Webページを更新した後でも、Webサイトに接続できます。/ etc / hostsが再度適用されず、ウェブサイトに接続できないのはなぜですか?FirefoxのDNSキャッシュが原因ですか?
Tim

@RuiFRibeiroこのChromiumビルドは/etc/hosts、システム定義のDNSサーバーを尊重しているようです(github.com/Eloston/ungoogled-chromium)。Homebrewを使用したmacOSへのインストール:brew cask install eloston-chromium
Christopher

回答:


21

これは、NSS(ネームサービススイッチ)構成、つまり/etc/nsswitch.confファイルのhostsディレクティブによって指示されます。たとえば、私のシステムでは:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

ここで、files/etc/hostsファイルをdns指し、DNSシステムを指します。そして、あなたが想像できるように、どちらが先に来るかが勝ちます。

また、これについてman 5 nsswitch.confより多くのアイデアを得るために参照してください。


余談ですが、NSSホスト解決の順序に従うには、データベースとして次のように使用getenthostsます。

getent hosts example.com

ありがとう。私のパート2では、WebブラウザーのDNSサーバーは機能しませんが、WebブラウザーのDNSキャッシュは機能するためですか?
Tim

systemd.resolver解像度にどのように影響しますか?NISとLDAPはどこで解決システムに適合しますか?MacOSシステムまたはWindowsシステムに続く順序は?
Isaac

@Timはい、ブラウザはキャッシュからデータをフェッチしています。
heemayl

7

あなたの最後の質問に答えるには、それが得た最後のホスト名をキャッシュしている/etc/hostsのでfirefox、すぐには再び適用されませんgoogle.com。常に再度フェッチする場合はnetwork.dnsCacheExpiration0in に設定する必要がありますabout:config。詳細(少し古くはあります)はこちら。これが主題外の場合は申し訳ありません。


追記として、多くのプログラムは、標準のリゾルバを使用していない(getaddrinfo(3)getnameinfo(3)[1])ので、それは吸います

まず、インターフェースは非同期ではありません。適度に複雑なプログラムは、だけを実行する別のスレッドを生成し、getaddrinfo()それと通信するための独自のプロトコルを発明する必要があります(そして、完了時にシグナルgetaddrinfo_a()送信しているに入らないようにしてください)。

第二に、glibc(Linuxの標準Cライブラリ)のリゾルバー実装は恐ろしいです。ランダムな動的オブジェクトをdlopen()背中の後ろからアドレス空間に引き込んで、何らかの方法でそれを含めたり、静的に使用したりすることはできません。リンクされた実行可能ファイル。

多くのプログラムは、直接、標準のリゾルバを使用していない、彼らはまた、正確にその動作を複製するためにわざわざ、との一部またはすべてを無視していないので/etc/resolv.conf/etc/hosts/etc/nsswitch.confまたは/etc/gai.conf

[1]そして、リエントラントでないipv4-onlyについてさえ言及しないでくださいgethostbyname()。これは、古くから廃止されました。


ありがとう。「非再入可能」とはどういう意味ですか?
ティム

1
それはあなたがやっていることを意味している場合google = GHBN("google.com"); facebook = GHBN("facebook.com")、あなたが両方で終わる可能性googlefacebookのアドレスを含みますfacebook.com。2つの呼び出しが異なるスレッドで行われると、さらにおもしろくなります。GoogleとFacebookの半分、または完全なゴミのアドレスで終わる可能性があります。
ビリーおじさん

今何が変わりましたgethostbyname()か?
Tim

1
getaddrinfoはそのための標準機能ですが、すでに説明したように、それ自体が壊れているため、ブラウザーやその他の実際のアプリではそのまま使用されません。
ビリーおじさん

実際、FirefoxとChromeは、たとえば独自の解決を使用します。洞察に満ちたメモをありがとう。
Rui Fリベイロ

6

ファイル/etc/hostsとDNSが一緒に機能しません。それらは名前(ネットワーク名)の独立した解決を提供します。

それらをリンクする接着剤は、Linuxシステムの内部/etc/nsswitch.confにあります。では/etc/netsvc.confAIXサーバ用、システム内のWindowsとして記載されていることができlookupd -configuration(に似LookupOrderの検索、:Cache FF DNS NI DS)MacOSのシステムインチ

実際の順序は複雑になり、通常、各名前解決サービスは他のレベルの解決の内部を調べることができるため(多くの場合そうです)、複雑になります。同様にdnsmasq(通常は127.0.0.1:53、または::1:53(または両方)の軽量DNSサーバー)は、/etc/hostsファイルの内容を読み取ってインクルードします。または、ある種の条件(のsystemd.resolverようなドットなしの名前のみを解決する基本的なリゾルバmycomputer)は、ドット付きの名前(mycomputer.here.dev.)のDNS解決を直接呼び出します。

一般に、サービスは順番に呼び出され、失敗しない最初のサービスが勝ち、正しいアドレスとして受け入れられます。一般的な基本的な順序は/etc/hosts、(ファイル)、mDNS(ドットなしの名前)、DNS、NIS、NIS +、LDAPです。一部のLinuxシステムでは、サービス内のコンピューターの最後の解決策がありますhostnamemyhostname

たとえば、このシステムでは(からcat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

非常に古い(glibc 2.4以前)orderエントリが次のように設定され/etc/host.confていることに注意してください。

order hosts,bind,nis

ファイル(file /etc/hosts)ネームサービスにのみ適用されます。

NISとLDAPに関連するこの(Linux)クライアントコンピューターへの影響は、(通常)使用されるDNSサーバー(バインド、バインド解除など)によって制御されます。

そう:

  1. ホスト名を/ etc / hostsで解決できる場合、DNSは/ etc / hostsの後にホスト名を解決するために適用されますか、または/ etc / hostsによって解決されたIPアドレスを「ホスト名」として再帰的に解決しますか?

無し。

ホスト名がで解決することができた場合は/etc/hostsDNS(ファイルがDNSの前にある場合)は適用されません。

また、解決されたIPアドレスは「ホスト名」として扱われません

それは単に、解決されたアドレスです。

ブラウザ

ブラウザは任意のメソッドを使用して名前を解決できます(解決された名前のキャッシュをチェックした後)。システム提供の方法を使用する場合のみ、上記の順序が適用されます。ブラウザは、他のプログラムと同様に、任意のDNSサーバーに直接接続することを選択できます。

システムの順序が/etc/hostsbeforeの場合はDNS、そのファイルのエントリがDNS解決サービスよりも優先されることを意味します。

そう:

  1. ...それは、/ etc / hostsがホスト名を解決するためにDNSをオーバーライドすることを意味しますか?

はい(ブラウザがシステム提供の解像度を使用する場合)。

/etc/hosts再度申請しないので、ウェブサイトに接続できません。

その特定の名前についてブラウザーの内部キャッシュがクリアされる(またはタイムアウトになる)まで、その名前はブラウザーの外部で再び検索されます。

ブラウザの名前がキャッシュで解決されている場合、ブラウザはその名前を再び使用します。

これを使用してキャッシュをクリアします。

または、単に閉じて(しばらく待って)ブラウザを再起動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.