23.6. DNS - Domain Name Service

Beigetragen von Chern Lee.

23.6.1. Überblick

DNS ist das für die Umwandlung von Rechnernamen in IP-Adressen zuständige Protokoll. FreeBSD verwendet dazu BIND (Berkeley Internet Name Domain), die am häufigsten verwendete Implementierung von DNS. Eine Anfrage nach www.FreeBSD.org gibt die IP-Adresse des FreeBSD-Webservers, eine Anfrage nach ftp.FreeBSD.org die IP-Adresse des entsprechenden FTP-Servers zurück. Der umgekehrte Weg ist ebenso möglich, eine IP-Adresse kann also auch in ihren Rechnernamen aufgelöst werden. Um eine DNS-Abfrage durchzuführen, muss auf dem jeweiligen Rechner kein Nameserver installiert sein.

Im Internet wird DNS durch ein komplexes System von autoritativen Root-Nameservern sowie anderen kleineren Nameservern verwaltet, die individuelle Rechnerinformationen speichern und untereinander abgleichen.

Dieses Dokument beschreibt die unter FreeBSD verwendete stabile Version BIND 8.x. BIND 9.x kann über den Port net/bind9 installiert werden.

Das DNS-Protokoll wird in den RFCs 1034 und 1035 beschrieben.

Derzeit wird BIND vom Internet Software Consortium (http://www.isc.org/) verwaltet.

23.6.2. Begriffsbestimmungen

Um dieses Dokument besser verstehen zu können, müssen einige DNS-spezifische Begriffe genauer definiert werden.

Begriff Bedeutung
Forward-DNS Rechnernamen in IP-Adressen umwandeln
Origin (Ursprung) Die in einer bestimmten Zonendatei beschriebene Domäne.
named, BIND, Nameserver Gebräuchliche Namen für das unter FreeBSD verwendete BIND-Nameserverpaket
Resolver Ein Systemprozess, durch den ein Rechner Zoneninformationen von einem Nameserver anfordert.
Reverse-DNS Das Gegenteil von Forward-DNS; die Umwandlung von IP-Adressen in Rechnernamen
Root-Zone Der Beginn der Internet-Zonenhierarchie. Alle Zonen befinden sich innerhalb der Root-Zone. Dies ist analog zu einem Dateisystem, in dem sich alle Dateien und Verzeichnisse innerhalb des Wurzelverzeichnisses befinden.
Zone Eine individuelle Domäne, Unterdomäne, oder ein Teil von DNS, der von der gleichen Autorität verwaltet wird.

Es folgen nun einige Zonenbeispiele:

Wie man an diesen Beispielen erkennen kann, befindet sich der spezifischere Teil eines Rechnernamens auf der linken Seite der Adresse. example.org. beschreibt einen Rechner also genauer als org., während org. genauer als die Root-Zone ist. Jeder Teil des Rechnernamens hat Ähnlichkeiten mit einem Dateisystem, in dem etwa /dev dem Wurzelverzeichnis untergeordnet ist.

23.6.3. Gründe für die Verwendung eines Nameservers

Es gibt zwei Arten von Nameservern: Autoritative Nameserver sowie zwischenspeichernde (cachende) Nameserver.

Ein autoritativer Nameserver ist notwendig, wenn

Ein cachender Nameserver ist notwendig, weil

Wird nach www.FreeBSD.org gesucht, leitet der Resolver diese Anfrage an den Nameserver des ISPs weiter und nimmt danach das Ergebnis der Abfrage entgegen. Existiert ein lokaler, zwischenspeichernder DNS-Server, muss dieser die Anfrage nur einmal nach außen weitergeben. Für alle weiteren Anfragen ist dies nicht mehr nötig, da diese Information nun lokal gespeichert ist.

23.6.4. Wie funktioniert DNS?

Unter FreeBSD wird der BIND-Daemon als named bezeichnet.

Datei Beschreibung
named Der BIND-Daemon.
ndc Das Steuerprogramm für named.
/etc/namedb Das Verzeichnis, in dem sich die Zoneninformationen für BIND befinden.
/etc/namedb/named.conf Die Konfigurationsdatei für named.

Zonendateien befinden sich normalerweise im Verzeichnis /etc/namedb und enthalten die vom Nameserver angebotenen DNS-Zoneninformationen.

23.6.5. BIND starten

Da BIND automatisch installiert wird, ist die Konfiguration relativ einfach.

Um den named-Daemon beim Systemstart automatisch zu starten, fügen Sie folgende Zeile in /etc/rc.conf ein:

named_enable="YES"

Um den Daemon (nach der Konfiguration) manuell zu starten, geben Sie Folgendes ein:

# ndc start

23.6.6. Konfigurationsdateien

23.6.6.1. make-localhost verwenden

Um die lokale reverse-DNS-Zonendatei /etc/namedb/localhost.rev korrekt zu erzeugen, machen Sie Folgendes:

# cd /etc/namedb
# sh make-localhost

23.6.6.2. /etc/namedb/named.conf

// $FreeBSD$
//
// Refer to the named(8) manual page for details.  If you are ever going
// to setup a primary server, make sure you've understood the hairy
// details of how DNS is working.  Even with simple mistakes, you can
// break connectivity for affected parties, or cause huge amount of
// useless Internet traffic.

options {
        directory "/etc/namedb";

// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
//      forward only;

// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below.  This will make you
// benefit from its cache, thus reduce overall DNS traffic in the
Internet.
/*
        forwarders {
                127.0.0.1;
        };
*/     

Um vom Cache Ihres Internetproviders zu profitieren, können hier forwarders aktiviert werden. Normalerweise sucht ein Nameserver das Internet rekursiv ab, bis er die gesuchte Antwort findet. Durch diese Option wird stets der Nameserver Ihres Internetproviders zuerst abgefragt, um von dessen Cache zu profitieren. Wenn es sich um einen schnellen, viel benutzten Nameserver handelt, kann dies zu einer Geschwindigkeitssteigerung führen.

Warnung: 127.0.0.1 funktioniert hier nicht. Ändern Sie diese Adresse in einen Nameserver Ihres Einwahlproviders.

/*
* If there is a firewall between you and name servers you want
* to talk to, you might need to uncomment the query-source
* directive below.  Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;

/*
* If running in a sandbox, you may have to specify a different
* location for the dumpfile.
*/
// dump-file "s/named_dump.db";
};

// Note: the following will be supported in a future release.
/*
host { any; } {
        topology {
                127.0.0.0/8;
        };
};
*/

// Setting up secondaries is way easier and the rough picture for this
// is explained below.
//
// If you enable a local name server, don't forget to enter 127.0.0.1
// into your /etc/resolv.conf so this server will be queried first.
// Also, make sure to enable it in /etc/rc.conf.

zone "." {
        type hint;
        file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
        type master;
        file "localhost.rev";
};

zone
"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" {
        type master;
        file "localhost.rev";
};

// NB: Do not use the IP addresses below, they are faked, and only
// serve demonstration/documentation purposes!
//
// Example secondary config entries.  It can be convenient to become
// a secondary at least for the zone where your own domain is in.  Ask
// your network administrator for the IP address of the responsible
// primary.
//
// Never forget to include the reverse lookup (IN-ADDR.ARPA) zone!
// (This is the first bytes of the respective IP address, in reverse
// order, with ".IN-ADDR.ARPA" appended.)
//
// Before starting to setup a primary zone, better make sure you fully
// understand how DNS and BIND works, however.  There are sometimes
// unobvious pitfalls.  Setting up a secondary is comparably simpler.
//
// NB: Don't blindly enable the examples below. :-)  Use actual names
// and addresses instead.
//
// NOTE!!! FreeBSD runs BIND in a sandbox (see named_flags in rc.conf).
// The directory containing the secondary zones must be write accessible
// to BIND.  The following sequence is suggested:
//
//      mkdir /etc/namedb/s
//      chown bind:bind /etc/namedb/s
//      chmod 750 /etc/namedb/s

Wenn Sie BIND innerhalb einer Sandbox betreiben wollen, lesen Sie bitte den Abschnitt 23.6.8.

/*
zone "example.com" {
        type slave;
        file "s/example.com.bak";
        masters {
                192.168.1.1;
        };
};

zone "0.168.192.in-addr.arpa" {
        type slave;
        file "s/0.168.192.in-addr.arpa.bak";
        masters {
                192.168.1.1;
        };
};
*/     

Hierbei handelt es sich um Slave-Einträge für eine Reverse- und Forward-DNS-Zone, die in der Datei named.conf definiert sind.

Für jede neue Zone muss ein zusätzlicher Eintrag in named.conf erstellt werden.

Ein einfacher Eintrag für eine Zone example.org könnte beispielsweise so aussehen:

zone "example.org" {
        type master;
        file "example.org";
};     

Die Option type legt fest, dass es sich um eine Master-Zone handelt, deren Zoneninformationen sich in der Datei /etc/namedb/example.org befinden. Diese Datei wird durch die Option file festgelegt.

zone "example.org" {
        type slave;
        file "example.org";
};     

Hier handelt es sich um einen Slaveserver, der seine Informationen vom Masterserver der betreffenden Zone bezieht und diese in der angegebenen Datei speichert. Wenn der Masterserver nicht erreichbar ist, verfügt der Slaveserver über die transferierten Zoneninformationen und kann diese an andere Rechner weitergeben.

23.6.6.3. Zonendateien

Die in der Datei /etc/namedb/example.org definierte Zonendatei für example.org könnte etwa so aussehen:

$TTL 3600

example.org. IN SOA ns1.example.org. admin.example.org. (
                        5               ; Serial
                        10800           ; Refresh
                        3600            ; Retry
                        604800          ; Expire
                        86400 )         ; Minimum TTL

; DNS Servers
@       IN NS           ns1.example.org.
@       IN NS           ns2.example.org.

; Machine Names
localhost       IN A    127.0.0.1
ns1             IN A    3.2.1.2
ns2             IN A    3.2.1.3
mail            IN A    3.2.1.10
@               IN A    3.2.1.30

; Aliases
www             IN CNAME        @

; MX Record
@               IN MX   10      mail.example.org.

Beachten Sie, dass jeder mit einem “.” endende Rechnername ein exakter Rechnername ist, während sich alles ohne einen abschließenden “.” auf den Ursprung bezieht. www steht daher für www.Ursprung. In unserer fiktiven Zonendatei ist example.org. der Ursprung, daher steht www für www.example.org.

Eine Zonendatei hat folgenden Aufbau:

recordname      IN recordtype   value

Die am häufigsten verwendeten DNS-Einträge sind:

SOA

Start der Zonenautorität

NS

Ein autoritativer Nameserver

A

Eine Rechneradresse

CNAME

Der kanonische Name eines Alias

MX

Mail Exchanger

PTR

Ein (bei Reverse-DNS verwendeter) Domain Name Pointer

example.org. IN SOA ns1.example.org. admin.example.org. (
                        5               ; Serial
                        10800           ; Refresh after 3 hours
                        3600            ; Retry after 1 hour
                        604800          ; Expire after 1 week
                        86400 )         ; Minimum TTL of 1 day
example.org.

Der Name der Domäne und damit der Ursprung dieser Zonendatei.

ns1.example.org.

Der primäre/autoritative Nameserver dieser Zone.

admin.example.org.

Die für diese Zone verantwortliche Person. Das Zeichen “@” wird dabei ersetzt ( wird also zu admin.example.org).

5

Die Seriennummer der Datei. Sie muss stets inkrementiert werden, wenn die Zonendatei geändert wird. Viele Administratoren bevorzugen ein JJJJMMTTRR-Format, um die Seriennummer festzulegen. 2001041002 steht also für den 10.04.2001, die beiden letzten Stellen für die zweite Modifikation der Zonendatei an diesem Tag. Die Seriennummer ist von großer Bedeutung, da Slaveserver daran eine aktualisierte Zonendatei erkennen können.

@       IN NS           ns1.example.org.

Ein NS-Eintrag. Jeder Nameserver, der für eine Zone verantwortlich ist, muss über einen solchen Eintrag verfügen. Das Zeichen @ steht in unserem Beispiel für example.org., @ verweist also auf den Ursprung.

localhost       IN A    127.0.0.1
ns1             IN A    3.2.1.2
ns2             IN A    3.2.1.3
mail            IN A    3.2.1.10
@               IN A    3.2.1.30

Der Eintrag A bezieht sich auf Rechnernamen. ns1.example.org würde also zu 3.2.1.2 aufgelöst werden. Da das (Ursprungs-)Symbol @ verwendet wird, wird example.org zu 3.2.1.30 aufgelöst.

www             IN CNAME        @

Der Eintrag für den kanonischen Namen wird dazu verwendet, Aliase für einen Rechner zu vergeben. Im Beispiel ist www ein Alias für den Ursprungsrechner (example.org oder 3.2.1.30). Durch die Option CNAME können Aliasnamen vergeben werden. Ein Rechnername kann aber auch abwechselnd verschiedenen Rechnern zugewiesen werden.

@               IN MX   10      mail.example.org.

Die Option MX legt fest, welcher Mailserver für eintreffende Mails der Zone verantwortlich ist. mail.example.org ist der Rechnername des Mailservers, der eine Priorität von 10 hat.

Es können auch mehrere Mailserver mit verschiedener Priorität vorhanden sein. Ein Mailserver, der eine Mail an example.org verschicken will, verwendet zuerst den MX mit der höchsten Priorität, danach den mit der nächsthöheren, bis die E-Mail zugestellt werden kann.

Für (bei Reverse-DNS verwendete) in-addr.arpa-Zonendateien wird das gleiche Format verwendet. Der einzige Unterschied besteht in der Verwendung der Option PTR an Stelle der Optionen A und CNAME.

$TTL 3600

1.2.3.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. (
                        5               ; Serial
                        10800           ; Refresh
                        3600            ; Retry
                        604800          ; Expire
                        3600 )          ; Minimum

@       IN NS   ns1.example.org.
@       IN NS   ns2.example.org.

2       IN PTR  ns1.example.org.
3       IN PTR  ns2.example.org.
10      IN PTR  mail.example.org.
30      IN PTR  example.org.

Durch diese Datei werden den Rechnernamen der fiktiven Domäne IP-Adressen zugewiesen.

23.6.7. Zwischenspeichernde (cachende) Nameserver

Ein cachender Nameserver ist für keine Zonen verantwortlich. Er stellt lediglich eigene Anfragen und speichert deren Ergebnisse ab. Um einen solchen Nameserver einzurichten, gehen Sie wie gewohnt vor, allerdings definieren Sie keine Zonen.

23.6.8. named in einer Sandbox ausführen

Es ist möglich, named(8) als nicht privilegierter Benutzer in einer mit chroot(8) definierten Sandbox auszuführen. Dadurch hat der named-Daemon keinen Zugriff auf Verzeichnisse und Dateien außerhalb der Sandbox. Sollte named kompromittiert werden, lässt sich dadurch der mögliche Schaden begrenzen. FreeBSD erzeugt dazu automatisch einen Benutzer und eine Gruppe namens bind.

Anmerkung: Manchmal wird auch empfohlen, statt mit chroot das Wurzelverzeichnis für named zu ändern, named innerhalb eines jail(8)s auszuführen. Diese Situation wird hier jedoch nicht beschrieben.

Da named keinen Zugriff auf Dateien außerhalb der Sandbox (wie Systembibliotheken oder Protokolldateien) hat, sind einige Vorbereitungen notwendig, damit named korrekt funktioniert. Im Folgenden wird angenommen, dass die Sandbox unter /etc/namedb eingerichtet wird. Außerdem befinden sich die Dateien in diesem Verzeichnis noch im Originalzustand. Alle Schritte müssen als root durchgeführt werden.

Danach bearbeiten Sie /etc/namedb/etc/named.conf, damit named weiß, welche Zonen geladen werden müssen und wo sich diese befinden. Es folgt nun ein kommentiertes Beispiel (alle nicht dokumentierten Einträge gelten auch für einen DNS-Server, der nicht in einer Sandbox läuft):

options {
        directory "/";(1)
        named-xfer "/bin/named-xfer";(2)
        version "";     // Don't reveal BIND version
        query-source address * port 53;
};
// ndc control socket
controls {
        unix "/var/run/ndc" perm 0600 owner 0 group 0;
};
// Zones follow:
zone "localhost" IN {
        type master;
        file "master/named.localhost";(3)
        allow-transfer { localhost; };
        notify no;
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "master/localhost.rev";
        allow-transfer { localhost; };
        notify no;
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" {
    type master;
    file "master/localhost-v6.rev";
    allow-transfer { localhost; };
    notify no;
};
zone "." IN {
        type hint;
        file "master/named.root";
};
zone "private.example.net" in {
        type master;
        file "master/private.example.net.db";
    allow-transfer { 192.168.10.0/24; };
};
zone "10.168.192.in-addr.arpa" in {
        type slave;
        masters { 192.168.10.2; };
        file "slave/192.168.10.db";(4)
};   
(1)
directory wird als / festgelegt, da sich alle von named benötigten Dateien in diesem Verzeichnis befinden (analog zur /etc/namedb eines “normalen” Benutzers.
(2)
Legt den vollständigen Pfad zur Binärdatei named-xfer aus der Sicht von named fest. Das ist nötig, weil named per Voreinstellung im Verzeichnis /usr/libexec nach named-xfer sucht.
(3)
Legt die Datei (relativ zum directory-Statement) fest, in der named die Zonendatei für diese Zone findet.
(4)
Legt die Datei (relativ zum directory-Statement) fest, in die named eine Kopie der Zonendatei dieser Zone schreibt, nachdem diese erfolgreich vom Masterserver angefordert wurde. Aus diesem Grund musste in den vorherigen Schritten auch bind der Eigentümer des Verzeichnisses slave sein.

Nachdem Sie diese Schritte erledigt haben, müssen Sie entweder den Rechner oder syslogd(8) neu starten. Danach starten Sie named(8) unter Verwendung der neuen, unter syslogd_flags und named_flags festgelegten Optionen. Sie verwenden nun eine Sandboxversion von named!

23.6.9. Sicherheit

Obwohl BIND die am meisten verwendete (und kontrollierte) Implementierung von DNS darstellt, werden dennoch manchmal neue Sicherheitsprobleme entdeckt.

Es ist daher eine gute Idee, die Sicherheitshinweise von CERT zu lesen sowie die Mailingliste FreeBSD security notifications zu abonnieren, um sich über Sicherheitsprobleme im Zusammenhang mit dem Internet und FreeBSD zu informieren.

Tipp: Tritt ein Problem auf, kann es nie schaden, die Quellen zu aktualisieren und named neu zu kompilieren.

23.6.10. Weitere Informationsquellen

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 17:56:55