Logbuch#dns#security#netzwerk#docker
Zwei DNS-Leaks, ein eigener Resolver
Von Niclas Hennrich · veröffentlicht · geschehen am
Etwas ist ausgefallen oder kaputtgegangen.
- geschlossene DNS-Leaks
- 2
- Memory-Limit für Unbound
- 128MB
Bis August fragte mein Pi-hole einen öffentlichen Resolver als Upstream. Ich wollte davon weg — Unbound als rekursiver Resolver, der die DNS-Hierarchie selbst abfragt, statt jede Anfrage einem Anbieter zu zeigen. Beim Umbau sind mir zwei Dinge aufgefallen, die schon vorher falsch waren.
Leak 1: Eine interne Adresse in der öffentlichen Zone. Der Hostname
meines Mealie-Servers hatte einen A-Record in der öffentlichen DNS-Zone
meiner Domain — mit der LAN-Adresse als Ziel. Jeder konnte nachschlagen,
unter welcher privaten Adresse bei mir ein Dienst läuft. Der Record diente
nur dazu, den Namen aufzulösen; dass dafür die öffentliche Zone herhielt,
war der Fehler. Das Zertifikat brauchte ihn nie: Dessen Erneuerung läuft
über DNS-01, also TXT-Records, und lief unverändert weiter. Der A-Record ist
raus; den Namen beantwortet jetzt Pi-hole lokal per host-record.
Leak 2: fritz.box ist eine echte Domain. AVM betreibt .box
öffentlich. Ein rekursiver Resolver kennt keinen lokalen Router-Namen und
fragt brav nach draußen — die Anfrage nach dem eigenen Router landete also
im Internet. Gelöst per address=/fritz.box/… in Pi-hole, für A und
AAAA: Mit nur einem IPv4-Eintrag leakt die IPv6-Auflösung weiter. (Das hatte
ich Ende Juli schon gesetzt; beim Unbound-Umbau wurde es Teil der
Split-Horizon-Regeln.)
Der Umbau selbst: Unbound (klutchell/unbound) als zweiter Container im
Pi-hole-Compose-Stack, eigenes Docker-Netz, der Pi-hole-Upstream zeigt auf
den Unbound-Container. Für den Pi mit 1 GB RAM: Memory-Limit 128 MB, kleine
Caches (16/32/8 MB), IPv6-Rekursion aus. Dazu Hardening —
qname-minimisation, harden-below-nxdomain, aggressive-nsec,
hide-identity/hide-version. Und ein Detail, das man kennen muss:
private-domain für die eigene interne Domain. Sonst filtert der
Rebind-Schutz von Unbound jede Antwort mit privater Adresse weg, und die
lokalen Namen sind plötzlich unauflösbar.
Was ich mitnehme: Ein rekursiver Resolver braucht explizite Split-Horizon-Regeln für alles Lokale, sonst gewinnt die öffentliche Sicht. Und interne Hosts gehören nie in eine öffentliche Zone. Die Compose-Basis dazu: Pi-hole mit Docker Compose betreiben — der Guide stellt die Upstream-Frage genau an dieser Stelle.