Authorativ Nameserver on Fly.io

3 minute read

Intro

Es freut mich, dass ich positives von meiner über die Feiertage verfolgten Challenge zu berichten habe. Und zwar: das selbst-hosten eines autoritativen Nameservers. Aber bitte, wie im vorherigen Post beschrieben, global verteilt sowie den Einsatz von Anycast. Das zur Verfügung stehende Budget: ~30€ Monat.
Was sonst treibt man über Neujahr! :-)

Wieso?

So toll ich Cloudflare persönlich finde, ist es doch auch eine gewisse Gefahr für das freie und unabhängige Internet. Services werden zentralisiert und insofern die Proxy-Funktionalität genutzt wird kann Cloudflare hypothetisch sämtlichen Datenverkehr mitlesen. Dazu noch handelt es sich um ein US-Amerikanisches Unternehmen. Genug Gründe um seine eigene Lösung aufzubauen.

Bausteine

Authorativer Nameserver

Zum ersten benötigen wir einen autoritativen Nameserver, also eine Software, die delegiert wird, um Anfragen über eine gewisse Domain zu beantworten. Es stehen Tools wie Bind, CoreDNS oder auch Microsoft DNS zur Verfügung. Eingesetzt wird jedoch: PowerDNS - die Vorteile: OpenSource, häufig Aktualisierungen, gute Community, gute Container-Kompatiblität.

Datenbackend

PowerDNS unterstützt eine Vielzahl an unterschiedlichen “Backends”. Ein Backend beschreibt einen Ort, an welchen der eigentliche Inhalt (Domain, Zonen-Infos, Einstellungen) gesichert werden. Eine moderne und schnell skalierbare Datenbank die sich hierfür besonders eignet ist Postgres . Zu unserem Glück bietet die ausgewählte Plattform eine “semi-managed” Version von Postgres, siehe nächster Abschnitt.

Plattform

Die Anforderungen an unsrer Plattform sind hoch: Skalierbarkeit natürlich global, Anycast-IP fähig, Budget von nur 30€, Postgres DB - um die wichtigsten aufzuzählen. Im Intro wurde bereits auf das vorherige Post verwiesen, wo Fly.io als Alternative zu Google Cloud erwähnt wird. Die Entscheidung fällt also leicht zugunsten: fly.io
Fly.io bietet eine Plattform basierend auf Nomad (ähnlich Kubernetes) als Service an. Global sind aktuell 26 Lokationen verfügbar, eine Anycast-IP ist gratis dabei und Postgres wird unterstützt. Cool!

Security

Ein immer wichtig werdender Teil der IT-Landschaft. Ich setzte deshalb DNSDIST als Einstiegspunkt vor unseren autoritativen Nameserver ein. Selbst beschreibt sich DNSDIST wie folgt:

“dnsdist is a highly DNS-, DoS- and abuse-aware loadbalancer. Its goal in life is to route traffic to the best server, delivering top performance to legitimate users while shunting or blocking abusive traffic."

Dashboard

Ach ja, bedienen wollen wir die Umgebung ja auch. Dazu setzen wir PowerDNS-Admin ein. Als zentrale Konfigurations-Oberfläche können dort alle Einstellungen bzw. Records erstellt und verändert werden.

Worker

Eine kleine Instanz, um interne Tasks (Cronjob) ausführen zu können. Nothing special…

Architektur

Bilder sagen mehr als Worte, nachfolgend der Überblick des Gesamtkonstruktes.

flyio-pdns-architecture

Um Kosten zu sparen agiert DNSDIST sowohl als autoritativer als auch recursiver DNS Proxy. Dazu müssen jedoch die Domainen der selbst-gehosteten PowerDNS-Instanz in Form einer Liste zur Verfügung gestellt werden. Um das zu automatisieren, stellt der Worker diese automatisch via HTTP Endpoint bereit. Die DNSDIST Instanzen holen die Info beim Start automatisch ab. Yes! :-)

Metriken

Fly.io bietet (während der Preview Phase) eine kostenlose Prometheus- und Grafana-Lösung an. Es müssen lediglich die Metriken der Anwendung via /metrics Endpoint freigegeben werden, sowie in der Fly.io Konfiguration definiert werden, zB:

[metrics]
  port = 8083
  path = "/metrics"

Es werden sowohl von PowerDNS, also auch DNSDIST sämtliche Metriken gesammelt und visualisiert:

flyio-grafana-dashboard

Opensource

Die erwähnten Tools und Softwarekomponenten sind für nicht-kommerziellen Einsatz frei nutzbar (Irrtum und nachträgliche Änderungen vorbehalten). Um einen optimalen Betrieb auf fly.io zu ermöglichen ist das Erstellen von Container-Instanzen erforderlich. Auch ist der ein, oder andere Tweak erforderlich. Die fertige Lösung, wie sie aktuell eingesetzt wird, ist hier verfügbar:

Kosten

Alle Instanzen, bis auf das Dashboard (PowerDNS-Admin) kommen mit der kleinsten Instanz aus. Das ergibt:

  • DNSDIST: 6 Instanzen * 1,9 USD
  • PDNS-Auth: 3 Instanzen * 1,9 USD
  • Postgres: 4 Instanzen * 1,9 USD
  • PDNS-Admin: 1 Instanz * 3,2 USD

Enthalten (kostenfrei): 160 GB Datenverkehr, 1x Anycast IP, sowie 3x SSL Zertifikat
Gesamt: 27,9 USD
(6 Lokationen weltweit und hoch-verfügbar)

Stay tuned

Im nächsten Post möchte ich euch eine Schritt-für-Schritt-Anleitung für die Installation zur Verfügung stellen. Stay Tuned!