Wie arbeiten / etc / hosts und DNS zusammen, um Hostnamen in IP-Adressen aufzulösen?

10

Wie arbeiten /etc/hostsDNS unter Linux zusammen, um Hostnamen in IP-Adressen aufzulösen?

  1. Wenn ein Hostname in aufgelöst werden kann /etc/hosts, wird DNS danach angewendet /etc/hosts , um den Hostnamen aufzulösen, oder wird die aufgelöste IP-Adresse /etc/hostsals "Hostname" behandelt, um sie rekursiv aufzulösen?
  2. In meinem Browser (Firefox und Google Chrome), wenn ich hinzufüge zu /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    Wenn Sie www.google.com in die Adressleiste des Browsers eingeben und die Eingabetaste drücken, wird keine Verbindung zur Website hergestellt. Nachdem ich diese Zeile entfernt habe /etc/hosts, kann ich eine Verbindung zur Website herstellen. Bedeutet dies, dass /etc/hostsDNS zum Auflösen von Hostnamen überschrieben wird?

    Nachdem ich die Zeile erneut hinzugefügt habe /etc/hosts, kann ich auch nach dem Aktualisieren der Webseite eine Verbindung zur Website herstellen. Warum /etc/hostsbewerben Sie sich nicht erneut, damit ich keine Verbindung zur Website herstellen kann?

Vielen Dank.

Tim
quelle
9
Beachten Sie, dass viele Webbrowser ihre eigenen DNS-Server und ihren eigenen DNS-Cache implementieren und keine auf dem System konfigurierten Mechanismen zur Namenssuche konsultieren. Mit anderen Worten, einige Webbrowser ignorieren /etc/hostsdie lokal definierten Nameserver vollständig . Es ist ziemlich verwirrend, das erste Mal Zeuge zu werden. (Sieh dich an, Chromium-basierte Browser!)
Christopher
@ Christopher Ich kam hierher, um dasselbe zu sagen. Verwandte unix.stackexchange.com/questions/363498/…
Rui F Ribeiro
@Christopher Nachdem ich die Zeile erneut zu / etc / hosts hinzugefügt habe, kann ich auch nach dem Aktualisieren der Webseite eine Verbindung zur Website herstellen. Warum werden / etc / hosts nicht erneut angewendet, sodass ich keine Verbindung zur Website herstellen kann? Liegt es am DNS-Cache von Firefox?
Tim
@RuiFRibeiro Dieser Chromium-Build scheint die systemdefinierten /etc/hostsDNS-Server zu respektieren : ( github.com/Eloston/ungoogled-chromium ). Installation unter macOS mit Homebrew : brew cask install eloston-chromium.
Christopher

Antworten:

21

Dies wird durch die NSS (Name Service Switch) Konfiguration dh diktierte /etc/nsswitch.confDatei - hostsRichtlinie. Zum Beispiel auf meinem System:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Hier filesbezieht sich auf die /etc/hostsDatei und dnsauf das DNS-System. Und wie Sie sich vorstellen können, gewinnt jeder, der zuerst kommt .

Sehen Sie sich auch man 5 nsswitch.confan, um mehr darüber zu erfahren.


Als Nebenwirkung , die NSS - Host Auflösung Reihenfolgen , die Verwendung zu folgen getentmit hostsals Datenbank zB:

getent hosts example.com
heemayl
quelle
Vielen Dank. Liegt es in meinem Teil 2 daran, dass der DNS-Server meines Webbrowsers nicht funktioniert, der DNS-Cache des Webbrowsers jedoch?
Tim
Wie wirkt sich das systemd.resolverauf Auflösungen aus? Wo passen NIS und LDAP in das Auflösungssystem? Welche Reihenfolge folgt einem MacOS-System oder einem Windows-System?.
Isaac
@Tim Ja, Ihr Browser ruft die Daten aus dem Cache ab.
Heemayl
7

Um nur Ihre letzte Frage zu beantworten: /etc/hostsWird nicht sofort erneut angewendet, da firefoxder zuletzt gespeicherte Hostname zwischengespeichert wird google.com. wenn Sie es wollen immer wieder holen, werden Sie setzen müssen , network.dnsCacheExpirationum 0in about:config. Weitere Infos (wenn auch etwas veraltet) hier . Entschuldigung, wenn dies offtopic ist.


Als Nebenbemerkung verwenden viele Programme nicht den Standard-Resolver ( getaddrinfo(3), getnameinfo(3)[1]), weil er scheiße ist .

Erstens ist die Schnittstelle nicht asynchron. Jedes mäßig komplexe Programm muss einen separaten Thread erzeugen, der genau das tut, getaddrinfo()und dann sein eigenes Protokoll erfinden, um mit ihm zu kommunizieren (und nicht einmal eingehen getaddrinfo_a(), das nach Abschluss ein Signal sendet , also ist es noch schlimmer).

Zweitens ist die Resolver-Implementierung in glibc(der Standard-C-Bibliothek unter Linux) schrecklich. Sie erwartet, dass Sie zufällige dynamische Objekte über dlopen()Ihren Rücken in den Adressraum ziehen und es unmöglich machen, sie in irgendeiner Weise zu enthalten oder statisch zu verwenden verknüpfte ausführbare Dateien.

Da viele Programme nicht direkt die Standard - Resolver verwenden, auch stören sie nicht ihr Verhalten genau zu replizieren, und einige oder alle ignorieren /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confoder /etc/gai.conf.

[1] und erwähne nicht einmal den nicht wiedereintretenden ipv4-only gethostbyname(), der seit Ewigkeiten veraltet war.

Onkel Billy
quelle
Vielen Dank. Was meinst du mit "nicht wiedereintrittsfähig"?
Tim
1
Es bedeutet, dass Sie, wenn Sie eine machen google = GHBN("google.com"); facebook = GHBN("facebook.com"), möglicherweise beides haben googleund facebookdie Adresse von enthalten facebook.com. Wenn die beiden Anrufe in unterschiedlichen Threads getätigt werden, ist es noch lustiger: Sie können mit einer Adresse enden, die halb Google und halb Facebook oder kompletter Müll ist.
Onkel Billy
Was hat gethostbyname()jetzt ersetzt ?
Tim
1
getaddrinfoist die Standardfunktion dafür, ist aber selbst brokrn, wie ich bereits erklärt habe, so dass es nicht wie von Browsern oder anderen realen Apps verwendet wird.
Onkel Billy
In der Tat verwenden Firefox und Chrome beispielsweise ihre eigenen Auflösungen. Vielen Dank für die aufschlussreichen Notizen.
Rui F Ribeiro
6

Die Datei /etc/hostsund der DNS arbeiten nicht zusammen. Sie bieten unabhängige Auflösungen von Namen (Netzwerknamen).

Der Kleber, der sie verbindet, befindet sich in /etc/nsswitch.confLinux-Systemen . In /etc/netsvc.conffür AIX-Server, im System für Windows und könnte in MacOS-Systemen mit lookupd -configuration(Suche nach LookupOrder, ähnlich wie :) aufgelistet Cache FF DNS NI DSwerden.

Die tatsächliche Reihenfolge wird komplex und normalerweise kompliziert, da jeder Namensauflösungsdienst in andere Auflösungsebenen schauen kann (und dies oft auch tut). Like dnsmasq(ein leichter DNS-Server im Allgemeinen bei 127.0.0.1:53oder ::1:53(oder beides)) liest und enthält normalerweise den /etc/hostsDateiinhalt. Oder like systemd.resolver(ein grundlegender Resolver, der nur nicht gepunktete Namen wie auflösen sollte mycomputer) ruft mycomputer.here.dev.unter bestimmten Bedingungen direkt DNS-Auflösungen für gepunktete Namen ( ) auf.

Im Allgemeinen werden Dienste der Reihe nach aufgerufen, und der erste, der nicht fehlschlägt, gewinnt und wird als korrekte Adresse akzeptiert. Die allgemeine Grundreihenfolge lautet: /etc/hosts(Datei), mDNS (nicht gepunktete Namen), DNS, NIS, NIS +, LDAP. In einigen Linux-Systemen gibt es eine letzte Lösung für den Computer hostnameim Dienstmyhostname

Zum Beispiel in diesem System (von cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Beachten Sie, dass der sehr alte orderEintrag (glibc 2.4 und früher) wie folgt festgelegt wurde/etc/host.conf :

order hosts,bind,nis

Gilt nur für den Dateinamensdienst /etc/hosts.

Die Auswirkungen auf diesen (Linux-) Client-Computer in Bezug auf NIS und LDAP werden (normalerweise) vom verwendeten DNS-Server (Binden, Ungebunden usw.) gesteuert.

so:

  1. Wenn ein Hostname in / etc / hosts aufgelöst werden kann, wird DNS nach / etc / hosts angewendet, um den Hostnamen aufzulösen, oder wird die aufgelöste IP-Adresse von / etc / hosts als "Hostname" behandelt, um sie rekursiv aufzulösen?

Keiner.

Wenn ein Hostname in aufgelöst werden kann /etc/hosts, DNSgilt dies nicht (wenn sich Dateien vor DNS befinden).

noch ist die aufgelöste IP - Adresse als „Host - Name“ behandelt.

Es ist einfach: die aufgelöste Adresse.

Browser

Ein Browser kann eine beliebige Methode verwenden, um einen Namen aufzulösen (nachdem er seinen Cache mit aufgelösten Namen überprüft hat). Nur wenn eine vom System bereitgestellte Methode verwendet wird, gilt die oben angegebene Reihenfolge. Der Browser kann wie jedes Programm jeden DNS-Server direkt kontaktieren.

Wenn das System hat , um /etc/hostsvor DNS, bedeutet dies , dass ein Eintrag in dieser Datei Vorrang nehmen DNSAuflösung Service.

So:

  1. ... Bedeutet dies, dass / etc / hosts DNS zum Auflösen von Hostnamen überschreibt?

Ja (wenn der Browser die vom System bereitgestellte Auflösung verwendet).

Warum /etc/hostsbewerben Sie sich nicht erneut, damit ich keine Verbindung zur Website herstellen kann?

Nur bis der interne Cache des Browsers für diesen bestimmten Namen gelöscht wird (oder eine Zeitüberschreitung auftritt), wird dieser Name erneut außerhalb des Browsers gesucht.

Wenn der Name des Browsers im Cache aufgelöst ist, verwendet der Browser ihn erneut.

Verwenden Sie diese Option, um den Cache zu leeren .

Oder schließen Sie einfach (warten Sie eine Weile) und starten Sie den Browser neu.

Isaac
quelle