Debian DNS Server installieren und konfigurieren (Caching und eigene Zonen)

Betreibt man Server in einem eigenen Netzwerk kann es aus Performance-Gründen durchaus Sinn machen einen eigenen DNS Server zu betreiben. Müssen bei einer Server-Kommunikation Namen aufgelöst werden, ist immer eine Anfrage an einen Nameserver erforderlich. Liegt der außerhalb des Netzwerkes (z.B. beim ISP) begibt man sich in eine Abhängigkeit, die Geschwindigkeitseinbußen zur Folge haben kann. Mit einem eigenen DNS Server können Namensauflösungen gecached und auch eigene Zonen definiert werden. So können sowohl externe Anfragen schneller verarbeitet, als auch in der internen Kommunikation mit FQDNs gearbeitet werden. Die Konfiguration mit Debian ist denkbar einfach.

Der Debian Installationsassistent bringt sogar die Möglichkeit mit sich, direkt alle nötigen Pakete zu installieren, die für den Betrieb eines Servers als Nameserver erforderlich sind. Einfach die Option DNS wählen und schon kann's losgehen. Möchte man einen bestehenden Server umwandeln, kann man die Pakete auch manuell nachinstallieren mit apt.

apt-get install bind9 dnsutils

Der DNS Server bind9 ist jetzt installiert und kann konfiguriert werden. Dazu passen wir zuerst ein paar Optionen an. In der Datei /etc/bind/named.conf.options bitte den Bereich "forwarders" einkommentieren und einen oder mehrere externe DNS als Fallback definieren. Ich nutze hier die beiden Google DNS Server als Fallback:

forwarders {
  8.8.8.8;
  8.8.4.4;
};

Jetzt macht es noch Sinn, dem Debian Server den eigenen DNS Server als Nameserver mitzugeben und nicht zusätzlich irgendwelche externen. Das geht über die Datei /etc/resolv.conf in der wir einfach alle Zeilen auskommentieren, die mit "nameserver" beginnen und stattdessen schreiben:

nameserver 127.0.0.1

Jetzt noch den bind9 service oder ggf. Debian neustarten.

Der erste Teil ist damit erledigt. Der Nameserver ist jetzt betriebsbereit und die IP des Servers kann genutzt werden um in den Netzwerkkonfigurationen anderer Maschinen als DNS Server eingetragen zu werden.

Möchte man jetzt noch eigene Zonen im internen LAN definieren ist auch das in wenigen Schritten möglich. Dazu brauchen wir zwei Konfigurationsdateien. Eine für die Forward Lookup Zone und eine für die Reverse Lookup Zone. Die Forward Lookup Zone löst Namen in IP-Adressen auf. Die Reverse Lookup Zone macht das genaue Gegenteil, also zu IP-Adressen die zugehörigen Namen finden. Natürlich bringt bind9 Demo-Dateien für beides mit sich, die wir einfach kopieren und anpassen können.

cp /etc/bind/db.local /etc/bind/db.mydomain.tld
cp /etc/bind/db.127 /etc/bind/db.192

wobei mydomain.tld durch den Domain-Namen der internen Maschinen und 127 durch den ersten Block der internen IP-Adressen ersetzt werden sollte. Habe ich ein internes Netz in dem alle Server in der Domain mynetwork.lan liegen (also server1.mynetwork.lan, server2.mynetwork.lan, etc.), dann sollte die neue Datei db.mynetwork.lan heißen. Und haben alle Server die IP-Adressen 192.168.1.X, dann sollte die andere neue Datei db.192 heißen.

In der Datei db.mydomain.tld werden jetzt die Forward-Lookup-Zonen definiert. Hier ein Beispiel-Inhalt von einer fertigen Datei:

;
; BIND data file for local loopback interface
;
$TTL    604800
@               IN      SOA     localhost. root.mycluster.lan. (
                                201507190       ; Serial
                                 604800         ; Refresh
                                  86400         ; Retry
                                2419200         ; Expire
                                 604800 )       ; Negative Cache TTL
;
@               IN      NS      cdhdns.mycluster.lan.
@               IN      A       10.12.80.254
cdhdns          IN      A       10.12.80.254
cdhgateway      IN      A       10.12.80.11
cdhmng          IN      A       10.12.80.12
cdhag1          IN      A       10.12.80.13
cdhag2          IN      A       10.12.80.14

Für die Serial Nummer ist es Best Practice das aktuelle Datum plus einen Index für die Änderungen am selben Tag zu nehmen. Also z.B. das Format YYYYMMDD0, oder YYYYMMDD1, wenn man am selben Tag nochmal eine Änderung durchführt.

Die Konfigurationsdatei für die Reverse Lookup Zone verhält sich ähnlich, nur eben andersherum.

;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     mycluster.lan. root.mycluster.lan. (
                        201507190       ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      cdhdns.mycluster.lan.
254     IN      PTR     cdhdns.mycluster.lan.
11      IN      PTR     cdhgateway.mycluster.lan.
12      IN      PTR     cdhmng.mycluster.lan.
13      IN      PTR     cdhag1.mycluster.lan.
14      IN      PTR     cdhag2.mycluster.lan.

Abschließend müssen die Konfigurationsdateien nur noch eingehängt werden. Dazu in der Datei /etc/bind/named.conf.local ans Ende folgendes hinzufügen

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

zone "1.168.192.in-addr.arpa" {
        type master;
        notify no;
        file "/etc/bind/db.192";
};

Jetzt noch den Dienst oder besser Debian neustarten und schon kann es losgehen. Testen kann man das ganz einfach indem man von einer anderen Maschine, die den neuen Server als DNS nutzt, eine der definierten Hostnamen pingt und schaut ob die IP-Adresse korrekt aufgelöst wird.