Zum Inhalt springen
labkompass

Logbuch#dns#security#netzwerk#docker

Zwei DNS-Leaks, ein eigener Resolver

Von Niclas Hennrich · veröffentlicht · geschehen am


ProblemBehoben

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.

Daraus entstanden