誰が/etc/resolv.confを読みますか?


16

私のCentos 7サーバーは、ドメイン名を適切に解決しません。私が見るものから、現代​​のLinuxシステムで/etc/resolv.confはしばしばdhclientdnsmasqまたはで生成されNetwork Managerます。

したがって、現代のLinuxのネットワークスタックに関する一般的な理論上の質問があります。

読書の責任者は誰/etc/resolv.confですか?ドメイン名解決に関与しているプレーヤー(サービスまたはカーネルサブシステム)は何ですか?

短い回答: Arch Linuxマニュアルでは、ドメイン名解決の高レベルの設定はName Service Switch APIで行われ、 /etc/nsswitch.confそれに依存していると書かれていglibcます。

glibcnss-resolveDNS要求をDNSサーバーに送信する機能を使用します。

通常、最新のCentOSシステムでnss-resolve は、 systemd-resolvedサービスに依存しています。の/etc/resolv.confようなものによって生成された場合dhclient-scriptsystemd-resolvedそれを読み取り、互換モードで動作し、BINDDNSクライアントのような古いシステムの動作をエミュレートします。

回答:


20

DNSクライアントライブラリはそうします。

Cライブラリには、DNSプロトコルで名前からアドレスへのルックアップをまとめて、プロキシDNSサーバーに引き渡し、クエリ解決の面倒な作業をすべて行うDNSクライアントが含まれています。これらのDNSクライアントは多数あります。オペレーティングシステムのメインCランタイムライブラリにあるのは、おそらくISCのBINDのものです。しかし、ダニエル・J・バーンスタインのdns図書館には、c-アールからアドンズまで、他にもたくさんの人がいます。

それらのいくつかには独自のネイティブ構成メカニズムが含まれていますが、通常、読み取りresolv.confにはBINDライブラリ互換モードがあり、ISCのBIND Cクライアントライブラリの構成ファイルです。

NSSはこの上に階層化され、によって構成されnsswitch.confます。NSSルックアップが内部的に呼び出すことができるものの1つはDNSクライアントでありnsswitch.conf、CライブラリのNSSコードによって読み取られ、ルックアップがDNSクライアントに渡されるかどうか、およびどこで、さまざまな応答を処理するかを決定します。

(ネームサービスキャッシュデーモン、nscdによってこのアイデアに若干の複雑さがあります。しかし、これは単にローカルサーバーに特異なプロトコルを話すCライブラリに余分な上位層クライアントを追加します。 DNSプロトコルをプロキシDNSサーバーに伝えるDNSクライアント。systemd-resolved同様の複雑さを追加します 。)

systemd-resolvedNetworkManagerconnmandhcpcdresolvconf、などがその場で別のプロキシDNSサーバと通信するためにスイッチのDNSクライアントにBIND DNSクライアント構成ファイルを調整します。これはこの答えの範囲外です。特に、このWWWサイトには、そのようなメカニズムが関与するビザンチンの詳細をすでに扱っている多くの答えがあるためです。

Unixの世界でより伝統的なことを行う方法は、マシン自体またはLAN上でプロキシDNSサーバーを実行することです。したがって、FreeBSDマニュアルは、通常構成されたシステムについて述べていますが、DNSクライアントライブラリのデフォルトアクションは、resolv.confUnixシステム管理者が通常持っているものと一致します。(resolv.conf実際のFreeBSDマニュアルは、ISCのBINDに由来するdocoであり、もちろんBIND DNSクライアントライブラリがGNU Cライブラリなどの他の場所に組み込まれている場所でも見つけることができます。)

参考文献


7

はるかに優れた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.

1

ファイル/etc/resolv.confは、ホスト名解決を実行する* libc呼び出しによって読み取られます。これは主getaddrinfoに非推奨ですgethostbyname

これらの関数にDNS名が渡される場合、これらの機能は次の順序で実行されます。

  1. ホスト名をローカルで解決しようとします/etc/hosts。つまり、を読み取ります。
  2. これが失敗した場合、にリストされているDNSサーバーを照会します/etc/resolv.conf
  3. これも失敗すると、ホスト名を解決できません。

dnsmasqに言及しているので、これはローカルで実行されるDNSサーバーです。そのため、多くの最新のLinuxディストリビューションでは、/etc/resolv.conf唯一のポイント127.0.0.1(ローカルdnsmasqがリッスンする場所)です。dnsmasqは、インターネットDNSサーバーのクエリを転送するように構成されます。dnsmasqは、インターネットへの接続時にNetwork Managerによって構成されます。


これらはシステムコールではなく、* libc関数です。
-JoshuaRLi

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