Centos 7サーバーがドメイン名を正しく解決しない。私の知る限り、最近のLinuxシステムでは、/etc/resolv.conf
はdhclient
、dnsmasq
またはNetwork Manager
を使用して生成されることがよくあります。
したがって、最近のLinuxのネットワークスタックに関する一般的な理論的な質問があります。
/etc/resolv.conf
を読む責任があるのは誰ですか?ドメイン名の解決に関与しているのはどのプレイヤー(サービスまたはカーネルサブシステム)ですか?
SHORT ANSWER:Arch Linux manual ドメイン名解決の高レベルの構成 で行われる = /etc/nsswitch.conf
およびName Service Switch glibc
APIに依存します。
glibc
は、DNSサーバーにDNS要求を送信するためにnss-resolve
関数を使用します。
通常、最新のCentOSシステムではnss-resolve
依存systemd-resolved
サービス。 /etc/resolv.conf
がdhclient-script
のようなものによって生成された場合、systemd-resolved
はそれを読み取って互換モードで動作し、BIND
DNSクライアントのような古いシステムの動作をエミュレートします。
Cライブラリには、DNSプロトコルでの名前からアドレスへのルックアップをラップし、それらをプロキシDNSサーバーに引き渡して、クエリ解決の面倒な作業をすべて行うDNSクライアントが含まれています。これらのDNSクライアントはたくさんあります。オペレーティングシステムのメインCランタイムライブラリにあるものは、ISCのBINDからのものである可能性が非常に高くなります。しかし、Daniel J. Bernsteinのdns
ライブラリからc-aresからadnsまで、他にもたくさんのものがありました。
それらのいくつかには独自のネイティブ設定メカニズムが含まれていますが、通常、ISCのBIND Cクライアントライブラリの設定ファイルであるresolv.conf
を読み取るBINDライブラリ互換モードがあります。
NSSはこの上に階層化され、nsswitch.conf
によって構成されます。 NSSルックアップが内部で呼び出すことができるものの1つはDNSクライアントであり、CライブラリのNSSコードによってnsswitch.conf
が読み取られ、ルックアップがDNSクライアントに渡されるかどうかと場所、およびさまざまな処理方法が決定されます。反応。
(ネームサービスキャッシュデーモン、nscdが原因で、このアイデアには少し複雑な問題があります。しかし、これはCライブラリに追加の上位層クライアントを追加し、ローカルサーバーに固有のプロトコルを話すだけでなく、ローカルサーバーとして機能します。プロキシDNSサーバーに対してDNSプロトコルを話すDNSクライアント。systemd-resolved
は同様の複雑さを追加します。)
systemd-resolved
、NetworkManager
、connman
、dhcpcd
、resolvconf
などは、BIND DNSクライアント構成ファイルを調整して、通信するDNSクライアントを切り替えますその場で異なるプロキシDNSサーバー。これはこの回答の範囲外です。特に、このWWWサイトには、そのようなメカニズムが関与するビザンチンの詳細を扱っている回答がたくさんあるためです。
Unixの世界でより伝統的な方法は、マシン自体またはLAN上でプロキシDNSサーバーを実行することです。したがって、FreeBSDマニュアルが通常構成されているシステムについて述べているもので、resolv.conf
がない場合のDNSクライアントライブラリのデフォルトアクションは、127.0.0.1でリッスンするプロキシDNSサーバーであるUnixシステム管理者が通常持っているものと一致します。 (resolv.conf
のFreeBSDマニュアルは、実際にはdocoでありまたはISCのBINDに由来し、もちろんBIND DNSクライアントの場所でも見つけることができますライブラリは、GNU Cライブラリなど)の他の場所に組み込まれています。
dns
ライブラリ。 cr.yp.to。はるかに優れたFreeBSDのmanページから resolv.conf :
The resolver configuration file contains information that is read by the
resolver routines the first time they are invoked by a process.
On a normally configured system this file should not be necessary. The
only name server to be queried will be on the local machine, the domain
name is determined from the Host name, and the domain search path is
constructed from the domain name.
ファイル/etc/resolv.conf
は、ホスト名解決を実行する* libc呼び出しによって読み取られます。これは主にgetaddrinfo
と非推奨のgethostbyname
です。
これらの関数にDNS名が渡されると、次の順序でこれらの機能が実行されます。
/etc/hosts
を読み取ります。/etc/resolv.conf
にリストされているDNSサーバーを照会します。dnsmasqについて言及したので、これはローカルで実行されるDNSサーバーです。そのため、最近の多くのLinuxディストリビューションでは、/etc/resolv.conf
は127.0.0.1
のみを指します(これがローカルのdnsmasqがリッスンする場所です)。次に、dnsmasqは、クエリをインターネットDNSサーバーに転送するように構成されます。 dnsmasqは、インターネットへの接続時にNetwork Managerによって構成されます。