Auch die DNS-Infrastruktur für mein Netzwerk betreibe ich selbst. Das heißt, sowohl die Nameserver für die öffentlichen und privaten Domains, als auch die Resolver, die alle meine Geräte ausschließlich benutzen. Hier möchte ich das Setup mal kurz vorstellen.
Motivation
Wie immer – Lerneffekt, #ownyourdata und zeigen, dass das Internet ein dezentraler Ort ist. Datenschutz ist nämlich auch und vor allem bei DNS-Anfragen wichtig.
Übersicht
Es gibt 3 Server:
ns1.berrnd.net
ist primärer autoritativer Server für die eigenen Domains und Resolverns2.berrnd.net
ist sekundärer autoritativer Server für die eigenen Domains und ebenfalls Resolverns3.berrnd.net
ist tertiärer autoritativer Server für die eigenen Domains und kein Resolver
Alle Server sind dabei LXC Container unter Proxmox, die jeweils einen CPU-Kern und 256 MB RAM zugeordnet haben.
Verwendete Software
Ich verwende für mein Setup das komplette Programm von PowerDNS:
- PowerDNS Authoritative Server für die eigenen Domains
- PowerDNS Recursor für den Resolver-Job
- dnsdist als „Frontend“, nur dnsdist ist von außen erreichbar und verteilt entsprechend ob die Anfrage eine eigene Domain betrifft oder nicht
- Eine angepasste Version, erweitert um z. B. Dynamic DNS Support, von nsedit zur Verwaltung über eine komfortable Weboberfläche
Die Konfiguration
Die Konfigurationen sind auf allen 3 Servern komplett gleich, bis auf den Unterschied Master-/Slave Betrieb und dass einer kein Resolver ist, die folgenden Konfigurationen beziehen sich auf ns1.berrnd.net
.
PowerDNS Authoritative Server läuft auf Port 1053 und ist nur von lokal erreichbar. Die wichtigsten von mir angepassten Einstellungen sind nachfolgend aufgeführt:
allow-axfr-ips=127.0.0.0/8,::1 any-to-tcp=yes api=yes api-key=xxxx daemon=yes launch=gsqlite3 gsqlite3-database=/etc/powerdns/pdns.db gsqlite3-dnssec=on gsqlite3-pragma-synchronous=0 local-address=127.0.0.1 local-port=1053 master=yes setgid=pdns setuid=pdns trusted-notification-proxy=127.0.0.1
PowerDNS Recursor läuft auf Port 2053 und ist ebenfalls nur von lokal erreichbar. Auch hier habe ich nur die nötigen Einstellungen wie folgt angepasst:
allow-from=127.0.0.0/8,::1/128 any-to-tcp=yes api-key=xxxx api-readonly=yes daemon=yes local-address=127.0.0.1 local-port=2053 lowercase-outgoing=yes setgid=pdns setuid=pdns
dnsdist läuft auf dem DNS-Standardport 53 und ist selbstverständlich öffentlich erreichbar. Dieser Dienst verteilt die Anfragen an die beiden anderen Dienste, die Konfigurationsdatei sieht bei mir wie folgt aus:
setLocal("0.0.0.0:53") setACL({"0.0.0.0/0"}) newServer({address="127.0.0.1:1053", pool="authoritative"}) newServer({address="127.0.0.1:2053", pool="recursor"}) webserver("0.0.0.0:8103", "xxxx") -- Block hosts that exceeded 100 queries in 10 seconds for 30 minutes function maintenance() addDynBlocks(exceedQRate(100, 10), "Exceeded query rate", 1800) end -- Allow AXFR to ns2.berrnd.net and ns3.berrnd.net addAction(AndRule({OrRule({QTypeRule(dnsdist.AXFR), QTypeRule(dnsdist.IXFR)}), NotRule(makeRule({"ipv4.of.ns2.xx/32", "ipv4.of.ns3.xx/32"}))}), RCodeAction(dnsdist.REFUSED)) -- Allow NOTIFY from ns2.berrnd.net and ns3.berrnd.net addAction(AndRule({OpcodeRule(DNSOpcode.Notify), NotRule(makeRule({"ipv4.of.ns2.xx/32", "ipv4.of.ns3.xx/32"}))}), RCodeAction(dnsdist.REFUSED)) addAction("berrnd.de.", PoolAction("authoritative")) addAction("berrnd.org.", PoolAction("authoritative")) addAction("berrnd.net.", PoolAction("authoritative")) -- ... other domains ... addAction(AllRule(), PoolAction("recursor"))
Auf die Konfiguration von nsedit und einem entsprechenden Webserver gehe ich hier nicht konkreter ein, das ist nicht mehr wie bei jeder gewöhnlichen PHP Webanwendung.
Fazit
Bei mir läuft dieses Setup schon seit einigen Jahren (nicht in konkret dieser Form schon seit Anfang) absolut stabil und performant.
Wie für die meisten meiner Dienste, gibt es auch für die Nameserver kleine Infoseiten – siehe z. B. https://ns1.berrnd.net.