Raspberry Pi – unbound DNS Resolver mit Pi-Hole installieren und einrichten

Ziel: diese Anleitung soll dir zeigen, wie du den DNS Resolver unbound auf deinem Raspberry Pi mit laufendem Werbeblocker Pi-Hole installierst und einrichtest.

Was du hast: einen eingerichteten und funktionierenden Raspberry Pi mit installiertem Werbeblocker Pi-Hole. Auf dem Raspberry Pi läuft das aktuelle Betriebssystem (Stand Mai 2022 auf Basis von „Bullseye).

Wie du deinen Raspberry Pi installierst und einrichtest kannst du hier nachlesen: Raspberry Pi Ersteinrichtung. Wie du den DNS-Werbeblocker Pi-Hole installierst findest du in dieser Anleitung: Raspberry Pi Pi-hole einrichten.


Worum es geht: wenn du mit deinem Internetbrowser im Internet Seiten aufrufst (z.B. heimnetz.de), dann erfolgt hierfür eine DNS-Abfrage. Seiten im Internet sind mit einer IP-Adresse eindeutig definiert. Da sich aber kein Mensch all diese IP-Adressen merken kann, existieren sogenannte Domain Names. Jede IP-Adresse ist also mit einem Namen verknüpft, was es menschlichen Usern erheblich leichter macht, die korrekte Seite im Internetbrowser aufzurufen. Diese Domain Names werden in einem sogenannten Domain Name System (DNS) gespeichert und durch DNS-Server zur Verfügung gestellt. Lies dir hierzu auch gerne nochmal die folgende Anleitung zum Thema DNS durch: DNS – Vom Namen zur Nummer und zurück.

DNS-Abfragen können auf vielfältige Art und Weise beantwortet werden. Gibst du in deinem Internetbrowser den Namen einer Website ein (z.B. heimnetz.de), so wird bei den im z.B. Router hinterlegten DNS-Servern nachgefragt, welche IP-Adresse zu diesem Namenseintrag gehört. Du kannst aus vielen DNS-Servern aussuchen:

  • Dein Internetserviceprovider bietet meist eigene DNS-Server an.
  • Es gibt DNS-Server von z.B. google oder cloudflare.
  • Es gibt weitere DNS-Server von Initiativen und Vereinen, die einen etwas datenschutzfreundlicheren DNS Dienst anbieten (z.B. von Digitalcourage, Digitale Gesellschaft, dismail, etc.).

All diese machen jedoch so ziemlich dasselbe: Eine DNS-Abfrage wird beim Auflösen der von dir eingegebenen Internetadresse beantwortet.
Diese DNS-Abfrage wird…
…lokal aus dem Cache des Browsers oder lokalen DNS-Servers beantwortet, wenn du diese Seite bereits aufgerufen und den Cache nicht gelöscht hast.
…wenn dazu nichts im Cache ist wird die Anfrage an einen der im Router eingetragenen DNS-Server weitergeleitet und von dort beantwortet, wenn die Antwort dort bekannt ist.
…wenn auch dieser DNS-Server die Antwort nicht kennt, dann wird die DNS-Abfrage an die oberste Instanz der globalen DNS Server (DNS root Server) weitergeleitet, die schließlich auf jede DNS-Abfrage eine Antwort haben (soweit es keine internen IP-Adressen sind).

Problem: deine DNS-Abfrage wird ggf. durch Anbieter von DNS-Servern ausgewertet, protokolliert und ggf. auch zensiert (du erreichst dann bestimmte Seiten einfach nicht, weil eben deren Namen nicht aufgelöst werden).

Die Lösung ist einfach: du nutzt einen DNS-Resolver, der die Namensanfragen direkt an die oberste DNS Server Instanz sendet und die vorgeschalteten Umwege einfach überspringt. Dies sorgt für ein höheres Maß an:

  • Dezentralisierung (es werden nicht immer dieselben DNS Server befragt)
  • Datenschutz (deine DNS-Abfragen werden nicht protokolliert)
  • Freiheit (es erfolgt kein DNS-basiertes Zensieren bei der Auflösung von Namen)

Nachteil: Es dauert einige Millisekunden länger.

Die folgenden Arbeitsschritte sind nötig, um unbound als DNS Resolver auf deinem Raspberry Pi zu installieren und einzurichten:

1. Den eigenen DNS Resolver unbound installieren
Zunächst meldest du dich per ssh an deinem Raspberry Pi an.
Nach Eingabe von Namen und Passwort (oder alternativ nach Anmeldung mit einem Schlüsselpaar) aktualisierst du zunächst die Paketquellen und lädst dann unbound herunter mit: sudo apt update und sudo apt install unbound.

Tip: ich empfehle dir, unbound wie in dieser Anleitung beschrieben mit dem Paketemanager herunterzuladen, denn dabei werden auch die benötigten Listen für die DNS-Stamm-Server mitgeladen, außerdem aktualisieren sich diese Listen dann automatisch!

Da allerdings der DNS-basierte Werbefilter Pi-hole bereits den typischen DNS Port 53 benutzt, wird dir hier zunächst eine Fehlermeldung angezeigt, da der Port ja bereits belegt ist.
Um das zu ändern muss die Konfiguration für unbound angepasst werden. Die benötigte Konfigurationsdatei legst du an mit sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf.

Hier fügst du mit copy & paste folgenden Inhalt ein (Vorgabe als Muster direkt von der Seite der Pi-hole Macher*Innen unter https://docs.pi-hole.net/guides/dns/unbound/):

Kopierenserver: # If no logfile is specified, syslog is used # logfile: „/var/log/unbound/unbound.log“ verbosity: 0
interface: 127.0.0.1 port: 5335 do-ip4: yes do-udp: yes do-tcp: yes
# May be set to yes if you have IPv6 connectivity do-ip6: no
# You want to leave this to no unless you have *native* IPv6. With 6to4 and # Terredo tunnels your web browser should favor IPv4 for the same reasons prefer-ip6: no
# Use this only when you downloaded the list of primary root servers! # If you use the default dns-root-data package, unbound will find it automatically #root-hints: „/var/lib/unbound/root.hints“
# Trust glue only if it is within the server’s authority harden-glue: yes
# Require DNSSEC data for trust-anchored zones, if such data is absent, the zone becomes BOGUS harden-dnssec-stripped: yes
# Don’t use Capitalization randomization as it known to cause DNSSEC issues sometimes # see https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 for further details use-caps-for-id: no
# Reduce EDNS reassembly buffer size. # IP fragmentation is unreliable on the Internet today, and can cause # transmission failures when large DNS messages are sent via UDP. Even # when fragmentation does work, it may not be secure; it is theoretically # possible to spoof parts of a fragmented DNS message, without easy # detection at the receiving end. Recently, there was an excellent study # >>> Defragmenting DNS – Determining the optimal maximum UDP response size for DNS <<< # by Axel Koolhaas, and Tjeerd Slokker (https://indico.dns-oarc.net/event/36/contributions/776/) # in collaboration with NLnet Labs explored DNS using real world data from the # the RIPE Atlas probes and the researchers suggested different values for # IPv4 and IPv6 and in different scenarios. They advise that servers should # be configured to limit DNS messages sent over UDP to a size that will not # trigger fragmentation on typical network links. DNS servers can switch # from UDP to TCP when a DNS response is too big to fit in this limited # buffer size. This value has also been suggested in DNS Flag Day 2020. edns-buffer-size: 1232 # Perform prefetching of close to expired message cache entries # This only applies to domains that have been frequently queried prefetch: yes
# One thread should be sufficient, can be increased on beefy machines. In reality for most users running on small networks or on a single machine, it should be unnecessary to seek performance enhancement by increasing num-threads above 1. num-threads: 1
# Ensure kernel buffer is large enough to not lose messages in traffic spikes so-rcvbuf: 1m
# Ensure privacy of local IP ranges 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

Jetzt startest du den unbound Dienst erneut mit einem sudo service unbound restart. Es sollte nun keine Fehlermeldung mehr angezeigt werden und unbound ist fertig eingerichtet.

Troubleshooting No.1:
Bei dem Erstellen der Anleitung kam es mitunter hier zu folgendem Fehler, der unbound nicht starten ließ:
error: Could not open /etc/unbound/unbound.conf: No such file or directory

Sollte dies auch bei dir auftreten, so hilft folgendes: sudo nano /etc/unbound/unbound.conf. Hier fügst du die folgende Zeile ein: include: "/etc/unbound/unbound.conf.d/*.conf". Dann speicherst du mit STRG + „o“ und schließt die Datei mit STRG + „x“. Dann mit einem erneuten sudo service unbound restart den Dienst neu starten und schauen, ob der Fehler behoben ist.

Um zu testen, ob alles funktioniert gibst du folgendes ein: dig pi-hole.net @127.0.0.1 -p 5335. Dies sollte mit einem status: NOERROR beantwortet werden.

Troubleshooting No2:
unter dem auf „Bullseye“ basierendem Betriebssystem des RaspberryPi haben sich einige Einstellungen verändert, so wird intern nun (kurz und laienhaft gesagt) eine andere Methode zur Bearbeitung von DNS-Anfragen genutzt. Dies erfordert im Zusammenspiel mit unbound leider etwas Nacharbeit. Es erscheint bei Ausführung von dig pi-hole.net @127.0.0.1 -p 5335 eventuell die Fehlermeldung SERVERFAIL. Hier der üblicherweise funktionierende workaround dafür.

Das Vorgehen setzt sich aus den folgenden Schritten zusammen:

  • Aufrufen und Bearbeiten der fehlerhaften Konfigurationsdatei
  • Löschen der unerwünschten Konfigurationsdatei
  • Neustarten von unbound

a) Du bist weiterhin via Console/Terminal per SSH auf deinem RaspberryPi eingeloggt.
Mit sudo nano /etc/resolvconf.conf öffnest du die Datei zur Bearbeitung. Hier kommentierst du die letzte Zeile aus, indem du ein „#“ voran setzt.
Raspberry Pi unbound workaround resolvconf
Es sollte wie folgt aussehen:
Raspberry Pi unbound resolvconf auskommentiert
Jetzt speicherst du deine Bearbeitung mit STRG + „o“ und schließt die Datei mit STRG + „x“.

b) Nun löschst du die fehlerhafte Datei mit sudo rm /etc/unbound/unbound.conf.d/resolvconf_resolvers.conf.

c) schließlich startest du den unbound Dienst neu mit sudo service unbound restart.

Ein erneuter Aufruf von dig pi-hole.net @127.0.0.1 -p 5335 sollte nun die erwünschte Antwort NOERROR bringen.

Des weiteren sollte ein dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5335 mit einem SERVERFAIL beantwortet werden während ein dig sigok.verteiltesysteme.net @127.0.0.1 -p 5335 mit einem NOERROR beantwortet werden sollte.

2. Pi-hole anpassen und mit unbound verbinden
Die letzte Anpassung erfolgt in Pi-Hole. Dazu rufst du in deinem Internetbrowser die Anmeldeseite von Pi-hole auf und meldest dich an.
Unter Settings > DNS änderst du unter „Custom 1 (Ipv4)“ den Eintrag 127.0.0.1#5335 ein, damit weiß Pi-hole, dass DNS-Abfragen direkt an unbound weitergeleitet werden sollen, der auf dem Port 5335 auf Anfragen lauscht.
Raspberry Pi unbound pihole dns setting
Auf derselben Seite setzt du dann unter Advanced DNS Settings den Haken bei „Use DNSSEC“.

Damit ist die Einrichtung von unbound auf deinem Raspberry Pi abgeschlossen und der DNS-Resolver unbound arbeitet Hand in Hand mit dem DNS-Werbeblocker Pi-hole zusammen.

Bei Fragen, Kommentaren und Problemen kannst du dich gerne im Forenbereich anmelden!

Vielen Dank an den User the other für diese Anleitung!

Wenn Du Fragen zu dieser Anleitung hast, dann schau doch einfach mal bei uns im vorbei!