Thema DNS: Namensauflösung mit BIND9
Abschnitt 1: Installation
Die Aufgabe eines DNS-Servers sollte bekannt sein: **Namensauflösung im Netzwerk, wozu auch das Internet gehört.**
Ich verwende bei mir **BIND9**, da dieser sehr flexibel und mächtig ist. Zudem ist er erprobt und somit sehr sicher. Warum ist BIND9 mächtig? Das merken Sie bei der Konfiguration.
Installation des DNS-Servers
apt install bind9 dnsutils -y
Abschnitt 2: Konfiguration (Vorsicht: Burn-Out Gefahr :))
`named.conf.options` – Globale Einstellungen
Es gibt ein paar Dateien, die wir nun bearbeiten müssen. Fangen wir an mit **`named.conf.options`**. Hier sind die grundlegenden Einstellungen für den Server enthalten:
- Wo er lauscht (IP und Port)
- Rekursion (`recursion`)
- EDNS (`edns-udp-size`)
- **Forwarders** (sehr wichtig!)
- Abfrageerlaubnis (`allow-query`)
nano /etc/bind/named.conf.options
Dort tragen wir die Konfiguration wie folgt ein (oder passen die vorhandene an):
options {
// directory: Definiert das Arbeitsverzeichnis für BIND.
directory "/var/lib/bind";
// recursion: Erlaubt rekursive DNS-Abfragen (typisch für interne Netzwerke)
recursion yes;
// edns-udp-size: Definiert die maximale UDP-Payload-Größe für EDNS. Wichtig für DNSSEC.
edns-udp-size 4096;
// forwarders: Definiert eine Liste von DNS-Servern, an die dieser Server
// Anfragen weiterleitet, die er nicht selbst auflösen kann.
forwarders {
// Google Public DNS (IPv4)
8.8.8.8;
8.8.4.4;
// Quad9 DNS (IPv4, mit Security Features)
9.9.9.9;
212.60.61.246;
212.60.63.246;
// Google Public DNS (IPv6)
2001:4860:4860::8888;
2001:4860:4860::8844;
// Quad9 DNS (IPv6)
2620:119:35::35;
};
// dnssec-validation: Aktiviert die DNSSEC-Validierung zur Erhöhung der Sicherheit.
dnssec-validation auto;
// listen-on / listen-on-v6: Hier lauscht der Server auf allen verfügbaren Adressen.
listen-on{ any; };
listen-on-v6 { any; };
// allow-query: Definiert, welche Clients DNS-Abfragen an diesen Server senden dürfen.
// WICHTIG: Sollte nur auf interne Adressen/Netzwerke beschränkt werden!
allow-query { 192.168.0.1; localhost; };
};
**Wichtig:** Die Direktive `allow-query { 192.168.0.1; localhost; };` definiert, auf welchen Schnittstellen und von welchen Quellen der Server Anfragen annehmen soll. Durch die Beschränkung auf interne IPs kann niemand aus dem Internet auf den DNS-Dienst zugreifen.
`named.conf.local` – Zonen-Definition
Um Namen in IP-Adressen und umgekehrt aufzulösen, benötigt BIND9 **Zonen**. Für jede Domain und jedes interne Netzwerk wird eine Zone angelegt. Wenn Sie mehrere Domains nutzen, können Sie jedem Gerät bei sich einen sinnvollen Namen geben und es so über das gesamte Netzwerk ansprechen.
Damit BIND9 weiß, wo die Zonen liegen und wie sie heißen, werden sie in der Datei **`named.conf.local`** definiert. Den Inhalt daraus können Sie komplett löschen und Ihre Zonen dort anlegen. Für jede Domain wird eine Zone angelegt, ebenso für jedes Netzwerk! Wir legen nun mindestens zwei Zonen an: eine Forward- und eine Reverse-Zone.
nano /etc/bind/named.conf.local
Tragen Sie dort Ihre beiden Zonen ein:
zone "domain.com" {
// Forward-Lookup-Zone (Name -> IP)
type master;
file "/var/lib/bind/domain.com"; // Pfad zur Zonendatei
allow-transfer {
192.168.1.1; // Erlaubt Zonentransfer zu Slave-Servern
};
also-notify {
192.168.1.1;
};
allow-update { none; };
allow-query {
192.168.0.0/24; // Erlaubt Abfragen aus diesem Netzwerk
192.168.1.0/24;
localhost;
};
};
zone "0.168.192.in-addr.arpa" {
// Reverse-Lookup-Zone (IP -> Name)
// Beachten Sie die umgekehrten Oktette für 192.168.0.x
type master;
file "/var/lib/bind/db.0.168.192";
allow-transfer {
192.168.1.1;
};
also-notify {
192.168.1.1;
};
allow-update { none; };
allow-query {
192.168.0.0/24;
192.168.1.0/24;
localhost;
};
};
Das Netzwerk `192.168.1.0/24` haben wir noch nicht im System, aber so sehen Sie schon mal, wo was hingehört (zum Beispiel später mit OpenVPN).
Abschnitt 3: Zonendateien erstellen
Wir wechseln ins Arbeitsverzeichnis und legen die Dateien der Reihe nach an:
cd /var/lib/bind
nano domain.com
Forward-Zone (`domain.com`)
Ich zeige Ihnen hier ein Grundgerüst, das nur noch ergänzt werden muss. **Achtung!** Bei JEDER Änderung an der Datei, muss die **Seriennummer** erhöht werden! Ein beliebtes Format dazu ist: **`YYYYMMDDxx`** (wobei `xx` der laufende Zähler ist, z.B. `2025071001`).
$TTL 604800
@ IN SOA ns01.domain.com. hostmaster.domain.com.(
2025071001 ;Seriennummer der Zone
6h ;Refresh
1h ;Retry
1d ;Expire
1h ;Negative Cache
)
;
@ IN NS ns01.domain.com.
@ IN NS ns02.domain.com.
@ IN MX 10 mx0
ns01 IN A 192.168.0.1
server01 IN A 192.168.0.1
mx0 IN A 192.168.0.2
;---------
; ab hier weitere Geräte eintragen als A-Record OHNE Domain!
Tragen Sie hier Ihre Domain ein, statt `domain.com`.
Prüfen und Aktivieren
Prüfen, speichern und schließen Sie die Datei, passen Sie die Berechtigungen an und starten Sie BIND9 neu:
named-checkconf -z /etc/bind/named.conf.local
STRG + O
STRG + X
chown -R bind:bind /var/lib/bind
systemctl restart bind9
Dann können Sie schon den ersten Namen auflösen mit `host mx0.domain.com`:
root@server01:~# host mx0.domain.com
mx0.domain.com has address 192.168.0.2
Wer sicher gehen will, kann auch die Zonendateien prüfen mit:
named-checkzone domain.com /var/lib/bind/domain.com
Die Ausgabe sollte so aussehen:
root@server01:~# named-checkzone domain.com /var/lib/bind/domain.com
zone domain.com/IN: loaded serial 2025070402
OK
Reverse-Zone (`db.0.168.192`)
Damit Sie nun auch zu einer IP-Adresse den Namen erhalten (**Reverse-Loopup-Zone**), erstellen und öffnen Sie die leere Datei wieder mit nano, so wie sie in `named.conf.local` heißt:
nano /var/lib/bind/db.0.168.192
Kopieren Sie folgenden Inhalt hinein:
$TTL 604800
@ IN SOA ns01.domain.com. hostmaster.domain.com.(
2025071001 ;Seriennummer der Zone
6h ;Refresh
1h ;Retry
1d ;Expire
1h ;Negative Cache
)
@ IN NS ns01.domain.com.
@ IN NS ns02.domain.com.
1 IN PTR server01.domain.com.
2 IN PTR mx0.domain.com.
;---------
; ab hier weitere Geräte eintragen mit Host-Teil der IP und dem VOLLEN Domainnamen!
**Wichtig:** Den Punkt (`.`) am Ende des FQDN **nicht vergessen**! Sonst heißt Ihr Gerät dann z.B. `server01.domain.com.domain.com`.
Ein schneller Test mit `host 192.168.0.1` bringt uns Gewissheit:
root@server01:~# host 192.168.0.1
1.0.168.192.in-addr.arpa domain name pointer server01.domain.com.
**Tipp:** Ich habe mir mittels Script die Standard-Einträge erzeugen lassen, da nicht alle IP-Adressen aus unserem 24er Netz vergeben werden. So kommt zumindest kein Fehler bei der Abfrage und es sieht professioneller aus.
int-client-1 IN A 192.168.0.1
int-client-2 IN A 192.168.0.2
...
int-client-41 IN A 192.168.0.41
usw. bis 254