Login
Login-Name Passwort


 
Newsletter
Werbung

Do, 21. November 2013, 15:00

PowerDNS – die andere VerBINDung

Für ein Projekt, bei dem – skriptgesteuert – DNS-Einträge gesetzt werden sollten, war der Autor auf der Suche nach einer gangbaren Lösung.

Zunächst, was ist DNS überhaupt?

Ein Mensch kann sich Namen wesentlich leichter merken als Nummern, ein Computer jedoch kommt mit Nummern wesentlich besser klar als mit Namen. Für einen Menschen ist es somit am einfachsten, sich www.freiesmagazin.de zu merken, ein Computer muss aber wissen, dass es sich dabei um die IP-Adresse 46.4.183.98 handelt. Diese Zuordnung von Name zu Adresse macht das »Domain Name System«, kurz DNS.

Das DNS besteht aus vielen tausenden Rechnern, sogenannten Nameservern. Diese Nameserver verwalten jeweils eine (oder mehrere) Zonen, für die sie zuständig sind. Es gibt z.B. Nameserver, die für freiesmagazin.de zuständig sind, andere sind für nbkr.net zuständig, und wieder andere sind für alles, was mit de endet, zuständig. Eine Zone entspricht somit einem Teil einer Domain, es muss nicht immer die vollständige Domain sein, wie freiesmagazin.de, es könnte auch eine Subdomain wie home.nbkr.net sein.

Das System ist hierarchisch aufgebaut, d.h., der Server, der für de zuständig ist, würde eine Frage nach freiesmagazin.de mit einem Verweis auf den zuständigen Nameserver beantworten. Erst der zuständige Nameserver würde dann die gewünschte Antwort liefern.

Warum möchte man selbst einen Nameserver betreiben?

Der Betrieb eines eigenen Nameservers ist nicht trivial und lohnt sich für einen einzelnen Webauftritt in der Regel nicht. Muss man aber viele Domains verwalten, ist man mit eigenen Nameservern in der Regel flexibler, gerade was Automatisierung angeht.

Zum eigentlichen Projekt

Hintergrund ist die Automatisierung von Systeminstallationen. Der Autor wollte in der Lage sein, mit Hilfe eines Python-Skriptes virtuelle Server installieren zu lassen. Ein Teil davon ist das Setzen von DNS-Einträgen für die neuen Maschinen. Hierfür war es notwendig, dass das Skript diese Einträge automatisch setzen kann. Dafür wurde eine neue Lösung im Bereich DNS benötigt, denn wie in vermutlich vielen Umgebungen wurde bisher auf BIND als DNS-Server gesetzt.

Dieser Dinosaurier eines DNS-Servers leistet gute Dienste, kann seine Konfiguration aber erst mal nur aus Zonendateien – einfachen Textdateien, die keiner strengen Formatierung folgen – lesen.

Solche Textdateien sind mit einem Skript schwer zu bearbeiten: Üblicherweise hat ein solches Skript sehr viele reguläre Ausdrücke, um nach den passenden Textstellen zu suchen, was die Wartbarkeit nicht gerade erhöht.

BIND9 bietet eine MySQL-Schnittstelle, so dass die Daten eben aus einer Datenbank statt aus einer Zonendatei gelesen werden. Leider ist diese Schnittstelle nicht bei jeder Distribution aktiviert und insbesondere im konkreten Fall, bei welchem Ubuntu 12.04 eingesetzt wurde, hätte das bedeutet, dass BIND selbst zu kompilieren gewesen wäre. Da BIND eine Software ist, bei der immer mal wieder gravierende Fehler auftreten, hätte man bei jeder neuen Version BIND erneut manuell kompilieren müssen. Entsprechend war selbst Kompilieren auch keine Lösung.

Wenn ein Admin vor einem entsprechenden Problem steht, tut er, was alle Menschen tun: Man benutzt eine Suchmaschine. Schnell ergab sich, dass PowerDNS ein vollwertiger Ersatz für BIND sein kann und es darüber hinaus auch mit verschiedenen Datenbackends umgehen kann, u.a. mit MySQL, PostgreSQL und SQLite.

PowerDNS ist in den Paketquellen enthalten, unter Ubuntu 12.04 zeigte sich aber, dass nur eine etwas ältere Version 3.0 (aktuell ist 3.3) enthalten ist. Bei ersten Tests war erkennbar, dass diese Version einen Bug enthält. Glücklicherweise bietet die Homepage von PowerDNS die neueste Version auch als Paket an.

Das Paket enthält alle vorhandenen Backends, die gewünschte Datenbank muss man aber manuell einrichten. Man installiert also den MySQL-Server über die Paketverwaltung. Anschließend muss man zunächst die Datenbank selbst erzeugen, das Datenbankschema einspielen und die Berechtigungen für PowerDNS setzen.

Leider liefert weder das PowerDNS-Paket selbst noch die Version in den Paketquellen einen einwandfreien SQL-Dump. Somit muss man die Datenbank wirklich selbst erzeugen. Ausgehend vom Ubuntu-Paket und der PowerDNS-Dokumentation erhält man den folgenden Dump: powerdns_dump.sql.

Diesen Dump speichert man als sql.dump und kann ihn dann in eine neue Datenbank einfügen. Der Einfachheit halber nennt man diese Datenbank dns. Die notwendigen Kommandos sind entsprechend:

$ mysql -u root -p -e "CREATE DATABASE dns;"
$ mysql -u root -p < ./sql.dump dns

Nun gilt es nur noch, PowerDNS den Zugriff auf diese Datenbank zu gewähren:

$ mysql -u root -p
> GRANT ALL ON dns.* TO pdns@localhost IDENTIFIED BY 'neuespasswort';
> FLUSH PRIVILEGES;

Jetzt, da die Datenbank eingerichtet ist, muss man PowerDNS an diese anbinden. Dies bewerkstelligt man über die Konfigurationsdatei /etc/powerdns/pdns.conf. Am Ende dieser Datei fügt man ein:

gmysql-host=localhost
gmysql-dbname=dns
gmysql-user=pdns
gmysql-password=neuespasswort
gmysql-dnssec=no

Darüber ist es von Vorteil, die folgenden Einträge ebenfalls zu setzen.

default-soa-mail=root.example.com
default-soa-name=ns1.example.com
soa-expire-default=604800
soa-minimum-ttl=3600
soa-refresh-default=10800
soa-retry-default=3600

Der Sinn dieser Einträge wird später im Artikel erkennbar.

Abschließend muss man PowerDNS noch mitteilen, dass es das MySQL-Backend auch starten soll. Hierfür sucht man in der Konfigurationsdatei nach dem Stichwort launch=, entfernt gegebenenfalls das Kommentarzeichen und fügt gmysql an.

Anschließend kann man PowerDNS über das Init-Skript neu starten. Die weitere Konfiguration, also das Hinzufügen von Domains und DNS-Einträgen, kann live erfolgen.

Um eine neue Domain zu konfigurieren, muss man diese einerseits in der domains-Tabelle anlegen, andererseits sind bestimmte Mindest-Records zu setzen.

Um beispielsweise die Domain example.com zu konfiguieren, würde man zunächst diese Domain in die domains-Tabelle eintragen. Hierfür startet man den MySQL-Client und wechselt zur Datenbank dns:

$ mysql -u pdns -p
> use dns;

Nun kann man den Eintrag hinzufügen:

> INSERT INTO domains (name, type) VALUES ('example.com', 'NATIVE');

Der Wert von type bestimmt dabei, ob die Domain nur von diesem Nameserver verwaltet wird (NATIVE), ob dieser Nameserver der Master einer Domain ist (MASTER) und somit bei Updates die Slaves benachrichtigen soll, oder ob es sich um einen Slave (SLAVE) handelt.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung