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. 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 Resolver
  • ns-major.berrnd.net ist sekundärer autoritativer Server für die eigenen Domains  sowie öffentlicher Resolver
  • ns-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

nsedit Weboberfläche auf "ns-major.berrnd.net"

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

dnsdist Weboberfläche auf "ns-major.berrnd.net"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.

Du möchtest mir hierzu Feedback hinterlassen? Dann schreib mir gerne eine Nachricht.