Wer liest /etc/resolv.conf?

16

Mein Centos 7-Server löst Domänennamen nicht richtig auf. Von dem, was ich sehe, in modernen Linux - Systemen /etc/resolv.confwird oft erzeugt mit dhclient, dnsmasqoder Network Manager.

Daher habe ich eine allgemeine theoretische Frage zum Netzwerkstack in modernen Linux-Systemen:

Wer ist für das Lesen verantwortlich /etc/resolv.conf? Welche Player (Dienste oder Kernel-Subsysteme) sind an der Auflösung von Domainnamen beteiligt?

KURZE ANTWORT: Das Arch Linux-Handbuch besagt, dass die Konfiguration der Domänennamenauflösung auf hoher Ebene in der API von Name Service Switch erfolgt /etc/nsswitch.conf und auf dieser basiertglibc .

glibcVerwendet die nss-resolveFunktion zum Senden von DNS-Anfragen an DNS-Server.

Normalerweise sind moderne CentOS-Systeme nss-resolve auf systemd-resolved Service angewiesen . Wenn /etc/resolv.confvon etwas generiert wurde dhclient-script, systemd-resolvedliest es und arbeitet in einem Kompatibilitätsmodus, der das Verhalten älterer Systeme wie BINDDNS-Client emuliert .

Boris Burkov
quelle

Antworten:

20

DNS-Client-Bibliotheken tun.

C-Bibliotheken enthalten DNS-Clients, die die Suche nach Namen und Adressen im DNS-Protokoll zusammenfassen und sie an Proxy-DNS-Server weiterleiten, um die grundlegende Arbeit der Abfrageauflösung zu erledigen. Es gibt viele dieser DNS-Clients. Diejenige, die sich in der Haupt-C-Laufzeitbibliothek Ihres Betriebssystems befindet, wird höchstwahrscheinlich diejenige von ISCs BIND sein. Aber es gibt eine ganze dnsMenge anderer von Daniel J. Bernsteins Bibliothek über C-Ares bis Adns.

Obwohl einige von ihnen ihre eigenen systemeigenen Konfigurationsmechanismen enthalten, verfügen sie im Allgemeinen über einen BIND-Bibliothekskompatibilitätsmodus, in dem sie resolv.confdie Konfigurationsdatei für die BIND C-Clientbibliothek des ISC lesen .

Das NSS ist darüber geschichtet und wird von konfiguriert nsswitch.conf. Eines der Dinge, die NSS-Lookups intern aufrufen können, ist der DNS-Client. Er nsswitch.confwird vom NSS-Code in der C-Bibliothek gelesen, um zu bestimmen, ob und wo Lookups an den DNS-Client übergeben werden und wie mit den verschiedenen Antworten umgegangen wird.

(Diese Idee wird durch das Name Services Cache Dæmon, nscd, leicht verkompliziert. Hierdurch wird jedoch lediglich ein zusätzlicher Client der oberen Ebene in die C-Bibliothek eingefügt, der ein eigenwilliges Protokoll für einen lokalen Server spricht, der seinerseits als Server fungiert Ein DNS-Client, der das DNS-Protokoll mit einem Proxy-DNS-Server spricht, systemd-resolvedfügt ähnliche Komplikationen hinzu.)

systemd-resolved, NetworkManager, connman, dhcpcd, resolvconf, Und andere Anpassung an unterschiedlichem Proxy - DNS - Server im laufenden Betrieb die BIND - DNS - Client - Konfigurationsdatei Schalter DNS - Clients zu sprechen. Dies ist für diese Antwort nicht möglich, zumal es auf dieser WWW-Site bereits zahlreiche Antworten gibt, die sich mit den byzantinischen Details befassen, die ein solcher Mechanismus mit sich bringt.

Die traditionellere Vorgehensweise in der Unix-Welt besteht darin, einen Proxy-DNS-Server entweder auf dem Computer selbst oder in einem LAN auszuführen. Daher das, was das FreeBSD-Handbuch über normal konfigurierte Systeme sagt, bei denen die Standardaktion der DNS-Clientbibliothek bei Nichtvorhandensein resolv.confmit derjenigen von Unix-Systemadministratoren übereinstimmt, bei denen es sich um einen Proxy-DNS-Server handelt, der 127.0.0.1 abhört. (Das FreeBSD-Handbuch für resolv.confist eigentlich doco, das ebenfalls von ISCs BIND stammt, und natürlich auch dort zu finden ist, wo die BIND-DNS- Clientbibliothek an anderen Stellen wie der GNU C-Bibliothek integriert wurde.)

Weitere Lektüre

JdeBP
quelle
7

In der weitaus besseren FreeBSD-Manpage 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.
rauben
quelle
1

Die Datei /etc/resolv.confwird von * libc-Aufrufen gelesen, die die Hostnamenauflösung durchführen. Dies ist in erster Linie getaddrinfound veraltet gethostbyname.

Wenn diesen Funktionen ein DNS-Name übergeben wird, führen sie diese Schritte in der folgenden Reihenfolge aus:

  1. Versuchen Sie, den Hostnamen lokal aufzulösen, dh durch Lesen /etc/hosts.
  2. Wenn dies fehlschlägt, fragen Sie die in aufgeführten DNS-Server ab /etc/resolv.conf.
  3. Wenn dies ebenfalls fehlschlägt, kann der Hostname nicht aufgelöst werden.

Da Sie dnsmasq erwähnen : Dies ist ein DNS-Server, der lokal ausgeführt wird. In vielen modernen Linux-Distributionen gibt es also /etc/resolv.confnur einen Hinweis 127.0.0.1(hier hört das lokale dnsmasq zu). dnsmasq ist dann so konfiguriert, dass die Abfragen von Internet-DNS-Servern weitergeleitet werden. dnsmasq wird von Network Manager beim Herstellen einer Verbindung zum Internet konfiguriert.

rexkogitans
quelle
Das sind keine Systemaufrufe, das sind * libc-Funktionen.
JoshuaRLi
@JoshuaRLi sicher, ich habe es bearbeitet.
Rexkogitans