FreeBSD als DNS-Server
Domain Name Service
Der Domain Name Service übernimmt die Namensauflösung von Netzwerkadressen. So kann man im Netzwerk die einzelnen Rechner mit einem Namen ansprechen und anstelle mit nur IP-Adressen kommunizieren. So wird z. B. wiki.cmoser.org in die zugewiesene IP-Adresse umgewandelt.
Wenn man aber keinen DNS-Server selbst hostet, aber eine Namensauflösung will, kann man auf jeden Rechner die /etc/hosts (unter Windows die %WINDIR%\system32\drivers\etc\hosts) editieren, um eine Namensauflösung zu ermöglichen. Wenn das Netzwerk aber über mehrere Rechner verfügt und man einen Computer hinzufügen will, wird es schnell aufwendig, die /etc/hosts auf jeden Rechner zu bearbeiten. Hier kommt dann ein DNS ins Spiel. Als DNS-Service nehme ich BIND.
Ich habe mir einst ein Raspberry PI gekauft und nehme es als DNS-Server her, weil es wenig Strom verbraucht und eigentlich recht günstig zu erwerben ist. FreeBSD nutze ich, weil es eigentlich mein bevorzugtes Unix ist. Die Rechenleistung des RPI reicht bei weiten aus um einige Services, darunter auch einen DNS und DHCP Server, zu betreiben.
Es wird davon ausgegangen, dass das FreeBSD-Basissetup bereits abgeschlossen ist und dem Rechner eine statische IP-Adresse, wie z. B. 192.168.1.254, zugewiesen wurde. Ein DNS-Server braucht unbedingt eine statische IP-Adresse!!!
Wie komme ich zu einer Domäne
Eine Domäne zu erfinden ist meistens keine gute Idee, da man sich hier möglicherweise von im Internet angebotenen Services ausschließt, wenn man eine Domäne überschreibt. Die Domain lässt sich bei einem Registrar registrieren. Bei den meisten Webhosting Angeboten ist eine eigene Domäne mit inkludiert. Wenn man keinen Webserver im Internet betreiben will, aber eine Domäne für seine Zwecke braucht, kann man sie auch einzeln registrieren. Eine Domäne kostet normalerweise keine 20 € im Jahr. Hier sind ein paar Links, wo man sich eine Domäne registrieren kann. Diese Registrare unterstützen auch PayPal.
- Ionos.de
- Internic.at
- Domain.com - kein IPV6!
Aufbau einer Domäne
Eine Doamäne ist der Namensraum, in welchen sich weitere Hosts und Subdomänen befinden. Die Domäne wird von rechts nach links aufgelöst, beginnend mit der Toplevel Domain (z .B. 'de') und durch einen Punkt (".") getrennt. cmoser.org ist die Domäne cmoser in der Toplevel Domäne org.
Die Domain wird in Zonen unterteilt. Jede Zone ist eine eigene Domain bzw. eigene Subdomain. Z. B. cmoser.org ist eine eigene Zone im Nameserver des DNS-Providers. Jede Zone enthält einen oder mehrere Einträge, wie die Mailserver der Domäne, die einzelnen Hosts mit Namen und IP-Adresse und die Adressen der einzelnen Nameserver der Domäne. Es gibt auch eine Reverse-Lookup Zone, die die umgekehrte Auflösung von IP-Adressen in den Host-Namen übernimmt. Sekundäre Zonen werden vom primären DNS-Server geholt und helfen bei der Namensauflösung, wenn der Primäre DNS-Server eine höhere Last aufweist und dienen nebenbei auch der Redundanz. Fällt der primäre DNS-Server aus, hat man, wenn man auch einen Sekundären Nameserver betreibt, etwas Zeit sich um den Primären DNS-Server wieder zum Laufen zu bringen, bis die Namensauflösung nicht mehr funktioniert.
Jede Zone wird in einer eigenen Datei gespeichert. Diese Dateien befinden sich unter FreeBSD normalerweise unter /usr/local/etc/namedb/primary für primäre Zonen, /usr/local/etc/namedb/secondary für Sekundärzonen und /usr/local/etc/namedb/dynamic für dynamische Zonen.
Dynamische Zonen sind praktisch, wenn man einen DHCP-Server hostet und gerne die Clients, welche IP-Adressen über den DHCP-Server beziehen (wie z. B. Laptops, Handys, Tablets usw.), mit einer Namensauflösung versehen will. Im Artikel FreeBSD als DHCP-Server werde ich darauf näher eingehen.
Primäre Zonen
Eine primäre (Master) Zone enthält die originale Zonendatei. Die primären Zonen sind sowohl lesbar als auch schreibbar. Alle DNS-Einträge werden in die primäre Zone des DNS-Servers geschrieben. Die Daten werden in einer Textdatei gespeichert, was den Vorteil hat, dass sich einfach ein Backup erstellen lässt und sie sich, im Falle von Problemen, einfach wieder herstellen lässt.
Wenn man Änderungen an der DNS-Zone machen will, muss eine primäre Zone verfügbar sein. Ist der Server mit der primären Zone ausgefallen, kann man keine Änderungen an der Zone durchführen.
Wer Redundanz haben will, muss man die Zonendaten auf mehreren Servern zur Verfügung stellen.
LAN IP-Adressen haben in einer primären Zone, die im Internet zugänglich ist, nichts verloren. Diese sollten nur vom DNS-Server im LAN abgebildet werden.
Sekundäre Zonen
Eine sekundäre Zone ist eine nur lesbare Kopie der Zonendaten. Meistens sind sekundäre (Slave) Zonen Kopien von primären Zonen, aber sie können auch Kopien von anderen sekundären Zonen oder Active Directory Zonen sein. Der Hauptverwendungszweck einer sekundären Zone ist, sie als Backup zur Verfügung zu stellen. Wenn die primäre Zone ausfällt, kann man noch immer Antworten auf die Anfragen für die Zone von seiner Kopie erhalten.
Installation und Konfiguration von BIND
Die für die Installation von BIND benötigten Pakete sind bind918 und bind-tools. Diese lassen sich einfach mit pkg installieren.
root@rpi# pkg install -y bind918 bind-tools
Um BIND bei jedem Systemstart automatisch zu starten, muss man ihn noch in der /etc/rc.conf aktivieren.Die Erstellung des rndc-Schlüssels übernimmt das Service-Script automatisch. Der Service heißt named.
root@rpi# sysrc named_enable=YES
Der Service muss noch gestartet werden, damit er aktiv ist und die rndc-Schlüssel-Datei erzeugt wird.
root@rpi# service named start
Konfiguration
Haben wir eine eigene Domäne und wollen dynamische Updates, erstellen wir noch einen rndc-Schlüssel.
root@rpi# rndc-confgen -a -c /usr/local/etc/namedb/meinedomain.de.key -k meinedomainde-key
Um den Schlüssel in der Konfiguration nutzen zu können müssen wir ihn in die Datei /usr/local/etc/namedb/named.conf importieren.
... include "/usr/local/etc/namedb/meinedomain.de.key"; ...
Als Nächstes geht es um die Konfiguration des Nameservers. Die Konfiguration von BIND befindet sich in der Datei /usr/local/etc/namedb/named.conf. Diese Datei wird bearbeitet. Eine genaue Spezifikation der Datei finden wir in der BIND9 Referenz.
Als Erstes suchen wir den Eintrag listen-on in den options und fügen hier den localhost (127.0.0.1) und die statische IP-Adresse unseres Servers ein.
options {
...
listen-on { 127.0.0.1; 192.168.1.254; };
...
};
Wer ein IPv6 Netzwerk betreibt, gibt mit der Option listen-on-v6 noch die IPv6 Adressen an, auf welche der Server hören soll. Der Wert any erlaubt das Abhören aller, dem Server zugewiesenen IPv6 Adressen.
options {
...
listen-on-v6 {
fe80::2;
};
...
};
Der nächste Eintrag in den options ist der des Forwarders. In den Eintrag forwarders tragen wir die IP-Adresse von jenen DNS-Servern ein, die die Namensabfragen für uns erledigen sollen, wenn kein passender Eintrag im eigenen DNS vorhanden ist. Ich wählte zwei freie unzensierte DNS-Server aus. Wer ein IPv6 Netzwerk betreibt, kann noch die IPv6 Adressen der gewählten Server mit eintragen.
(5.9.164.112 => digitalcourage, 80.241.218.68 => dismail.de, 192.168.1.1 => der eigene Router bzw. der DNS-Server des Providers)
options {
...
forwarders {
5.9.164.112;
80.241.218.68;
192.168.1.1;
};
...
};
Meine Quelle und weitere DNS-Server findet ihr auf https://www.kuketz-blog.de/empfehlungsecke/#dns.
Danach erstellen wir die jeweiligen Zonen. Wenn wir binden die entsprechenden Schlüsseldateien noch nicht eigebunden haben, tun wir es hier.
... include "/usr/local/etc/namedb/meinedomain.de.key"; ...
Primäre Zonen
Jetzt erstellen wir die Zone. Diese fügen wir am besten am Ende der Datei ein.
zone "meinedoamin.de" {
type primary;
allow-update {
"meinedomainde-key";
};
file "/usr/local/etc/namedb/primary/meinedomain.de";
allow-transfer {
192.168.1.253; // IP Adressen der Sekundären Server,
// die die Zone kopieren dürfen, kommen hier hin.
};
};
Es fehlt nur noch die Reverse Lookup Zone. Die Der IP-Adressbereich wird hier in umgekehrter Reihenfolge angegeben.
zone "1.168.192.in-addr.arpa" {
type primary;
allow-update {
key "meinedomainde-key";
};
file "/usr/local/etc/namedb/dynamic/1.168.192.in_addr.arpa";
allow-transfer {
192.168.1.253;
};
};
Sekundäre Zonen
In einer sekundären Zone wird eine andere Zone kopiert und deren Einträge zur Verfügung gestellt. Die Einträge in einer sekundären Zone sind nicht veränderbar, sie dienen aber der Redundanz. Eine sekundäre Zone sieht in der /usr/local/etc/namedb/named.conf wie folgt aus.
zone "meinedomain.de" {
type secondary;
file "/usr/local/etc/namedb/secondary/meinedomain.de";
primaries {
192.168.1.254; // Die IP-Adressen der primären Nameserver kommen hier hin
};
};
Erstellen der Zonendatei
Jede Zone beginnt mit einem TTL-Eintrag (time to live) bzw. wenn kein TTL angegeben wird mit einem SOA (Start Of Authority) Eintrag.
Der TTL Eintrag gibt an, wie lange diese Einträge gültig sind und im Cache gehalten werden sollen. Ein Beispiel für einen TTL Eintrag, der 3 Tage gültig ist, sieht wie folgt aus:
$TTL 3D
Der SOA sollte der erste Eintrag, bzw. der zweite Eintrag sein, wenn kein TTL angegeben ist, in der Datei sein. Er enthält den Domänennamen mit abschließenden "." (z. B. meinedomain.de.) oder "@" für die aktuelle Domäne, den Namen des primären DNS-Servers, den Namen des primären E-Mail-Servers, die Seriennummer der Zone und Angaben über die Lebensdauer der Zone.
Ein Beispiel SOA-Eintrag sieht wie folgt aus:
@ IN SOA ns1.meinedomain.de. mail.meinedomian.de. (
1 ; Seriennummer
1H ; Aktualisieren
1H ; Erneut Versuchen
1W ; Laeuft ab
1H ) ; Negatives Caching
Um diesen Eintrag zu erstellen, habe ich ein kleines Shell-Script geschrieben, dass ein SOA-Template für eine Zonendatei erstellt. mkzone
Erstellen der Forward Lookup Zone
Mit Hilfe der Forward Lookup Zone erfolgt die Auflösung der Host-Namen in IP-Adressen. Eine solche Zonendatei enthält neben den einzelnen Adresseinträgen, Einträge über die DNS- und Mail-Server der Domäne. Der Eintrag Host-Name '@' beschreibt die Domäne selbst.
Ein Beispiel für einen DNS-Eintrag (NS record) - Es sollte hier keine IP-Adresse, sondern ein Host-Name verwendet werden. Der Punkt am Ende des Host-Names ist zu beachten:
@ IN NS ns1.meinedomain.de.
Mail-Server werden in einem MX record abgebildet. Es sollten auch hier keine IP-Adressen verwendet werden, sondern Hostnamen. Die Zahl gibt die Priorität des Mail-Servers an.
@ IN MX 30 mail.meinedomain.de.
Dann sind da noch die Adresseinträge. Diese werden mit A für IPv4 bzw. AAAA für IPv6, gefolgt von der Adresse, angegeben.
ns1 IN A 192.168.1.254
ns1 IN AAAA fe80::1
Ein Beispiel für eine DNS-Zone gibt es hier zum Download.