Bisher habe ich als internen DNS-Resolver AdGuard Home eingesetzt. Das ist eine Alternative zu Pi-hole, die ebenfalls DNS-Blocking unterstützt. Die Wahl fiel damals auf AdGuard Home, da Pi-hole für eigene lokale Domains (die über einen anderen DNS-Server aufgelöst werden - das ist ein simpler bind9
-Server) eher hakelig war und sich AdGuard Home einfach runder angefühlt hat.
Mit der Zeit gefiel mir aber die Ressourcenauslastung von AdGuard Home nicht, sowohl CPU als auch RAM waren etwas höher, als ich es mochte. Außerdem fielen mir teilweise längere Antwortzeiten beim DNS auf, wobei ich da nicht hundertprozentig sagen kann, ob es an AdGuard Home lag oder etwas anderes dahinter steckte. Außerdem wollte ich bessere Metriken bekommen, am besten über einen Prometheus-kompatiblen Metrikendpunkt.
Suche nach einer Alternative
Bei der Recherche nach einer Alternative zu AdGuard Home habe ich mir Pi-hole noch einmal angesehen, hatte dort aber Probleme, meine beiden lokalen Zonen über einen anderen Server aufzulösen. Den Technitium DNS-Server habe ich mir auch angesehen, aber der gefiel mir von der Konfiguration her nicht und auch hier habe ich nicht sofort herausfinden können, wie ich eine lokale Domain anders auflöse. Ein Setup mit einem Server wie Bind oder dnsmasq wollte ich ebenfalls nicht, da mir das von der Konfiguration her für die Blocklisten (benötigt ja dann Skripte, die die blockierten Einträge importieren) nicht gefallen hat. Bei den meisten Lösungen war auch die Herstellung einer Redundanz über einen zweiten Resolver nicht einfach.
Meine Anforderungen
Hier einmal meine Anforderungen als Liste:
- Normale DNS-Auflösung und Caching
- Unterstützung von Block- und Allowlists, möglichst in einem der gängigen Formate, damit die bekannten Listen funktionieren
- Unterstützung von verschiedenen DNS-Servern für einzelne Domains, um lokale Domains an einen anderen Resolver weiterzuleiten
- Metriken als Prometheus-Endpunkt
- Redundanz über zweite Instanz auf anderem Host
Blocky - eine schlanke Alternative
Bei der Suche bin ich irgendwann auf Blocky gestoßen - das ist ein schlanker, in Go geschriebener DNS-Resolver, der als Alternative zu Pi-hole, AdGuard Home und co gedacht ist. Es gibt kein Webinterface, die Konfiguration findet über eine simple Yaml-Datei statt. Alle Features, die ich haben wollte, waren auch simpel einzurichten und funktionierten sofort. Die Performance ist ebenfalls super, gefühlt auch etwas flotter als AdGuard Home. Redundanz lässt sich simpel über das Kopieren der Config und Neustart vom Container lösen, das macht ein ganz einfaches Script alle x Stunden. Theoretisch könnte ich über Redis auch den Cache zentral halten, aber dafür müsste ich auch hier einen redundanten Redis-Service aufbauen - was ich hier auch einfach für Overkill halte.
Mein Erfahrung
Ich wollte Blocky erst einmal nur temporär zum Testen aktiv schalten - habe das dann aber vergessen. Nach ein paar Tagen fiel mir dann wieder ein, dass ich ja auf Blocky umgestellt hatte - bemerkt habe ich es ansonsten nicht. Was in diesem Fall ein wirklich gutes Zeichen ist. Blocky läuft bislang störungsfrei, liefert gute Metriken und benötigt wenig Ressourcen. Wir reden hier über ca 20MB RAM und vielleicht 0,1 % CPU-Auslastung von dem Container. AdGuard Home braucht, ohne aktive Clients seit einigen Tagen (aber auch ohne Neustart seit dem) grob 200MB RAM und hat immer wieder kurze Spikes auf >10 % CPU-Last, etwas was ich bei Blocky so überhaupt nicht wahrnehme.
Meine Konfiguration
Hier einmal die Konfiguration, wie sie bei mir jetzt seit einiger Zeit im Einsatz ist:
# ich habe leider kein ipv6, daher habe ich hier v6 vollständig deaktiviert und weiter unten auch AAAA-Records gefiltert.
connectIPVersion: v4
upstream:
default:
- 1.1.1.1
- 8.8.8.8
blocking:
blockType: nxDomain
blackLists:
ads:
- https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/Win10Telemetry
- https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/Phishing-Angriffe
- https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/malware
- https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/easylist
- https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/MS-Office-Telemetry
whiteLists:
ads:
- https://raw.githubusercontent.com/m0zgen/dns-hole/master/whitelist.txt
- https://raw.githubusercontent.com/m0zgen/dns-hole/master/vendors-wl/microsoft.txt
- https://raw.githubusercontent.com/m0zgen/dns-hole/master/vendors-wl/google.txt
- https://raw.githubusercontent.com/m0zgen/dns-hole/master/regex/common-wl.txt
clientGroupsBlock:
default:
- ads
caching:
cacheTimeNegative: 1m
filtering:
queryTypes:
- AAAA
# Konfiguration der lokalen Domains und Reverse-IP-Lookups zum DNS-Server unter 192.168.1.15
conditional:
fallbackUpstream: false
mapping:
home.local: 192.168.1.15
homelab.local: 192.168.1.15
179.168.192.in-addr.arpa: 192.168.1.15
178.168.192.in-addr.arpa: 192.168.1.15
ports:
dns: 53
http: 4000
bootstrapDns: 1.1.1.1
prometheus:
enable: true
path: /metrics
queryLog:
type: none