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-Server zu betreiben.
Es wird davon ausgegangen, dass das FreeBSD-Basissetup bereits abgeschlossen ist und dem Rechner eine statischen 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.
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.
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
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 {
any;
};
...
};
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)
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. Wir binden die zuerst die entsprechenden Schlüsseldateien ein.
include "/usr/local/etc/namedb/meinedomain.de.key";
Primäre Zonen
Bevor wir die Zonen erstellen und dynamische Updates der Zone haben wollen, importieren wir den zuvor erstellten Schlüssel.
include "/usr/local/etc/namedb/meinedomain.de.key";
Jetzt erstellen wir die Zone. Diese fügen wir am besten am Ende der Datei ein.
zone "meinedoamin.de" {
type primary;
allow-update {
key "meinedomainde-key";
};
file "/usr/local/etc/namedb/dynamic/meinedomain.de";
};
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";
};