Was ein Nameserver ist, muss ich dir vermutlich nicht erklären. Als Bestandteil des Domain Name Systems übernimmt er die Übersetzung von Hostnamen in IP-Adressen. Dein Internet Service Provider stellt dir einen solchen automatisch zur Verfügung, wenn du über ihn ins Internet gehst, falls du einen Server mietest, werden dir auch hierfür in der Regel mindestens zwei zur Verfügung gestellt.
Warum also einen eigenen Nameserver betreiben? Nun, wir nutzen auf unserem FreeBSD-System mehrere Jails, die alle eine eigene IP-Adresse besitzen. Anfänglich mag es noch übersichtlich sein, wenn die Jails einfach nummeriert sind, allerdings kann sich das schnell ändern und dann ist ein "mysql.local" leichter zu merken als "10.0.0.1".
Ein sehr verbreiteter Nameserver ist BIND. Er kann sehr viel und ist über viele Jahre gereift. Für unsere Bedürfnisse ist er allerdings etwas zu komplex. Ich stelle dir daher meinen Favoriten vor: Unbound.
Unbound ist ein recht einfach zu bedienender Nameserver, der für uns die Namensauflösung übernehmen wird. Bei einer Anfrage prüft er, ob die notwendigen Daten bereits im Cache sind, falls nicht, fragt er bei weiteren Nameservern nach den entsprechenden Daten. Dabei können wir lokale Auflösungen definieren, sodass wir aus "10.0.0.1" problemlos ein "mysql.local" machen können.
Installation
Die Installation von Unbound ist wie immer einfach aus den Ports zu erledigen. Folgender Befehl reicht dafür aus, wobei wir die Optionen
- ECDSA
- LIBEVENT
- THREADS
im Konfigurationsfenster auswählen:
# cd /usr/ports/dns/unbound/ && make install clean
Nach der Installation müssen wir uns die Daten der zentralen Nameserver besorgen. Diese beziehen wir vom FTP-Server der InterNIC und legen sie in der Datei root.hints ab.
# fetch -o /usr/local/etc/unbound/root.hints ftp://ftp.internic.net/domain/named.cache
Zudem müssen wir noch initial den DNSSEC-Schlüssel beziehen und in der Datei root.key im unbound-Verzeichnis ablegen. Später werden wir Unbound so konfigurieren, dass dieser automatisch aktualisiert wird. Der Eintrag in der root.key sieht wie folgt aus:
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
Das ist der Wert von 2010 bis 2011, ist als Initialwert allerdings ausreichend.
Bevor wir uns nun an die Konfiguration machen, prüfen wir noch die Berechtigungen der einzelnen Dateien. Wichtig ist, dass der Benutzer unbound, der während der Installation angelegt wurde, Schreibberechtigung für die Datei root.key hat, da er diese später selbst aktualisieren wird. Zusätzlich benötigt er Leseberechtigung für die Datei unbound.conf, wobei als Gruppe daemon verwendet werden kann.
Konfiguration
Die Konfiguration von Unbound ist in zwei Teile unterteilt. Einerseits müssen wir natürlich Unbound selbst konfigurieren, andererseits müssen wir ihm mitteilen, welche Zonen er bereithalten soll und wie diese aussehen.
unbound.conf
Die Konfiguration von Unbound kannst du dir hier herunterladen, die wichtigsten Parameter schauen wir uns gemeinsam an.
- interface: die IP-Adresse, auf der Unbound Anfragen beantworten soll
- outgoing-interface: die IP-Adresse, über die Unbound Anfragen nach aussen schicken soll
- access-control: IP-Adressen bzw. Subnetze, die auf Unbound zugreifen dürfen
- num-threads: auch hier höchstens so viele Threads wie Cores in der CPU vorhanden sind
- private-address: je lokalem IP-Range eine Zeile
- private-domain: der lokale Domain-Name, bspw. local
Mit Hilfe des include-Befehls in der letzten Zeile laden wir die Zonen-Konfiguration, die wir im Dienste der Übersichtlichkeit in eine eigene Datei auslagern.
zones.conf
In der zones.conf, die wir selber anlegen, definieren wir nun welche Zonen es gibt, sowie die Domain-Namen und PTRs für die rückwärtige Namensauflösung.
Wir haben beispielsweise die Domain local definiert. Unser MySQL-Server soll demnach über mysql.local erreichbar sein. Hierfür definieren wir demnach folgendes, wobei der local-zone-Eintrag je Domain nur einmal angelegt werden muss:
local-zone: "local." static
local-data: "mysql.local. IN A 10.0.0.1"
local-data-ptr: "10.0.0.1 mysql.local"
Die IP-Adresse musst du natürlich entsprechend anpassen. In meinem Buch hat der MySQL-Server die IP-Adresse 10.0.0.1, daher auch hier dieses Beispiel. Achte auch unbedingt auf den Punkt hinter local in den Anweisungen local-zone und local-data.
rc.conf
In der /etc/rc.conf müssen wir lediglich folgende Zeilen eintragen:
unbound_enable="YES"
unbound_pidfile="/var/run/unbound.pid"
Jetzt können wir Unbound starten.
resolv.conf
Natürlich müssen wir unseren Jails bzw. unserem Host noch bekannt geben, welcher Nameserver ab sofort verwendet werden soll. Diese Einstellung nehmen wir in der Datei /etc/resolv.conf vor. Diese Anpassung muss in jeder /etc/resolv.conf wiederholt werden (sprich für die MySQL-Jail, die Mailserver-Jail etc.), wo Unbound zum Einsatz kommen soll.
Fazit
Wie du siehst ist Unbound sehr einfach zu konfigurieren. Für jeden Host unterhalb einer Domain trägst du einfach zwei Zeilen in die zones.conf ein und startest Unbound anschliessend neu. Das geht schnell und macht es dir leicht, die Einstellungen an einem zentralen Ort zu halten. Wenn du von nun an auf den MySQL-Server zugreifen willst, trägst du anstelle von 10.0.0.1 einfach mysql.local ein.