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

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

/etc/hostsLinuxでは、DNSはホスト名をIPアドレスに解決するためにどのように連携しますか?

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

    127.0.0.1 google.com www.google.com
    

    ブラウザのアドレスバーにwww.google.comと入力してEnterを押すと、そのウェブサイトにアクセスできなくなります。その行を削除したら、/etc/hostsWebサイトに接続できます。これは/etc/hosts、ホスト名を解決するためにDNSが上書きされることを意味しますか?

    行を再追加した後でも/etc/hostsページを更新した後もサイトに接続できます。なぜ /etc/hosts再適用されないため、ウェブサイトに接続できないのですか?

ありがとうございます。

答え1

これは、NSS(Name Service Switch)構成(/etc/nsswitch.confファイルディレクティブなど)によってhosts決まります。たとえば、私のシステムでは次のようになります。

hosts:    files mdns4_minimal [NOTFOUND=return] dns

ここではファイルとDNSシステムをfiles意味します。想像できるように/etc/hostsdns何でも最初に来たもの

また、man 5 nsswitch.confこれに関するより多くのアイデアについては、こちらをご覧ください。


ただし、NSSホストの確認手順に従うには、次のようにデータベースgetentとして使用します。hosts

getent hosts example.com

答え2

最後の質問に答えるには、最後のホスト名がキャッシュされている/etc/hostsため、すぐには再適用されません。常に再インポートするには設定する必要があります。firefoxgoogle.comnetwork.dnsCacheExpiration存在する。0追加about:config情報(少し古いですが)ここ。話題から外れた内容ならすみません。


参考までに、多くのプログラムは標準パーサー(getaddrinfo(3)getnameinfo(3)[1])を使用しません。ひどいです。

まず、インターフェイスは非同期ではありません。ある程度複雑なプログラムは、そのタスクを実行する別々のスレッドを作成し、それと通信するための独自のプロトコルを作成する必要がgetaddrinfo()あります。getaddrinfo_a()シグナル終わったら、状況はもっと深刻になりました。)

第二に、(Linuxの標準Cライブラリ)のパーサーの実装はglibcひどいです。任意の動的オブジェクトを背後のアドレス空間に引き込むことを許可し、dlopen()それを何らかの方法で含めたり静的に使用したりすることを不可能にします。リンクされた実行文書。

多くのプログラムが標準パーサを直接使用しないため、その動作を正確に複製せず、またはの/etc/resolv.conf一部または全部を無視します。/etc/hosts/etc/nsswitch.conf/etc/gai.conf

gethostbyname()[1] 長年にわたって廃止された再進入が不可能なipv4専用バージョンは言うまでもありません。

答え3

このファイル/etc/hostsとDNSは連携しません。独立した名前解決(ネットワーク名)を提供します。

それらを接続する接着剤は/etc/nsswitch.confLinuxシステム内部。 AIXサーバーの場合、/etc/netsvc.confシステム上WindowsMacOSで利用可能ですlookupd -configuration(LookupOrder検索、同様:)。Cache FF DNS NI DS

各名前解決サービスは異なる確認レベルを見ることができ、しばしば検証するため、実際の順序は複雑になり複雑になることがよくあります。dnsmasq軽量DNSサーバー(通常は、または(またはその両方)にあります)は通常、ファイルの内容を読み取り、含めます。または、場合によっては、ドット名のDNS解決()を直接呼び出す(非非名前のみを解決する必要があるデフォルトのリゾルバ)と同じです。127.0.0.1:53::1:53/etc/hostssystemd.resolvermycomputermycomputer.here.dev.

通常、サービスは順番に呼び出され、失敗しない最初のサービスが勝ち、正しいアドレスで承認されます。一般的なデフォルトの順序は、(/etc/hostsファイル)、mDNS(ドットレス名)、DNS、NIS、NIS +、LDAPです。一部のLinuxシステムには最終的なソリューションがあります。hostnameサービス中のコンピュータmyhostname

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

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

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

order hosts,bind,nis

/etc/hostsファイル名サービスにのみ適用されます。

NISおよびLDAPに関連するこれらの(Linux)クライアントシステムの影響は、(通常)使用されているDNSサーバー(バインディング、アンバインドなど)によって制御されます。

だから:

  1. /etc/hostsでホスト名を解決できる場合は、ホスト名を解決するために/etc/hostsの後にDNSを適用する必要があります。または/etc/hostsで解決されたIPアドレスを「ホスト名」として処理して繰り返し確認すべきですか?

まったく。

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

...でもない「ホスト名」として処理される解決済みのIPアドレス。

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

ブラウザ

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

システムの順序/etc/hostsが以前の場合、DNSこのファイルのエントリがDNS最初に解決されることを意味します。

だから:

  1. ...これは、ホスト名を解決するために/ etc / hostsがDNSを無視することを意味しますか?

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

なぜ/etc/hosts再適用されないため、ウェブサイトに接続できないのですか?

その特定の名前の内部ブラウ​​ザキャッシュが消去された(またはタイムアウトした)後にのみ、ブラウザの外部から名前が再取得されます。

ブラウザはキャッシュ内の名前を解決するとそれを再利用します。

キャッシュを消去するために使用

または、ブラウザを閉じて(しばらくお待ちください)、再起動してください。

関連情報