Zum Inhalt springen
SONOYA.com
Raspberry Pi & Linux

Pi-hole mit Unbound: eigener DNS-Resolver ohne Google

Pi-hole 6 mit Unbound auf dem Raspberry Pi kombinieren: Werbung filtern und DNS selbst auflösen, ohne Google, Cloudflare oder den Provider zu fragen.

Von

DNS-Symbol auf dunkelrotem Verlauf für Pi-hole mit Unbound als eigenem DNS-Resolver auf dem Raspberry Pi im Heimnetz

Jedes Mal, wenn ein Gerät in Deinem Netz eine Website, eine App oder einen Smart-Home-Dienst anspricht, fragt es zuerst einen DNS-Server nach der passenden IP-Adresse. Diese Anfragen landen normalerweise bei Deinem Internetanbieter oder bei Google und Cloudflare, wenn Du die einmal eingetragen hast. Wer diese Server betreibt, sieht damit eine ziemlich vollständige Liste der Dienste, die Du und Deine Geräte nutzen.

Pi-hole ist vielen als Werbeblocker für das ganze Heimnetz bekannt. Es filtert Werbe- und Tracking-Adressen, reicht alle anderen Anfragen aber weiter, standardmäßig an einen dieser großen Anbieter. Mit Unbound änderst Du genau diesen letzten Schritt: Dein Raspberry Pi fragt nicht mehr einen zentralen Dienst, sondern löst jede Adresse selbst auf, beginnend bei den Root-Servern des Internets. Es gibt dann keinen einzelnen Anbieter mehr, der alle Deine Anfragen sieht.

Diese Anleitung richtet Pi-hole 6.5 und Unbound 1.22 aus den Debian-Paketquellen auf Raspberry Pi OS auf Basis von Debian 13 ein. Grundlage ist die offizielle Anleitung von Pi-hole zu Unbound.

Was Unbound bringt und was nicht

Ehrlichkeit vorab, damit Du die Erwartungen richtig setzt:

  • Du gewinnst Unabhängigkeit. Kein einzelner Anbieter sammelt mehr alle Deine DNS-Anfragen. Unbound fragt für jede Domain direkt die Server, die für sie zuständig sind.
  • Du gewinnst DNSSEC-Prüfung. Unbound prüft die Signaturen von Domains, die DNSSEC nutzen, und verwirft gefälschte Antworten.
  • Die Anfragen sind nicht verschlüsselt. Unbound spricht mit den zuständigen Servern über das klassische, unverschlüsselte DNS. Dein Internetanbieter könnte also mitlesen, welche Domains aufgelöst werden. Wer das verhindern will, braucht stattdessen einen verschlüsselten Weiterleiter und vertraut dann wieder dessen Betreiber.
  • Die erste Anfrage ist langsamer. Eine Domain, die noch niemand in Deinem Netz aufgerufen hat, braucht beim ersten Mal einige hundert Millisekunden. Danach liegt sie im Zwischenspeicher, und die Antwort kommt sofort.

Was Du brauchst

Pi-hole installieren

Melde Dich per SSH am Pi an und starte das offizielle Installationsskript:

Code
curl -sSL https://install.pi-hole.net | bash

Der Installer führt Dich durch einige Fragen. Bei der Frage nach dem Upstream-DNS-Anbieter kannst Du irgendeinen wählen, er wird gleich durch Unbound ersetzt. Alle anderen Fragen beantwortest Du mit den Vorgaben. Setze danach ein eigenes Passwort für die Weboberfläche:

Code
sudo pihole setpassword

Die Oberfläche erreichst Du unter http://IP-DES-PI/admin.

Prüfen, ob die Root-Server erreichbar sind

Unbound muss die Root-Server des Internets direkt erreichen können. Manche Router und Anbieter fangen DNS-Anfragen auf Port 53 ab und beantworten sie selbst. Die Pi-hole-Doku empfiehlt deshalb einen kurzen Test vorab. Installiere zuerst das Werkzeug dig:

Code
sudo apt install dnsutils

Dann fragst Du einen Root-Server direkt:

Code
dig @198.41.0.4 . NS +norec +time=3

Schau Dir in der Ausgabe die Zeile mit flags: an. Steht dort aa und kein ra, antwortet tatsächlich der Root-Server, und alles ist in Ordnung. Steht dort ra, fängt jemand Deine Anfragen ab, und Unbound wird nicht zuverlässig funktionieren. Prüfe dann zuerst die Kindersicherung oder Filterfunktionen Deines Routers.

Unbound installieren und einrichten

Installiere Unbound aus den Paketquellen:

Code
sudo apt install unbound

Die Liste der Root-Server bringt das Paket dns-root-data automatisch mit und hält sie aktuell. Lege jetzt die Konfiguration für Pi-hole an:

Code
sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf

Füge diesen Inhalt ein. Er entspricht der Empfehlung aus der Pi-hole-Doku, gekürzt um die Kommentare:

Code
server:
    verbosity: 0
    interface: 127.0.0.1
    port: 5335
    do-ip4: yes
    do-udp: yes
    do-tcp: yes
    do-ip6: yes
    prefer-ip6: no
    harden-glue: yes
    harden-dnssec-stripped: yes
    use-caps-for-id: no
    edns-buffer-size: 1232
    prefetch: yes
    num-threads: 1
    so-rcvbuf: 1m
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: 172.16.0.0/12
    private-address: 10.0.0.0/8
    private-address: fd00::/8
    private-address: fe80::/10
    private-address: 192.0.2.0/24
    private-address: 198.51.100.0/24
    private-address: 203.0.113.0/24
    private-address: 255.255.255.255/32
    private-address: 2001:db8::/32

Die wichtigsten Zeilen: interface: 127.0.0.1 und port: 5335 sorgen dafür, dass Unbound nur für Pi-hole auf demselben Gerät erreichbar ist und nicht für das ganze Netz. harden-dnssec-stripped verwirft Antworten, bei denen die DNSSEC-Signatur entfernt wurde. prefetch erneuert häufig genutzte Einträge kurz vor ihrem Ablauf, damit sie nie aus dem Zwischenspeicher fallen. Die private-address-Zeilen verhindern, dass ein externer Server Dir eine Adresse aus Deinem eigenen Heimnetz unterschiebt. Hast Du kein IPv6 bei Deinem Anschluss, setzt Du do-ip6 auf no.

Der Debian-Stolperstein

Auf Debian und damit auch auf Raspberry Pi OS installiert Unbound einen Hilfsdienst, der Unbound ohne den Port 5335 als DNS-Server des Systems einträgt. Das führt zu merkwürdigen Fehlern. Prüfe, ob er aktiv ist:

Code
systemctl is-active unbound-resolvconf.service

Steht dort active, schaltest Du ihn ab und verhinderst, dass seine Konfiguration erneut erzeugt wird:

Code
sudo systemctl disable --now unbound-resolvconf.service
sudo sed -Ei 's/^unbound_conf=/#unbound_conf=/' /etc/resolvconf.conf
sudo rm /etc/unbound/unbound.conf.d/resolvconf_resolvers.conf

Die letzten beiden Befehle melden einen Fehler, wenn die Dateien bei Dir nicht existieren. Das ist dann kein Problem. Starte Unbound neu:

Code
sudo systemctl restart unbound

Unbound testen

Frag Unbound direkt nach einer Domain:

Code
dig pi-hole.net @127.0.0.1 -p 5335

Die erste Antwort kann eine Sekunde dauern, in der Ausgabe muss status: NOERROR und eine IP-Adresse stehen. Wiederholst Du den Befehl, kommt die Antwort in wenigen Millisekunden aus dem Zwischenspeicher. Prüfe dann die DNSSEC-Validierung mit zwei Testdomains:

Code
dig fail01.dnssec.works @127.0.0.1 -p 5335
dig +ad dnssec.works @127.0.0.1 -p 5335

Die erste Domain hat absichtlich eine kaputte Signatur. Die Antwort muss status: SERVFAIL lauten, ohne IP-Adresse. Die zweite muss NOERROR liefern, und in der Zeile flags: muss ad stehen. Das bedeutet, Unbound hat die Signatur geprüft und für echt befunden.

Pi-hole auf Unbound umstellen

Öffne die Pi-hole-Weboberfläche, gehe zu Settings > DNS und entferne bei den vorgegebenen Upstream-Servern alle Haken. Trage stattdessen unter Custom DNS servers diesen Wert ein:

Code
127.0.0.1#5335

Klicke auf Save & Apply. Ab jetzt reicht Pi-hole alle Anfragen, die es nicht blockiert, an Unbound weiter.

Den Router auf Pi-hole zeigen lassen

Damit alle Geräte im Netz Pi-hole nutzen, muss Dein Router ihnen den Pi als DNS-Server mitteilen. Bei einer FRITZ!Box trägst Du unter Heimnetz > Netzwerk > Netzwerkeinstellungen in den IPv4-Einstellungen die IP-Adresse des Pi als Lokaler DNS-Server ein. Die Geräte übernehmen die Änderung, wenn sie ihre Adresse das nächste Mal neu beziehen. Am schnellsten geht das, indem Du WLAN kurz aus- und wieder einschaltest.

Hast Du IPv6 im Heimnetz, schau zusätzlich in die IPv6-Einstellungen. Gibt die FRITZ!Box sich dort selbst als DNSv6-Server bekannt, umgehen manche Geräte Pi-hole über IPv6. Trage dann auch dort die IPv6-Adresse des Pi ein. Sie beginnt meist mit fd und steht in Pi-hole unter Settings > System.

Prüfen, ob alles zusammenspielt

Öffne auf einem Gerät im Heimnetz ein paar Websites und schau danach in Pi-hole unter Query Log. Dort müssen die Anfragen Deines Geräts auftauchen, und in der Spalte für die Antwort steht bei nicht blockierten Domains, dass sie von 127.0.0.1#5335 beantwortet wurden.

Wenn es nicht klappt

Pi-hole meldet, dass kein Upstream-Server erreichbar ist. Prüfe mit systemctl status unbound, ob Unbound läuft. Startet es nicht, steht der Grund meist in sudo journalctl -u unbound -n 30. Häufigste Ursache ist ein Tippfehler in der Konfiguration. Mit sudo unbound-checkconf prüfst Du sie.

Manche Websites laden nicht mehr, dig liefert SERVFAIL. Wenn das nur bestimmte Domains betrifft, ist deren DNSSEC tatsächlich kaputt, und Unbound tut das Richtige. Betrifft es alle Domains, stimmt meist die Uhrzeit des Pi nicht. DNSSEC-Signaturen haben ein Ablaufdatum, und bei falscher Uhrzeit hält Unbound alle für ungültig. Prüfe mit timedatectl, ob die Zeit synchronisiert ist.

Das Internet ist komplett weg, wenn der Pi aus ist. Das ist der Preis eines einzelnen DNS-Servers. Trage im Router nur den Pi ein und keinen zweiten öffentlichen Server, sonst umgehen Geräte den Filter. Sorge stattdessen für eine stabile Stromversorgung und eine zuverlässige Speicherkarte oder SSD.

Fazit

Pi-hole mit Unbound ist eine der wirkungsvollsten Stunden, die Du in Dein Heimnetz stecken kannst. Werbung und Tracker sind für alle Geräte gefiltert, auch für Smart-TVs und Apps, und Deine DNS-Anfragen landen nicht mehr gebündelt bei einem großen Anbieter. Wenn Du den Pi-hole-Schutz auch unterwegs nutzen willst, kannst Du ihn über ein VPN wie Tailscale erreichbar machen, das Prinzip zeigt Home Assistant von unterwegs: Tailscale oder Cloudflare.

Weiterlesen.