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. Wobei diese Resolver auch öffentlich erreichbar sind, weil warum nicht. Hier möchte ich das Setup mal kurz vorstellen.
Motiviation
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:
ns-grandmajor.berrnd.net
ist primärer autoritativer Server für die eigenen Domains, kein Resolverns-major.berrnd.net
ist sekundärer autoritativer Server für die eigenen Domains sowie öffentlicher Resolverns-minor.berrnd.net
ist tertiärer autoritativer Server für die eigenen Domains sowie ebenfalls öffentlicher 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 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 ns-major.berrnd.net
.
PowerDNS Authoritative 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 ns-minor.berrnd.net and ns-grandmajor.berrnd.net addAction(AndRule({OrRule({QTypeRule(dnsdist.AXFR), QTypeRule(dnsdist.IXFR)}), NotRule(makeRule({"ipv4.of.ns-minor.xx/32", "ipv4.of.ns-grandmajor.xx/32"}))}), RCodeAction(dnsdist.REFUSED)) -- Allow NOTIFY from ns-minor.berrnd.net and ns-grandmajor.berrnd.net addAction(AndRule({OpcodeRule(DNSOpcode.Notify), NotRule(makeRule({"ipv4.of.ns-minor.xx/32", "ipv4.of.ns-grandmajor.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.
Und wer meine Resolver verwenden will, warum auch immer – gerne doch – für weitere Informationen einfach die o. g. Servername im Browser aufrufen. Wie für die meisten meiner Dienste, gibt es auch für DNS-Server kleine Infoseiten – siehe z. B. https://ns-major.berrnd.net.