Eigene Nameserver & Resolver – Mein Setup

PowerDNS Authoritative, PowerDNS Recursor & dnsdist self-hosted

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 Resolver
  • ns2.berrnd.net ist sekundärer autoritativer Server für die eigenen Domains und ebenfalls Resolver
  • ns3.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:

nsedit 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"))

dnsdist WeboberflächeAuf 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.