Ein Hinweis vorweg: Dieser Post soll explizit keine Anleitung zum Nachbauen sein. Er ist mehr als Beispiel gedacht, wie ich meine persönlichen Anforderungen gelöst habe. PowerDNS ist ein sehr mächtiges Tool und bietet viele Möglichkeiten, Probleme auf verschiedene Arten zu lösen. Am Ende muss jeder selbst entscheiden, was seiner Meinung nach einer idealen Konfiguration entspricht und ob man diese so dem „großen bösen Internet“ überlassen möchte.

Einleitung

Sollte man seine authorativen DNS-Server selbst betrieben?
In den meisten Fällen vermutlich nicht.
Mache ich es trotzdem? Klar. Warum? Eine gute Frage…

Ich bin, wie man ggf. in einigen anderen Posts schon gemerkt hat, generell ein Freund davon, wichtige Dienste unter meiner eigenen Kontrolle zu haben. Dadurch kann ich sie genau so anpassen, wie ich es benötige. Meine Infrastruktur ist mittlerweile zu einem Großteil automatisiert, damit ich meine Freizeit nicht nur noch mit deren Verwaltung verbringe. Mein Registrar, bei dem ich fast alle meine Domains beziehe, hat jedoch zum Beispiel keine sonderlich schöne API um DNS-Einträge zu verwalten. Das ist in solch einem Fall natürlich hinderlich.

Aus diesem Grund habe ich lange Zeit Cloudflare als meinen DNS-Anbieter verwendet. Das Free-Paket mit den enthaltenen Features ist durchaus gut nutzbar und es gibt eine schöne API. Nach dem zweiten größeren Ausfall von Cloudflare merkt man dann jedoch, dass es vielleicht gar keine so gute Idee ist, dass gefühlt das halbe Internet auf einmal wieder an einem Anbieter hängt. Aus diesem Grund und auch der Tatsache, dass mich das Thema generell aus der technischen Perspektive interessiert, landete es irgendwann auf meiner ToDo-Liste.

Planung

Was muss man also alles beachten, wenn man so einen Dienst wirklich selbst betreiben möchte?

Meiner Meinung nach sollte man wissen was man macht, bevor man es macht. Entsprechend hat das Thema bei mir damit angefangen, dass ich mich erstmal Abends (bei einem guten Tee) in „best practices“ zu DNS sowie in die Dokumentation meiner Wunschsoftware (PowerDNS) eingelesen habe. Dabei hat sich auch schon ein mehr oder weniger fertiges Konzept in meinem Kopf gebildet, bei dem ich der Meinung bin, dass es so durchaus vertretbar ist.

Basierend auf meiner Ausgangsposition war klar: Es muss hochverfügbar, fehlertolerant und relativ günstig sein. Diese Dinge müssen sich in diesem Fall nicht unbedingt gegenseitig ausschließen.

Um die Anforderungen zu erfüllen, nutze ich zwei kleine vServer bei unterschiedlichen Anbietern (Hetzner und Netcup) an unterschiedlichen Standorten (Nürnberg und Falkenstein). Zusätzlich stehen beide Server in unterschiedlichen Top-Level-Domains (.dev und .re), um auf diese Art sogar den theoretischen Ausfall einer ganzen Registry kompensieren zu können.

Auf jedem der beiden Server läuft eine MariaDB-Instanz und ein PowerDNS mit minimal nötiger Konfiguration. Dabei ist ns1 das Hauptsystem, das auch für die Verwaltung zuständig ist. ns2 hostet lediglich ein read-only Replika der PowerDNS-Datenbank und PowerDNS selbst. Beide von außen erreichbaren PowerDNS-Instanzen haben nur leserechte auf die Datenbank und keine aktivierten Sonderfunktionen wie z.B. die HTTP API. Sie fungieren lediglich als „dumme“ Resolver.

Auf ns1 läuft zusätzlich innerhalb von Docker in einem getrennten Docker-Netzwerk eine weitere PowerDNS-Instanz, diesmal mit Schreibzugriff auf die DB und aktivierter HTTP API, sowie eine Instanz von PowerDNS-Admin für die Verwaltung. Nach außen ist PowerDNS-Admin über einen Nginx Reverse-Proxy erreichbar, der sich um Dinge wie TLS-Termination und Logging kümmert. Zwischen beiden vServern existiert ein WireGuard-Tunnel für den Replikationsverkehr von MariaDB.

PowerDNS-Admin ist ein mächtiges Verwaltungs-Toolkit für PowerDNS. Es sorgt z.B. für volle Mandantenfähigkeit, was die Verwaltung der Zonen angeht, kann auf einzelne Zonen beschränkte API-Keys erstellen und stellt nicht zuletzt auch ein sehr übersichtliches Webinterface für die allgemeine Verwaltung zur Verfügung.

Als Diagramm sieht mein fertiges Konzept also dann wie folgt aus:

Security-Überlegungen

Wenn man so einen Dienst öffentlich betreibt, sollte man sich auch einige Gedanken zum Thema Security machen. Man möchte schließlich nicht, dass die eigene Infrastruktur sofort vom nächstbesten Scanner übernommen oder für DDoS missbraucht wird.

Entsprechend gilt es, die gängigen Regeln zu beachten:

  • Nur absolut notwendige Dienste sind von extern zu erreichen.
  • Alle Dienste, die von extern zu erreichen sind, werden maximal gehärtet.
  • Sichere Passwörter und 2FA immer und überall (in diesem Fall z.B. bei PowerDNS-Admin).
  • Sämtliche Software immer auf dem neusten Stand halten und Patches zeitnah installieren.

Bei DNS kommen nochmal einige Besonderheiten hinzu, die einen selbst sowie andere vor Problemen bewahren:

  • Der Zonentransfer (AXFR) sollte, sofern nicht benötigt, deaktiviert oder zumindest auf bestimmte IPs eingeschränkt werden. Auf diese Weise verhindert man zumindest schon mal, dass von extern alle DNS-Einträge (ganze Zonen) auf einmal abgerufen werden können.
  • In PowerDNS sollte man entsprechende Ratelimits konfigurieren, um es Angreifern möglichst schwer zu machen, die eigenen Server für DNS-Reflection-Angriffe (DDoS Amplification) zu missbrauchen.

Fazit

Mit ein bisschen Einfallsreichtum, der richtigen Planung und der jeweiligen Dokumentation lässt sich eine solche Idee durchaus in die Tat umsetzen. Dadurch ergeben sich unzählige Möglichkeiten, das System an die eigenen Bedürfnisse anzupassen. Weiterer DNS-Server nötig? Kein Problem. Das alles kann sofern nötig automatisiert werden.

Mittlerweile betreibe ich meine beiden DNS-Server seit knapp zwei Monaten produktiv und habe auch schon die ersten Ausfälle ohne Probleme überstanden. Beide vServer waren zwischenzeitlich mal kurz wegen Problemen am jeweiligen Hostsystem offline, durch die Trennung der beiden Instanzen war eine Auflösung der Domains trotzdem jederzeit möglich.

Da PowerDNS sehr ressourcenschonend ist und ich ohnehin nicht viele DNS-Anfragen erwarte, kann ich die kleinsten vServer nutzen, die der jeweilige Hoster anbietet. Damit komme ich zusammen auf Kosten von ca. 6 € / Monat, was sich meiner Meinung nach noch durchaus sehen lassen kann.

Kategorien: CloudDocker