Kaum jemand denkt darüber nach, doch wer eine URL im Browser abschickt, setzt eine Maschinerie in Gang, an der sich in derselben Sekunde oft weltweit Rechner beteiligen – allein schon für die Übersetzung des Hostnamens in eine maschinenlesbare Adresse via DNS.
Mehr als 300 vorgelesene Zahlen merken sich Gedächtniskünstler – allen andren aber fällt es leider oft schon schwer, die vier Zahlen einer IP-Adresse im Kopf zu behalten, an Namen erinnern sich die meisten leichter. Nur deshalb gibt es heute eine riesengroße, weltweit verteilte Datenbank, die Computernamen und -adressen kombiniert.
Die Schnittstelle zu dieser Datenbank, häufig als Resolver bezeichnet, (to resolve, auflösen, klären) bilden Funktionen der GNU-C-Library Glibc. Die am meisten benutzten heißen »gethostbyname()« für die Übersetzung eines Namens in eine IP-Adresse und »gethostbyaddr()« für den umgekehrten Weg. Mit ihren Begleitfunktionen wird diese Schnittstelle allerdings zusehends ersetzt durch eine flexiblere Version. Aktuell sind »getaddrinfo()« für die Übersetzung von Hostnamen in Adressen und »getnameinfo()« für die Gegenrichtung die bessere Wahl.
Die meisten Skriptsprachen enthalten ebenfalls entsprechende Funktionen. Perl beispielsweise bietet »gethostbyname()« und »gethostbyaddr()« an. Die neueren Funktionsvarianten sind noch nicht in jeder Implementation verfügbar, bei Perl stecken sie in einem Modul für die Kompatibilität mit IPv6. Auf Shell-Ebene stehen fertige Tools zur Verfügung, die einzelne Resolver-Funktionen anbieten. Dafür in Frage kommen beispielsweise das inzwischen allerdings veraltete »nslookup« oder das neuere »host« sowie »dig«.
Den Umgang mit Namen und Adressen erschwert die Tatsache, dass nicht alle Programme auf die Bibliotheksfunktionen zurückgreifen, sondern manche ihr eigenes Süppchen kochen. Meist möchten die Programmierer so Blockade-Effekte vermeiden, die sich beim Einsatz der Glibc-Funktionen ergeben könnten. Etliche Shell-Tools entstanden als Debugging-Werkzeuge und arbeiten deshalb mit Direktzugriff auf das Netzwerk. Zudem sind viele kleine Programme statisch übersetzt, enthalten also die Resolver-Routinen einer ganz bestimmten (häufig veralteten) Bibliotheksversion.
Einstellungssache
Der Resolver kann verschiedene Datenquellen anzapfen. Die einfachste Datenquelle ist die Datei »/etc/hosts« (siehe Listing 1). Sie enthält lediglich eine Auflistung von numerischen Adressen mit den zugeordneten Namen. Jeder Adresse können ein oder mehrere Namen entsprechen.
Das Listing zeigt noch weitere Arten von Einträgen: Der »localhost« 127.0.0.1 wird immer in »/etc/hosts« definiert, da ihn auch die lokale Interprozess-Kommunikation benötigt. Der zweite Adressblock enthält wichtige IPv6-Adressen. Der dritte Block zeigt, wie Adressen aus einem lokalen Netz ebenfalls in der lokalen Datenbank abzulegen oder Domainnamen außerhalb des eigenen Verantwortungsbereichs unkompliziert zu ergänzen sind.
Auskunft im Netz
Ist ein Hostname in »/etc/hosts« nicht zu finden, fragt der Resolver bei einem netzwerkbasierten Dienst an, dem Domain Name System (DNS). In den meisten Fällen läuft ein solcher Nameserver – die verbreitetste Implementierung ist heute BIND (Berkeley Internet Name Domain) – nicht lokal, sondern auf einem Host des Internet. Die passenden Nameserver-Adressen dafür findet der Client in der Datei »/etc/resolv.conf« (siehe Listing 2), in der sie entweder der Anwender oder ein Dienst wie der DHCP-Client eingetragen hat.
Normalerweise sind drei Nameserver-Einträge erlaubt, wobei der Resolver die Alternativen an zweiter und dritter Stelle nur benutzt, wenn der als Erster eingetragene Server nicht erreichbar ist. Die Zeile »options rotate« in Listing 2 ändert dieses Verhalten in einem LAN, sodass die Clients die einzelnen Server abwechselnd in Anspruch nehmen und sich die Last zwischen ihnen verteilt.
Der Resolver muss wissen, welche Datenquellen dem jeweiligen Linux-System zur Verfügung stehen und in welcher Reihenfolge er sie benutzen soll. Diese Information ist gleich in mehreren Konfigurationsdateien verzeichnet. Die ursprüngliche Datei für diesen Zweck heißt »/etc/host.conf«. Ein Beispiel könnte so aussehen:
order hosts,bind multi on
Wichtigstes Schlüsselwort ist »order« gefolgt von der oder den gewünschten Methoden. Dabei stehen »hosts« für das lokale Adressenverzeichnis in »/etc/hosts« und »bind« für den Netzwerkzugriff auf das DNS-System. Das hier eingetragene »multi on« bewirkt nur, dass in »/etc/hosts« Mehrfachnennungen eines Namens erlaubt sind.
Quellenangaben
Die Einträge im Beispiel führen dazu, dass der Resolver zunächst in »/etc/hosts« nachsieht, ob er dort den gesuchten Namen beziehungsweise die gesuchte Adresse findet. Nur wenn die Suche ergebnislos bleibt, wird als Nächster der DNS-Dienst benutzt, wie er in »/etc/resolv.conf« konfiguriert ist. »host.conf« entstammt noch der Zeit vor Glibc 2.x, entspricht also Libc.so.5 und früher. Neuere Versionen der Glibc haben den Name Service Switch von Solaris 2 übernommen und erlauben eine flexible Konfiguration beliebiger Lookup-Dienste in freier Reihenfolge.
Der Name Service Switch wird über die »/etc/nsswitch.conf« konfiguriert (Listing 3). Die Datei enthält eine Auflistung von Diensten und Datenquellen sowie jeweils eine Beschreibung des gewünschten Vorgehens. Für die Auflösung von Hostnamen ist der Dienst »hosts« relevant, wobei die hier vorgegebene Strategie »files dns« der Voreinstellung entspricht. Damit ist festgelegt, dass der Resolver zunächst in der Datei »/etc/hosts« nachschlägt und erst anschließend eine Anfrage ans DNS stellt.
Es gibt noch weitere Konfigurationsdateien. Sendmail ist beispielsweise eines der Programme mit eigener Resolver-Bibliothek. Der Admin konfiguriert sie ähnlich, aber nicht identisch zum Service Switch von Glibc. Die zugehörige private Konfigurationsdatei heißt »/etc/mail/service.switch«. Sie kümmert sich nur um die Dienste »passwd«, »hosts« und »aliases«, wobei für Sendmail kein Doppelpunkt nach dem Dienstnamen steht. Sonst funktioniert »/etc/mail/service.switch« ganz analog zu »/etc/nsswitch.conf«.
In bestimmten Fällen sind Anfragen übers Netzwerk unerwünscht. Wenn beispielsweise die Einwahl über Modem oder DSL mit Zeittarif erfolgt, spart es bares Geld, unnötige DNS-Abfragen zu vermeiden. Auch aus Sicherheitsgründen können Netzwerkkontakte nicht erwünscht sein.
|
Listing 1: |
|---|
01 127.0.0.1 localhost.localdomain localhost ishi 02 03 # The following lines are desirable for IPv6 capable hosts 04 ::1 localhost.localdomain localhost ip6-localhost ip6-loopback 05 fe00::0 ip6-localnet 06 ff00::0 ip6-mcastprefix 07 ff02::1 ip6-allnodes 08 ff02::2 ip6-allrouters 09 ff02::3 ip6-allhosts 10 11 172.16.45.1 natrouter 12 216.92.94.3 sedacon.pair.com |
|
Listing 2: |
|---|
01 nameserver 172.16.45.2 02 nameserver 172.16.45.3 03 options rotate |
|
Listing 3: Beispiel für |
|---|
01 passwd: compat 02 group: compat 03 shadow: compat 04 05 hosts: files dns 06 networks: files |
Ohne Netz
Löscht der Admin »bind« aus »/etc/host.conf« und »dns« aus »/etc/nsswitch.conf«, unterbindet er die Netzwerkzugriffe des Glibc-Resolvers. Ein Nameserver im LAN ließe sich dann allerdings auch nicht mehr erreichen.
Sollen vertrauliche Arbeiten durch einen Tunnel – etwa ein VPN -, so müssen DNS-Abfragen vermieden oder ebenfalls über den Tunnel geleitet werden. Hier reicht es oft aus, den Empfang und Versand von E-Mail über IP-Adressen zu konfigurieren oder die entsprechenden Domainnamen einfach in »/etc/hosts« aufzunehmen. Es bleibt dann nur der Browser als häufigste Quelle von DNS-Anfragen.
Ein Socks-4a-Proxy wie beispielsweise Privoxy leistet dann gute Dienste, weil er den DNS-Lookup auf die andere Tunnelseite umzulenken vermag. Wenn keine DNS-Abfragen ins Internet erwünscht sind, ist es angesichts der Vielfalt der verwendeten Resolver am sichersten, durch zusätzliche Firewall-Regeln solche DNS-Abfragen zu unterbinden.
Im Gleichschritt
Auf die sinngemäße Übereinstimmung der einzelnen Konfigurationsdateien muss der Admin selber achten. Wenn beispielsweise »host.conf« nur auf »/etc/hosts« verweist, »nsswitch.conf« aber auch das DNS referenziert, hätten ältere Programme mit eigenem Resolver sowie alte statisch übersetzte Programme Probleme damit, einzelne Adressen zu finden. Modernere Software funktioniert dagegen anstandslos. Fehlt »nsswitch.conf«, verwendet die Glibc übrigens Defaultwerte für die Abfragereihenfolge der Datenquellen.

Abbildung 2: So funktioniert die Namensauflösung in einem Beispiel: 1 Der Resolver-Client richtet sich mit der Anfrage nach einer Adresse an den Nameserver A, der jedoch für die betroffene Domäne weder zuständig ist noch das Ergebnis gecacht hat. Trotzdem übernimmt er die weiteren Schritte (rekursive Abfrage) und wendet sich an Nameserver B 2, der seinerseits mit einem Verweis auf den Server-Kollegen C antwortet 3. A befragt C 4, der verweist auf D 5. Eine Anfrage dort 6 ergibt schließlich die gesuchte Adresse 7 , die Nameserver A nun an den Client zurückgebe
Unterschiede im Detail
Alle hier gezeigten Mechanismen sind mehr oder weniger implementationsspezifisch. Zwar enthält grundsätzlich jedes Unix Resolver der hier vorgesellten Art, die Details der Implementierung unterscheiden sich aber: Beispielsweise benutzt BSD ein anderes Format für »host.conf«, die Servicenamen in »nsswitch.conf« unterscheiden sich von Unix zu Unix und Solaris enthält mit »/etc/netconfig« eine Methode, den Service Switch durch eine private Bibliothek zu ersetzen. (jcb)
|
Infos |
|---|
|
[1] Internet Systems Consortium, BIND: [http://www.isc.org/index.pl?/sw/bind/] [2] DNS-Konzepte / RFC 1034: [http://www.faqs.org/rfcs/rfc1034.html] [3] DNS- Implementationsdetails / RFC 1035: [http://www.faqs.org/rfcs/rfc1034.html] [4] S. Lichtenauer, “Gelbe Seiten”: Linux-Magazin 06/00: [https://www.linux-magazin.de/ Artikel/ausgabe/2000/06/DNS/dns.html] |






