Domain-Name-Service (DNS)Beim "Domain-Name-System"(oder kurz: DNS) handelt es sich um einenDienst, der zu einem Rechnernamen die zugehörige IP-Nummerliefert und umgekehrt. Das ist in etwa mit der Funktionsweiseeiner Telefonauskunft vergleichbar:Der Kunde ruft bei einer bestimmten Telefonnummer an und fragtnach der Rufnummer eines Teilnehmers. Nachdem er Name und Wohnortder gesuchten Person durchgegeben hat, erhält er als Antwort die gewünschteNummer aus einem Verzeichnis. Genauso läuft eine DNS-Abfrage ab.Gibt ein Benutzer in seinem Webbrowser zum Beispiel die Adressehttps://www.VereinGegenZuLangeDomainnamenEV.de ein, dann sorgt ein Teil der Netzwerk-Softwareauf seinem lokalen Rechner dafür, daß ein Name-Server nach der IP-Adressedes Rechners www.vereingegenzulangedomainnamenev.de gefragt wird.Dieser Softwareteil wird als Resolver bezeichnet und entspricht inobigem Beispiel dem Kunden, der die Auskunft anruft.Welche IP-Adresse dieser Server hat, muß dem Klientenrechner natürlich
bekannt sein, genauso wie der Kunde eine einzige Telefonnummer wissen muß,
nämlich die der Auskunft selbst.
Auf der Serverseite arbeitet eine Software, die als "Domain-Name-Server" oder kurz "Name-Server" bezeichnet wird und anhand einer Datenbank
("Zone-File") die passende IP-Nummer zum Rechnernamen liefert, oder
einen anderen Name-Server fragt, wenn die Adresse unbekannt ist.
DNS ist ein typisches Beispiel für einen Verzeichnisdienst. Seine Aufgaben sind:
- Strukturierung der Namen. (Domänen-Konzept)
- Zuteilung und Verwaltung von Namen.
- Auflösen von Namen (="Nachschlagen") in beide Richtungen (Name zu Adresse und Adresse zu Name)
- Zwischenspeichern von Adressen (Caching)
- Einteilung der Daten in hierarchische Ebenen
- Verteilung der Daten auf verschiedene Knoten
- Bereitstellung von Redundanz (Secondary-DNS, Caching-Only-Server)
Domänen-Konzept
In den Anfängen des ARPA-Nets, aus dem das Internet entstand, wurde die
Namensauflösung über eine einzige Datei erledigt. Jeder Rechner
kopierte sich Nachts per FTP diese Datei von einem Master-Server auf die
lokale Platte. Dieses Konzept funktioniert natürlich nur, solange die
Anzahl der Namen nicht groß ist. Die benötigte Bandbreite ist proportinal
zum Quadrat der beteiligten Rechner. (B ~ N2)
Als Relikt aus dieser Zeit kennt fast jedes Betriebssystem auch heute noch eine
Hosts-Datei, in der für kleine Netze Rechner/Nummern-Zuordnungen
abgelegt werden könen. (Bei Windows im Verzeichnis \WINDOWS\HOSTS,
bei Unix unter /etc/hosts, bei Novell unter
SYS:SYSTEM/ETC/HOSTS, etc.)
Die Syntax aller dieser Hosts-Dateien ist einfach. Für jeden Rechner gibt
es eine eigene Zeile mit dem Inhalt:
IP-Nummer Hostname Alias Alias ....
Zum Beispiel:
192.168.112.1 chef dumpfbacke
192.168.112.2 snow-white
192.168.112.3 Doc
192.168.112.4 Happy
192.168.112.5 Bashful
192.168.112.6 Sneezy
192.168.112.7 Sleepy
192.168.112.7 Grumpy
192.168.112.8 Dopey
Der Begriff Alias läßt sich dabei am besten durch "Spitzname"
(oder englisch Nickname) ersetzen; also ein weiterer Name für ein und den
selben Rechner.
Bei einer kleinen Menge von Rechnern ist die Namensverwaltung mit einer Datei noch
möglich; für einen so großen und ständig wechselnden Verbund wie
das Internet ist sie aber nicht geeignet. Hier ist eine dezentrale Verwaltung mit
einem eigens darauf abgestimmten Namensraum nötig.
Der Namensraum des DNS ist in sogenannte Domänen eingeteilt. Die Domänen sind
hierarchisch als Baum angeordnet,
Ausgehend von der Wurzel (=Root) des Baumes ist der Namensraum in sogenannte
"Toplevel-Domains" eingeteilt. Man unterscheidet dabei zwischen zwei verschiedenen
Klassen von Toplevel-Domänen: Den generischen und den länderspezifischen.
Toplevel-Domänen |
generisch |
.com (=commercial; kommerzielle Unternehmen)
.edu (=educational; Bildungsstätten wie Hochschulen und Institute)
.gov (=Government; Amerikanische Regierung)
.mil (=Military; amrikanisches Militär)
.net (=Network; Netzwerk-Provider)
.org (=Organisation; nicht-kommerzielle Organisationen)
|
länderspezifisch |
Jeweils ein Länderkürzel für jedes Land.
z.B.:
.de (=Deutschland)
.at (=Östereich)
.to (=Tonga)
.tv (=Tuvalu)
|
Unterhalb der Toplevel-Domänen folgen Subdomänen, die wiederum Domänen
enthalten könen und schliesslich, als Blatt des Baumes, ein einzelner Rechner.
Der Name www.netzmafia.de ist also so zu verstehen. In der Toplevel-Domäne
".de" ist die Subdomain "Netzmafia" bekannt. Innerhalb der Subdomain
"netzmafia" gibt es einen Rechner namens "www". Analog zu unserem
Beispiel mit der Telefonauskunft, ist mit "de" das Land, mit "netzmafia" der Ort und
die Straße und mit "www" der Name eines Teilnehmers bestimmt. Die komplette Adresse
eines Rechners in der beschriebenen Notation (z.B. (www.netzmafia.de) bezeichnet man
als FQDN (Full-Qualified-Domain-Name)
Organisation des DNS im Internet
Federführende Organistation ist ICANN (=Internet Corporation for Assigned
Names and Numbers , Adresse: http://www.icann.org ). Gründung 1998.
ICANN beauftragt die Verwalter der Zone "." (Wurzel des DNS-Baumes) mit 13 Servern.
A.ROOT-SERVERS.NET. 419849 IN A 198.41.0.4
B.ROOT-SERVERS.NET. 419849 IN A 128.9.0.107
C.ROOT-SERVERS.NET. 419849 IN A 192.33.4.12
D.ROOT-SERVERS.NET. 419849 IN A 128.8.10.90
E.ROOT-SERVERS.NET. 419849 IN A 192.203.230.10
F.ROOT-SERVERS.NET. 419849 IN A 192.5.5.241
G.ROOT-SERVERS.NET. 419849 IN A 192.112.36.4
H.ROOT-SERVERS.NET. 419849 IN A 128.63.2.53
I.ROOT-SERVERS.NET. 419849 IN A 192.36.148.17
J.ROOT-SERVERS.NET. 333980 IN A 198.41.0.10
K.ROOT-SERVERS.NET. 333980 IN A 193.0.14.129
L.ROOT-SERVERS.NET. 330784 IN A 198.32.64.12
M.ROOT-SERVERS.NET. 330784 IN A 202.12.27.33
Bis auf die Server I (Stockholm), K (London) und M (Tokio) stehen alle
Server in den USA.
Der Server A ist der primäre Server, alle anderen sind seine Secondaries.
Eine Liste dieser Root-Server muss jeder DNS-Server haben (Ausnahme: Cache-Only-Server).
Erzeugung der Liste mit dem Kommando:
dig @rs.internic.net . ns > root.servers
Die Namen, die im Internet verwendet werden müssen dabei einige Spezifikationen
erfüllen:
- Die Länge eines Namensteiles (Domänen- oder Rechnername) darf maximal
63 Zeichen betragen.
- Die Gesamtlänge des Full-Qualified-Domain-Names darf 255 Zeichen nicht
überschreiten.
- Nur Buchstaben, Ziffern und "-" sind in den Namen zugelassen. Dabei muss jeder
Name mit einem Buchstaben oder einer Ziffer beginnen und enden. ("3bla-fasel" ist
zulässig, "3bla-" aber nicht.)
- Zwischen Groß- und Kleinschreibung wird nicht unterschiedem.
Bei der Registrierung einer Domain unterhalb von ".de" gelten zusätzlich noch
folgende Regeln:
- Der Domainname muß mindestens 3 Zeichen haben. Insgesamt gibt es in ".de"
noch 4 Domains mit nur 2 Buchstaben, die aus Besitzstands-Gründen beibehalten werden.
- Wegen eines weit verbreiteten Fehlers in der Named-Server-Software sind Domains
mit den gleichen Namen wie Toplevel-Einträge verboten. (Also z.B.: "at.de") Das ist
in RFC 1535 näher beschrieben.
- KFZ-Kennzeichen können nicht registriert werden.
Ein wichtiger Bestandteil des DNS-Konzeptes ist die Aufteilung der benötigten Datenbank
auf viele verschiedene Rechner. Da das Gesamtsystem voll funktionsfähig bleiben
muß, auch wenn ein Server ausgefallen ist, wir die Datenhaltung mit Hilfe von
Zuständigkeiten gelöst: Zu jeder Domain gibt es mindestens einen zugehörigen
Server, der verantwortlich die darin enthaltenen Subdomains oder Rechner verwaltet, oder
die Verwaltung an einen weiteren Server weiterdelegiert. Am Stamm des DNS-Baumes sitzen
dazu die "Root-Server", die alle einträge ihrer jeweiligen Domain kennen.
Das heißt, daß der Root-Nameserver der Domäne ".de" einen Eintrag für
den Named-Server der Domain "netzmafia.de" besitzt. Dieser Server hat wieder eine Liste
der in "netzmafia.de" enthaltenen Rechner und Subdomains.
Die Frage eines Clients nach der IP-Nummern eines Rechners wird wie folgt abgewickelt:
- Der Client-Rechner "grumpy.zwerge.org" stellt die DNS-Anfrage nach
"wwww.netzmafia.de" an seinen
zuständigen DNS-Server. Dessen IP-Nummer muß dem Client bekannt sein.
- Kennt der Named-Server der Domain "zwerge.org" die Antwort nicht, so erkundigt
er sich beim Root-Servers von ".de" nach der Adresse des Name-Servers von
"netzmafia.de".
- Der Root-Server fragt den Named-Server der Domäne "netzmafia.de".
- Der DNS von "netzmafia.de" antwortet dem Root-DNS.
- Der Root-DNS gibt die Antwort an den DNS von "zwerge.org" weiter.
- Der DNS-Server von "zwerge.org" liefert die IP-Nummer an den anfragenden Client. Damit ist die DNS-Abfrage abgehandelt.
DNS-Typen
Man unterscheidet folgende DNS-Typen
- Cache-Only
- Besitzt keine eigenen Tabellen mit Rechnernamen (Zone-Files).
- Alle Anfragen werden an einen übergeordneten Server weitergegeben.
- Adressen werden zwischengespeichert.
- Zweck: Z.B. Entlastung einer Providerleitung
- Sehr einfach einzurichten.
- Secondary-DNS
- Besitzt eigene Tabellen, die er vom Primary-DNS kopiert.
- Die Tabellen können aber nicht verändert werden.
- Zweck: Lastteilung, Backup
- Einfach einzurichten.
- Primary-DNS
- Besitzt eigene Tabellen für eine oder mehrere Zonen.
- Tabellen können lokal verändert werden.
- Server ist "authoritative" für seine Zone.
- Relativ hoher Aufwand für Einrichtung und Pflege.
Aufbau der Dateien des DNS-Servers (ab BIND 8.x)
Aufbau der Zonendatei
Beispiel des Primary DNS "aella.serverzwerge.de":
; Zonendatei fuer die Domaene serverzwerge.de
;
$TTL 1D
@ in SOA aella.serverzwerge.de. dnsadmin.aella.serverzwerge.de. (
2002051505 ; Seriennummer
10800 ; Refresh : 3 Stunden
3600 ; Retry : 1 Stunde
604800 ; Expire : 1 Woche
86400) ; Min. TTL: 1 Tag
NS aella.serverzwerge.de.
MX 10 aella.serverzwerge.de.
MX 50 mail.irgendeinprovider.de.
aella A 10.23.200.100
snowwhite A 10.23.200.17
doc A 10.23.200.18
happy A 10.23.200.19
bashful A 10.23.200.20
sneezy A 10.23.200.21
sleepy A 10.23.200.22
grumpy A 10.23.200.23
dopey A 10.23.200.24
HINFO "Hexium 7.5" "Linux"
beispiel CNAME aella
Rückwärtsauflösung
Beispiel des Primary DNS "aella.serverzwerge.de":
; Reverse-Zonendatei fuer die Domaene serverzwerge.de
;
$TTL 1D
@ in SOA aella.serverzwerge.de. dnsadmin.aella.serverzwerge.de. (
2002051602 ; Seriennummer
10800 ; Refresh : 3 Stunden
3600 ; Retry : 1 Stunde
604800 ; Expire : 1 Woche
86400) ; Min. TTL: 1 Tag
NS aella.serverzwerge.de.
100 PTR aella.serverzwerge.de.
17 PTR snowwhite.serverzwerge.de.
18 PTR doc.serverzwerge.de.
19 PTR happy.serverzwerge.de.
20 PTR bashful.serverzwerge.de.
21 PTR sneezy.serverzwerge.de.
22 PTR sleepy.serverzwerge.de.
23 PTR grumpy.serverzwerge.de.
24 PTR dopey.serverzwerge.de.
Beispiel eines Cache-Only-Servers
Datei "/etc/named.conf":
// Beispiel fuer einen Cache-Only-Server
//
options { // Arbeitsverzeichnis fuer die DNS-Daten
directory "/var/named";
forward only; // nur weiterleiten, keinen Server selbst fragen
forwarders { // Anfragen nur ueber diesen Server
10.23.200.100;
};
};
zone "." in {
type hint;
file "root.hint"; // Tabelle mit den Root-Servern
};
zone "localhost" in {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" in { // fuer Reversed-Loopback
type master;
file "127.0.0.rev";
};
Start des Servers über "/etc/rc.d/named start". Bei
SusE-Distributionen bis einschließlich 7.3 muß vor dem Start
in der Datei "/etc/rc.config" die Variable "START_NAMED="yes"
gesetzt werden.
Kontrolle des Server-Starts dann mit:
root@schrottsocke:/etc # tail -f /var/log/messages
Jun 3 21:20:09 n6-lbs named[2037]: starting (/etc/named.conf). named
8.2.4-REL Thu Sep 20 04:20:40 GMT 2001 root@knox:/usr/src/packages/
BUILD/bind8-8.2.4/bin/named
Jun 3 21:20:09 n6-lbs named[2037]: hint zone "" (IN) loaded (serial 0)
Jun 3 21:20:09 n6-lbs named[2037]: master zone "localhost" (IN) loaded
(serial 42)
Jun 3 21:20:09 n6-lbs named[2037]: master zone "0.0.127.in-addr.arpa" (IN)
loaded (serial 42)
Jun 3 21:20:09 n6-lbs named[2037]: listening on [127.0.0.1].53 (lo)
Jun 3 21:20:09 n6-lbs named[2037]: listening on [10.23.200.22].53 (eth0)
Jun 3 21:20:09 n6-lbs named[2037]: Forwarding source address is [0.0.0.0].32768
Jun 3 21:20:09 n6-lbs named[2038]: group = named
Jun 3 21:20:09 n6-lbs named[2038]: user = named
Jun 3 21:20:09 n6-lbs named[2038]: Ready to answer queries.
Beispiel eines Secondary-Servers
Datei "/etc/named.conf":
// Beispiel: Secondary DNS fuer die Domain serverzwerge.de
//
// Access-Control-List fuer internes Netz definieren
acl intern {
10.23.0.0/16; // alle Rechner im Netz 10.23.0.0
};
options { // Arbeitsverzeichnis fuer die DNS-Daten
directory "/var/named";
forwarders { // Anfragen nur ueber diesen Server
10.23.200.100;
};
allow-transfer {
intern; // Zonen-Transfer vom internen Netz
};
};
zone "." in {
type hint;
file "root.servers"; // Tabelle mit den Root-Servern
};
zone "0.0.127.in-addr.arpa" in { // fuer Reversed-Loopback
type master;
file "127.0.0.rev";
};
zone "serverzwerge.de" in { // Domaene serverzwerge.de, vorwaerts aufgeloest
type slave; // sekundaerer Server
file "serverzwerge.zone"; // Name der Tabelle
masters {
10.23.200.100; // IP-Adr. primaerer Server
};
};
zone "200.23.10.in-addr.arpa" in { // Domaene serverzwerge.de rueckwaerts
type slave; // sekundaerer Server
file "10.23.200.rev"; // Name der Tabelle
masters {
10.23.200.100; // IP-Adr. primaerer Server
};
};
Start des Servers über "/etc/rc.d/named start".
Bei SusE-Distributionen bis einschließlich 7.3 muß vor dem Start
in der Datei "/etc/rc.config" die Variable "START_NAMED="yes"
gesetzt werden.
Kontrolle des Server-Starts dann mit:
root@schrottsocke:/etc # tail -f /var/log/messages
Jun 3 21:58:50 n6-lbs named[2187]: starting (/etc/named.conf). named
8.2.4-REL Thu Sep 20 04:20:40 GMT 2001 root@knox:/usr/src/packages
/BUILD/bind8-8.2.4/bin/named
Jun 3 21:58:50 n6-lbs named[2187]: hint zone "" (IN) loaded (serial 0)
Jun 3 21:58:50 n6-lbs named[2187]: master zone "0.0.127.in-addr.arpa" (IN)
loaded (serial 42)
Jun 3 21:58:50 n6-lbs named[2187]: slave zone "serverzwerge.de" (IN) loaded
(serial 2002051505)
Jun 3 21:58:50 n6-lbs named[2187]: slave zone "200.23.10.in-addr.arpa" (IN)
loaded (serial 2002051602)
Jun 3 21:58:50 n6-lbs named[2187]: listening on [127.0.0.1].53 (lo)
Jun 3 21:58:50 n6-lbs named[2187]: listening on [10.23.200.22].53 (eth0)
Jun 3 21:58:50 n6-lbs named[2187]: Forwarding source address is [0.0.0.0].32768
Jun 3 21:58:50 n6-lbs named[2188]: group = named
Jun 3 21:58:50 n6-lbs named[2188]: user = named
Jun 3 21:58:50 n6-lbs named[2188]: Ready to answer queries.
DNS-Tools
nslookup
Syntax: nslookup [-option ... ] [host-to-find] [-server]
Zum Beispiel:
root@schrottsocke#nslookup www.netzmafia.de -10.23.200.100
Server: 10.23.200.100
Address: 10.23.64.1
Non-authoritative answer:
Name: www.netzmafia.de
Address: 141.39.253.210
Ruft man nslookup ohne Parameter auf, schaltet das Programm
in den interaktiven Modus. Um alle Rechner der Domäne serverzwerge.de
anzuzeigen, gibt man der Reihe nach folgendes ein:
nslookup
>set q=any
>server 10.23.200.100
>ls -d serverzwerge.de.
dig und host
Syntax: host [-l] [-v] [-w] [-r] [-d] [-t querytype] [-a] host [server]
Zum Beispiel wollen wir alle Rechner in der Domäne serverzwerge.de
vom DNS-Server 10.23.200.100 holen:
host -al serverzwerge.de. 10.23.200.100
Syntax: dig [@server] domain [] [] [+] [-] [%comment]
Tabelle aller Root-Name-Server in die Datei root.servers schreiben:
dig ors.internic.net . ns»> root.server-s
DNS-Abfragen in Perl
Das erste Script zeigt, wie mit der Funktion gethostbyname der Name-Service
abgefragt wird. Die Funktion liefert im Listen-Kontext etliche Elemente zurück,
von uns die letzten interessieren: Das Array @addrs mit den im Binärformat
vorliegenden IP-Adressen, die nur noch ausgepackt werden müssen.
#!/usr/bin/perl -w
my $host = $ARGV[0] || die "usage: $0 hostname";
my ($name, $aliases, $addrtype, $length, @addrs) =
gethostbyname($host);
foreach $i (@addrs)
{
my ($a, $b, $c, $d) = unpack('C4', $i);
print "$a.$b.$c.$d\n";
}
Reverse Lookup
Manchmal kommt es vor, daß zwar die IP-Adresse eines Servers vorliegt,
zu der man den Namen sucht. Nachdem im Internet für ordnungsgemäß
registrierte Server auch reverse-DNS-Einträge existieren, ist das kein Problem.
Den Namen eines Rechners, dessen IP-Adresse gegeben ist, ermittelt das folgende Script.
Die Perl-Funktion gethostbyaddr erwartet die umzuwandelnde IP-Adresse in einer
C-Struktur, welche die Funktion inet_aton aus dem Socket-Modul
erzeugt. Als zweiten Parameter wird wieder das AF_INET-Makro verwendet.
#!/usr/bin/perl -w
use Socket;
$ip_string = $ARGV[0] || die "usage: $0 ipaddr";
$ip = inet_aton($ip_string);
$host = (gethostbyaddr($ip, AF_INET))[0];
print $host, "\n";
MX-Records
Das dritte Listing zeigt, wie man den MX-Record eines Eintrags in der DNS-Datenbank
anzapft. Das auf dem CPAN erhältliche Modul Net::DNS von
Michael Fuhr vereinfacht den Zugriff. Es arbeitet dabei mit Resolver-Objekten vom Typ
Net::DNS::Resolver, die Anfragen an DNS-Server stellen
und Antworten liefern. Im Programm löst der Aufruf der mx-Funktion, die
ein Resolver-Objekt und den Domain-Namen als Parameter erwartet, eine DNS-Anfrage aus.
mx liefert eine Liste von Objekten vom Typ Net::DNS::RR zurück,
deren Inhalte sich mit den Methoden preference (Prioritäts-Wert) und
exchange (Mail-Vermittlungsrechner) ermitteln lassen. Bei auftretenden
Fehlern ist die zurückgegebene Liste @mx leer.
#!/usr/bin/perl -w
use Net::DNS;
my $domain = $ARGV[0] || die "usage: $0 domain";
my $resolver = new Net::DNS::Resolver;
# MX-Record abfragen
my @mxrecs = mx($resolver, $domain);
if (@mxrecs)
{
# Gefunden!
foreach $rec (@mxrecs)
{
print $rec->preference, " ",
$rec->exchange, "\n";
}
}
else
{
# Leere Liste, Fehler!
print "Kein MX-Record für $domain: ",
$resolver->errorstring, "\n";
}
|