DNS-Server Bind

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Ein Terminal öffnen

  3. IP-Adresse wechseln

  4. Einen Editor öffnen

  5. mit Root-Rechten arbeiten

  6. Abfragen von Informationen von DNS-Servern

Inhaltsverzeichnis
  1. Installation
  2. Erstkonfiguration
    1. Konfiguration IPv4/IPv6
    2. Einstellungen in named.conf.options
    3. Das Anlegen der Zonendateien
    4. Globale Konfiguration in named.conf
  3. Starten des DNS und testen der Funktion
  4. Benutzung
  5. Problembehebung
  6. Links

BIND, auch bekannt als "named" (Kurzform für: "name daemon"), ist ein von der Universität Berkeley (USA) entwickelter DNS-Server, der eine hohe Verbreitung in mittleren bis großen Netzen findet. Er ist als Open Source erhältlich und wurde auf fast jedes Betriebssystem portiert. Bis heute gilt BIND als "die Referenz" unter den DNS-Servern und bildet den Grundstock des heutigen Internets. Inzwischen wurde die Entwicklung des BIND-Servers vom herstellerunabhängigen Internet Systems Consortium (ISC) 🇬🇧 übernommen. Dieser Artikel behandelt die Version 9 der Software, die bisher in allen Ubuntu-Versionen zum Einsatz kam.

Als alternativer DNS-Server für kleinere (Heim-)Netze steht auch Dnsmasq zur Verfügung, der besonders einfach konfiguriert werden kann.

Hinweis:

Ein DNS-Server muss eine statische IP-Adresse haben [3], damit er von den Clients gefunden werden kann. Er kann logischerweise nicht per Domainnamen angesprochen werden, da er für die Auflösung solcher angesprochen wird und daher die IP bekannt sein muss.

Installation

Folgendes Paket ist zu installieren [1]:

Paketliste zum Kopieren:

sudo apt-get install bind9 

Oder mit apturl installieren, Link: apt://bind9

BIND ist nach der Installation bereits voll funktionsfähig und läuft im Cache-Mode, d.h. er bezieht DNS-Informationen von den Root-Servern und gibt sie an die Clients weiter.

Erstkonfiguration

Die Konfiguration des BIND-Servers erfolgt über das Verzeichnis /etc/bind. Nach der Installation sollten sich hier folgende Dateien finden:

db.0      db.local    named.conf          named.conf.default-zones
db.127    db.empty    named.conf.local    rndc.key   
db.255                named.conf.options  zones.rfc1918

In den Dateien, die mit named. beginnen, wird die allgemeine Funktion des Servers konfiguriert. Die db.-Dateien sind dagegen die Zonendateien, in denen die eigentlichen DNS-Daten abgelegt werden. In älteren Ubuntu-Versionen gab es noch die Datei db.root mit der Liste der Rootserver. Diese befindet sich nun in /usr/share/dns/root.hints.

Hinweis:

Wichtig ist hierbei die genaue Einhaltung der Syntax, da BIND hier extrem pingelig ist.

Konfiguration IPv4/IPv6

Deaktivieren von IPv6

Wenn nur IPv4 im Netzwerk verwendet wird, kann der Parameter -4 in /etc/default/bind9 unter OPTIONS="..." hinzugefügt werden. Dies sollte nur aktiviert werden, wenn kein IPv6 genutzt wird, da BIND sonst nicht per IPv6 angesprochen werden kann.

Die Zeile

OPTIONS="-u bind"

sieht dann so aus

OPTIONS="-4 -u bind"

Deaktivieren von IPv4

Für reine IPv6-Netzwerke kann auch die Option -6 anstatt -4 genutzt werden. BIND ist dann nur noch über IPv6 ansprechbar.

Einstellungen in named.conf.options

Die Datei /etc/bind/named.conf.options muss mit Root-Rechten[5] editiert[4] werden.

Vertrauenswürdige Clients festlegen

Man erstellt vor dem options-Block einen neuen Block acl <wunschname>:

acl goodclients { // Name kann frei gewählt werden
 192.168.0.0/24;  // Lokales Netz (IP-Adressbereich anpassen)
 10.0.10.45       // einzelner Client im Netz
 localhost;       // localhost sollte immer eingetragen sein
 localnets;
};

Danach muss im options-Block diese ACL (Access Control List) aktiviert werden:

options {
    directory "/var/cache/bind";
    allow-query { goodclients; }; //ACL-Name von oben
...
};

Netzwerkschnittstellen

Zur Änderung der Netzwerkschnittstellen muss man in einem Editor mit Root-Rechten [5] die Datei named.conf.options bearbeiten und die folgende Zeile in den options-Block eintragen:

        listen-on { 127.0.0.1; 192.168.0.10; 10.0.20.25; };

Die Beispieladressen müssen natürlich an die IP-Adressen des Bind-Servers im lokalen Netzwerk angepasst werden. Wichtig ist auch, den localhost, also 127.0.0.1, nicht zu vergessen, sowie auf die korrekte Verwendung der Semikolons zu achten.

Forwarder-Mode festlegen (optional)

Will man DNS-Abfragen nicht an die Root-Server stellen, kann man Bind im Forwarder-Mode konfigurieren. So leitet er Anfragen an andere DNS-Server (z.B. vom ISP) weiter.

Im options'-Block wird dazu ein neuer forwarders-Block angelegt. Hier können auch mehrere Server eingetragen werden:

forwarders {
10.0.0.1;
8.8.8.8;
};

Jetzt kann der Server wie folgt neu gestartet werden:

sudo service bind9 restart 

Testen kann man dies mit dem Befehl dig[6]:

dig ubuntuusers.de 127.0.0.1 

Das Anlegen der Zonendateien

Es müssen mindestens zwei neue db.-Dateien erstellt werden[1]. Eine Datei mit dem Namen db.domainname für die Forwardlookup-Zone (diese sorgt für die Auflösung von Hostnamen in IP-Adressen) und eine Datei namens db.z.y.x für die Reverselookup-Zone (das ist die Auflösung in umgekehrter Reihenfolge, also IP-Adresse → Hostname).

Forward Lookup

Die Datei db.domainname könnte so aussehen:

;; db.domainname
;; Forwardlookupzone für domainname
;;
$TTL 2D
@       IN      SOA     rechnername.domainname. mail.domainname. (
                        2006032201      ; Serial
                                8H      ; Refresh
                                2H      ; Retry
                                4W      ; Expire
                                3H )    ; NX (TTL Negativ Cache)

@                               IN      NS      rechnername.domainname.
                                IN      MX      10 mailserver.domainname.
                                IN      A       192.168.0.10

rechnername                     IN      A       192.168.0.10
localhost                       IN      A       127.0.0.1
rechner1                        IN      A       192.168.0.200
mailserver                      IN      A       192.168.0.201
rechner2                        IN      CNAME   mailserver

Ressourcen von MX-Records (in diesem Beispiel also der "mailserver") müssen immer auf einen A-Record verweisen (RFC 2181).

Besonders wichtig an dieser Stelle ist eine Leerzeile am Ende der Datei!

Das TTL (Time To Live) gibt an, wie lange Informationen im Cache der Clients gültig bleiben und danach neu angefordert werden sollen (in diesem Fall 2Days, also 2 Tage).

Als nächstes kommt dann der SOA (Start Of Authority resource records), welcher folgende Werte für den Bereich der Domäne festlegt:

  • zone-origin ist der vollqualifizierte Domainname (FQDN) des primären DNS-Servers. (In diesem Fall server.domainname., der Name des Servers, den gerade konfigurieren wird.) Der Punkt am Ende ist übrigens wichtig!

  • zone-contact ist die Mail-Adresse des DNS-Verwalters. Das "@" wird hier jedoch durch einen Punkt ersetzt, somit müsste hier "mail.domainname." eingetragen werden. Auch hier den Punkt am Ende nicht vergessen!

  • serial ist eine Seriennummer, die der Administrator nach seinen Vorstellungen vergeben kann. Allerdings muss die Seriennummer bei jeder Änderung erhöht werden, da diese Nummer sekundären DNS-Servern als Indiz dafür dient, dass sich was geändert hat. Nach allgemeiner Konvention benutzt man deswegen die Form YYYYMMDDSS, mit YYYY=Jahr, MM=Monat, DD=Tag und SS=zweistellige Seriennummer, die bei mehreren Änderungen an einem Tag jeweils um eins erhöht wird.

  • Die folgenden Einträge des SOA-Abschnitts befinden sich für die meisten Fälle schon auf vernünftigen Voreinstellungen und müssen im Allgemeinen nicht angetastet werden.

Experten-Info:

  • refresh gibt die Zeit in Sekunden an, die ein sekundärer Server wartet, bis er beim primären Server nachfragt, ob sich die Zonendateien verändert haben.

  • retry gibt die Zeit in Sekunden an, die ein sekundärer Server wartet, bis er eine Anfrage an den primären Server wiederholt, wenn dieser auf die vorherige Anfrage nicht geantwortet haben sollte (z.B. weil er offline war).

  • expire gibt die Zeit in Sekunden an, die ein sekundärer Server auf einen erfolgreichen Kontakt zum primären Server wartet, bevor er die Zonendatei für ungültig erklärt.

  • nx gibt die Zeit an, während der eine negativ beschiedene DNS Anfrage ("Name Error" / "NXDOMAIN") zwischengespeichert werden soll (zwischen 0 Sekunden und 3 Stunden).

Als nächstes kommen die Einträge der DNS-Server, die für die Zone verantwortlich sind. Diese haben alle die Form

Name                            IN      RR      Wert

Der Name kann dabei weggelassen werden, in welchem Fall er aus der vorherigen Zeile übernommen wird. Namen ohne Punkt am Ende werden dabei durch den Zonen-(Domain-)namen ergänzt, Namen mit Punkt gelten als vollqualifiziert. Ein besonderer Name ist das Zeichen @, das dem Zonennamen entspricht.

RR (Resource Record) muss einer von mehreren offiziellen RR-Bezeichnungen sein und der Wert hängt von der Art des RR ab. Einige RRs:

RR Wert Beschreibung
NS FQDN eines DNS-Servers alle primären und sekundären DNS-Server der Domain sollten einen Eintrag besitzen
A IP-Adresse "normaler" Eintrag: Name → IP
CNAME richtiger Name Alias-Definition - richtiger Name muss kein FQDN sein, sollte aber kein weiterer CNAME sein
MX Priorität Name Mailserver, der Mail für die Domain annimmt - Priorität muss eine Zahl sein (niedriger: zuerst probieren), Name ist der Name des Mailservers
PTR FQDN umgekehrte Auflösung: IP → Name

Weitere Resource Records finden sich in Wikipedia oder in der Fachliteratur.

Reverse Lookup

In der Datei db.z.y.x, bspw. db.0.168.192 für das Subnetz 192.168.0.0, befinden sich überwiegend die Einträge aus der db.domainname, allerdings erfolgt der Lookup nun in umgekehrter Richtung:

;; db.0.168.192
;; Reverselookupzone für domainname
;;
$TTL 2D
@       IN      SOA     rechnername.domainname. mail.domainname. (
                                2006032201      ; Serial
                                        8H      ; Refresh
                                        2H      ; Retry
                                        4W      ; Expire
                                        3H )    ; TTL Negative Cache

@       IN      NS      rechnername.domainname.

10      IN      PTR     rechnername.domainname.
200     IN      PTR     rechner1.domainname.
201     IN      PTR     rechner2.domainname.

Man beachte die PTR-Records, die für die Rückwärtsübersetzung von IP-Adressen in Namen zuständig sind. Die Zahlen in der ersten Spalte stellen dabei das letzte Byte der IP-Adresse dar. Wichtig ist, dass die übersetzten Namen FQDNs (mit Punkt am Ende) sind.

Alias-Einträge, MX-Records, etc. werden hier nicht nochmal aufgeführt.

Globale Konfiguration in named.conf

Nun müssen die Zonendateien dem Server noch bekannt gemacht werden. Dies geschieht durch folgenden Eintrag in der Datei named.conf.local, die in der eigentlichen named.conf-Datei referenziert wird:

zone "domainname" {
type master;
file "/etc/bind/db.domainname";
};

zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.0.168.192";
};

.in-addr.arpa ist die offizielle "Domain für IP-Adressen". Diese sind pro Byte in Subdomains aufgeteilt. 0.168.192.in-addr.arpa ist also die Subdomain für alle Adressen von 192.168.0.0 bis 192.168.0.255. Diese Bezeichnung aus der zone-Direktive ist auch gleichzeitig das, was in den Zonendateien als @ referenziert werden kann.

Die Option master sagt dem Server, dass er der für die Domain verantwortliche Server ist, also der primäre Server und das file verweist lediglich noch auf die Zonendateien.

Starten des DNS und testen der Funktion

Nun kann man den Server mal probeweise starten:

sudo service bind9 start 

Wenn keine Fehlermeldungen in der Datei /var/log/syslog auftauchen, kann der Server mit dem Werkzeug dig getestet werden:

dig @127.0.0.1 rechnername.domainname 

Als Antwort sollte dann so etwas kommen:

; <<>> DiG 9.3.2 <<>> rechnername.domainname
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54891
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;rechnername.domainname.             IN      A

;; ANSWER SECTION:
rechnername.domainname.      172800  IN      A  192.168.0.10

;; AUTHORITY SECTION:
domainname.          172800  IN      NS      rechnername.domainname.

;; Query time: 2 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Mar 25 04:34:52 2006
;; MSG SIZE  rcvd: 92

Benutzung

Wenn bis hierhin alles geklappt hat, muss man nur noch allen Client-Rechnern im Netz den neuen Nameserver bekannt machen, angefangen beim Server-Rechner selber. Wie das unter Ubuntu geht steht im Artikel DNS-Konfiguration.

Auf den Clients können unterschiedliche Methoden notwendig sein. Am einfachsten funktioniert das, wenn man einen DHCP-Server einsetzt. Dann braucht man die DNS-Einstellungen nur dort verändern. Ansonsten auf jedem Client einzeln. Natürlich muss man dafür dann die richtige IP-Adresse des Servers verwenden und nicht die 127.0.0.1.

Problembehebung

Mit diesem Befehl werden die Statusinformationen und die letzten Logmeldungen angezeigt:

sudo service bind9 status 

Bind hat keine eigene Logdatei, sondern schreibt alle Meldungen unter dem alten Namen 'named' in das Syslog (/var/log/syslog).