Pi-hole mit unbound – Werbeblocker und Kontrolle über die DNS-Anfragen erhalten

Was macht unbound?

unbound holt für euch von einem Root-Nameserver die Informationen welcher Top-Level-Domain-Server (TPL) für eure Anfrage zuständig ist. Anschließend wird der zuständige autoritativen Nameserver nach der IP-Adresse der Domain gefragt, ob die Seite überhaupt aufrufen zu können.

Wo ist aber nun der Unterschied zu dem Pi-hole und zu Pi-hole mit unbound?

Was macht euer Pi-hole ohne unbound?

  1. Ihr gebt in euren Webbrowser die Adresse strobelstefan.org ein.
  2. Pi-hole überprüft, ob er die Anfrage bereits aus seinem Cache auflösen kann, weil ihr bereit vorher die Seite aufgerufen habt.
  3. Pi-hole prüft die eure Blocking-Listen, ob ein Aufruf der Seite erlaubt ist.
  4. Pi-hole verweist eure Anfrage ein einen externen DNS-Server, z.B. eures Internet Service Providers (ISP) oder der eingestellte DNS-Server in der Pi-hole-Konfiguration unter Einstellungen –> DNS.
  5. Die Anfrage kommt vom externen DNS zurück und der Pi-hole gibt die Informationen an euren Webbrowser weiter.
  6. Ihr könnt die Seite aufrufen.
  7. Pi-hole speichert die Anfrage in seinem Cache für später, solltet ihr erneut strobelstefan.org aufrufen wollen.

Was macht euer Pi-hole mit unbound?

Die Anfrage läuft für die Punkte 1 bis 3 gleich ab. Erst ab Punkt 4 gibt es eine Änderung

  1. Ihr gebt in euren Webbrowser die Adresse strobelstefan.org ein.
  2. Pi-hole überprüft, ob er die Anfrage bereits aus seinem Cache auflösen kann, weil ihr bereit vorher die Seite aufgerufen habt.
  3. Pi-hole prüft die eure Blocking-Listen, ob ein Aufruf der Seite erlaubt ist.
  4. Es wird eine Anfrage von Pi-hole an den Root-Nameserver gesendet, ob der sagen kann, welcher Top-Level-Domain-Server für .org zuständig ist.
  5. Pi-hole sendet dann eine Anfrage an den TPL-Server wo er strobelstefan.org findet.
  6. Der TPL sendet die Informationen über den zuständigen autoritativen Nameserver zurück.
  7. Pi-hole wendet sich an den autoritativen Nameserver und fragt nach strobelstefan.org.
  8. Der autoritativen Nameserver antwortet nun mit der IP-Adresse der Domain strobelstefan.org.
  9. Der Pi-hole gibt die Informationen weiter und die Seite wird im Webbrowser dargestellt.
  10. Pi-hole speichert erneut die Informationen im Cache, für einen erneuten Aufruf ab.

Was ist nun der Unterschied?

Ihr seht einen wesentlichen Unterschied zwischen den beiden Abläufen. Mit unbound frägt der Pi-hole nicht bei irgendeinem externen DNS-Server an, der von eurem ISP betrieben wird.

Die Anfragen werden zielgerichtet an den Root-Nameserver, dann an den TLS und dann an den autoritativen Nameserver versendet.

Es gibt also keine Dritten die euer Surfverhalten auf Grund der abgesendeten DNS-Anfragen nachvollziehen können.

Wenn euer Pi-hole / unbound die Informationen bereits im Cache gespeichert hat, findet er die richtigen Webserver und damit die Adresse strobelstefan.org ohne Umweg über DNS sondern direkt.

Wenn ihr mal euren QUery Log auf dem Pi-hole angeschaut habt, dann wisst ihr was die DNS-Anfragen beinhalten und was für Informationen und Schlüsse man daraus ziehen kann.

Ein installierter unbound in Verbindung mit Pi-hole.

  • hilft bei der digitalen Selbstverteidigung
  • blockt zuverlässig Werbung
  • ermöglicht eine schnelleres Surfen im Internet, wenn die Daten bereits im Cache gespeichert sind.

Gib mir gerne einen Kaffee ☕ aus!

Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕ ausgeben.

PayPal Logo


liberapay.com/strobelstefan.org


Kaffee via Bitcoin

bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


unbound-Installation

Die Installation von unbound funktioniert sehr einfach aus den Repositories

sudo apt install unbound

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libunbound8 unbound-anchor
Suggested packages:
  apparmor
The following NEW packages will be installed:
  libunbound8 unbound unbound-anchor
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 1219 kB of archives.
After this operation, 4787 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

Nach der erfolgreichen Installation ist eine neue Datei im entsprechenden Verzeichnis anzulegen.

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

Der Inhalt der Datei sieht wie folgt aus. Bevor ihr das kopiert, schaut bitte in der offiziellen Dokumentation nach, ob sich etwas geändert hat.

server:
    # 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.
    # Suggested by the unbound man page to reduce fragmentation reassembly problems
    edns-buffer-size: 1472

    # 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

Nach der Installation von unbound sollte die Datei root.hints im Verzeichnis /var/lib/unbound angelegt worden sein. Ist das nicht der Fall, dann kann die Datei auch manuell heruntergeladen werden.

wget https://www.internic.net/domain/named.root -qO- | sudo tee /var/lib/unbound/root.hints

Danach ist der Dienst neu zu starten und ein Test kann ebenfalls durchgeführt werden.

benutzer@pihole:~ $ sudo service unbound restart
benutzer@pihole:~ $ dig pi-hole.net @127.0.0.1 -p 5335
; <<>> DiG 9.11.5-P4-5.1+deb10u8-Raspbian <<>> dnssec.works @127.0.0.1 -p 5335
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41307
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;dnssec.works.			IN	A

;; ANSWER SECTION:
dnssec.works.		3583	IN	A	5.45.107.88

;; Query time: 0 msec
;; SERVER: 127.0.0.1#5335(127.0.0.1)
;; WHEN: Sa Nov 19 17:10:08 CET 2022
;; MSG SIZE  rcvd: 57

https://docs.pi-hole.net/guides/dns/unbound/

Nun noch unbound neu starten.

 sudo service unbound restart

Und schon kann der erste Test gestartet werden.

dig dnssectest.sidn.nl +dnssec +multi @ip-adresse-von-pi-hole

Die Ausgabe sieht in etwa so aus:

; <<>> DiG 9.11.5-P4-5.1+deb10u8-Raspbian <<>> dnssectest.sidn.nl +dnssec +multi @ip-adresse-von-pi-hole
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46068
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1472
;; QUESTION SECTION:
;dnssectest.sidn.nl.	IN A

;; ANSWER SECTION:
dnssectest.sidn.nl.	2155 IN	A 212.114.120.64
dnssectest.sidn.nl.	2155 IN	RRSIG A 13 3 3600 (
				20221125170928 20221110165616 39816 sidn.nl.
				lRPpEt6j7qM9Fa/g/YYNA8wshfnhtKtRpt09gsGNto1y
				CdvOcBJ6Z5YX11/nxbLQXGtU/pZks55Wto22DBlWlw== )

;; Query time: 7 msec
;; SERVER: 192.168.35.5#53(192.168.35.5)
;; WHEN: Sa Nov 19 16:50:37 CET 2022
;; MSG SIZE  rcvd: 166

Es kann sein, dass in der Datei /etc/resolv.conf zwar als Nameserver die IP-Adresse 127.0.0.1 eingetragen wird, jedoch ohne einen Port.

Der Fehler ist in der offiziellen Dokumentation von Pi-hole beschrieben.
https://docs.pi-hole.net/guides/dns/unbound/

Es lässt sich wie folgt lösen.

benutzer@pihole:~ $ cat /etc/resolv.conf
# Generated by resolvconf
nameserver 127.0.0.1

benutzer@pihole:~ $ sudo systemctl status unbound-resolvconf.service
 unbound-resolvconf.service - Unbound DNS server via resolvconf
   Loaded: loaded (/lib/systemd/system/unbound-resolvconf.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2022-11-19 16:22:55 CET; 19min ago
  Process: 721 ExecStart=/usr/lib/unbound/package-helper resolvconf_start (code=exited, status=0/SUCCESS)
 Main PID: 721 (code=exited, status=0/SUCCESS)

Nov 19 16:22:55 pihole systemd[1]: Started Unbound DNS server via resolvconf.
Nov 19 16:22:56 pihole package-helper[721]: Too few arguments.

destroy@pihole:~ $ sudo systemctl disable unbound-resolvconf.service
Removed /etc/systemd/system/unbound.service.wants/unbound-resolvconf.service.

benutzer@pihole:~ $ sudo systemctl stop unbound-resolvconf.service

benutzer@pihole:~ $ sudo systemctl restart dhcpcd

Die DNS-Einstellungen können auf dieser Seite überprüft werden. Einfach die Adresse im Webbrowser aufrufen:
https://dnsleaktest.com

In der Ausgabe sollte nun der von euch festgelegte DNS-Server ausgegeben werden und nicht mehr der DNS-Server eures ISPs.

Pi-hole DNS-Server einstellen

Zum Abschluss müssen wir noch in Pi-hole den DNS-Server auf den unbound "umleiten." Damit geht jede DNS-Anfrage vom Pi-hole über unseren gerade installierten unbound.

Pi-hole - DNS-Einstellung für unbound
Pi-hole - DNS-Einstellung für unbound
Tragt in Custom 1 (IPv4) ein:
127.0.0.1#5335

Root Nameserver

In der offiziellen Dokumentation wird auch beschrieben, wie die Adressen der Root Nameserver in regelmäßigen Abständen aktualisiert werden können, wenn unbound nicht aus den Paketquellen installiert wurde. Da wir unbound aus eben diesen installiert haben, ist der Schritt für uns nicht wirklich relevant. Aber ihr könnt über den Link die Informationen zu den weltweit 13 Root Nameserver einsehen.
--> https://www.internic.net/domain/named.root

Fehlersuche

Taucht bei euch ein Fehler auf, dann könnt ihr mal folgendes versuchen. Lässt euch mal den Status von unbound ausgeben. Der Dienst sollte ohne Fehler laufen.
systemctl status unbound.service
Gibt es einen Fehler, könnt ihr die unbound-Konfiguration auf Fehler überprüfen lassen.
unbound-checkconf

Hilft das alles nichts, dann setzt ihr das Verbosity-Level kurzfristig für die Fehleranalyse hoch und ihr müsst wohl oder übel die Logs durchsuchen.

Es gibt 5 Log Level:

  1. Level 0 = bedeutet nicht ausführlich, nur Fehler
  2. Level 1 = gibt Informationen über den Betrieb aus
  3. Level 2 = gibt detaillierte Betriebsinformationen aus
  4. Level 3 = gibt Informationen auf Abfrageebene aus
  5. Level 4 = gibt Informationen auf Algorithmus-Ebene aus
  6. Level 5 = protokolliert die Client-Identifikation für Cache-Misses
    1. Weiterführende Links

      Unbound deinstallieren

      Unbound lässt sich relativ einfach wieder vom System entfernen:
      sudo apt remove unbound
      Nach der Installation ist ggf. die /etc/resolv.conf anzupassen. Dort sollte nach der Installation der einzige Eintrag auf 127.0.0.1 lauten.
      # Generated by resolvconf
      nameserver 127.0.0.1

      Changelog

      - November 2022 - Überarbeitet

19 Antworten auf „Pi-hole mit unbound – Werbeblocker und Kontrolle über die DNS-Anfragen erhalten“

  1. Hi Stefan,

    wie immer ein super Artikel mit vielen Hintergrundinformationen. Das kommt auf die ToDo Liste für mich. Mit dieser Anleitung sollte es schnell eingerichtet sein.

    Viele Grüße

    Matthias

  2. Hi Stefan, super gut erklärt, danke! Schon gemacht.

    Ein kleiner „Tippfehler“ doch: bei
    sudo /etc/unbound/unbound.conf.d/pi-hole.conf
    fehlt der nano:
    sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf

    Nochmal Danke und Grüße
    Ionut

  3. Was richtig fies ist: Ein paar Erklärungen zu unbound beinhalten port 5335 wie bei dir, viele andere Erklärungen beinhalten port 5353.

    Ich habe mir einen Wolf gesucht bei der Fehleranalyse!

  4. Hallo Stefan,
    in der aktuellen c’t 21/2021 wird die Funktionalität eines DNSCrypt-Proxy vorgestellt.

    Nach meinem Verständnis ist die Nutzung von anonymen DNS-Anfragen noch sicherer im Vergleich zur Nutzung von unbound.

  5. Hallo,
    herzlichen Dank für die sehr gute und einfache Anleitung. Mich hat von unbound bisher neben meiner grundsätzlichen Ahnungslosigkeit in dem Bereiche das Problem mit den veraltenden Nameservern abgehalten. Dazu schreibst Du nun „Da wir unbound aus eben diesen (Paketquellen) installiert haben, ist der Schritt für uns nicht wirklich relevant.“ Ich versteh das inhaltlich leider gar nicht. Heisst das, hier muss ich keine Updates machen? Wenn ja, weshalb? Wäre toll, wenn Du mir da noch mal Nachhilfe geben könntest.
    Grüße, Martin

    1. Hallo Martin,
      das bezieht sich auf die Installationsroutine von unbound.
      Wenn du das Paket aus den Paketquellen installiert hast, brauchst du eigentlich nichts weiter machen.

      Viele Grüße

      Stefan

      1. Hi Stefan,
        Danke für die schnelle Antwort. Leider noch mal eine Nachfrage: Veralten die Nameserver dann nicht bzw. werden sie irgendwie anders erneuert? Mir ist unklar, wie die Adressen dann aktuell bleiben? Oder muss man sie doch aktuell halten und es geht hier nur um die erste Installation? Tut mir leid, falls ich schwer von Begriff bin. Ich hab mir für PiHole gerade erst einen RasPi geholt und mache meinen ersten Schritte in diese Welt… Ist spannend aber ich bin leider noch ziemlich planlos.

          1. Hi Stefan,
            danke für Deine Antwort – leider bin ich wohl an unbound am Ende gescheitert. Ich hab das nach mehreren Anleitungen (vor allem der von Dir verlinkten) jezt zweimal komplett neu Aufgesetzt und jedes Mal, sobald ich in Pi-Hole die DNS Server eintrage, geht nix mehr – kein Server wird mehr erreicht – vorher klappt per dig Befehl noch alles 1a ob Ipv6 oder 4 genau wie angegeben. Danach ist immer überall Servfail… Vielleicht traue ich mich in einer Woche noch mal ran…

          2. Hallo Martin,

            verwende doch Pi-hole mal ohne unbound.
            Du kannst ja auch einen anderen DNS-Server deines Vertrauens eintragen.
            Mit Pi-hole kannst du nervige Werbung und andere unnötige Dinge im kompletten Netzwerk herausfiltern.
            Das mit unbound kannst du dann im Anschluss nochmal versuchen.

            Grüße

            Stefan

  6. Hallo.
    Ja genau. Pi-Hole läuft bereits sehr gut. Die Idee war, jetzt unbound dazu zu nehmen und ggf noch die Firewall einzurichten, die Du hier beschreibst. Damit warte ich einfach erst mal. Danke und schönes Wochenende noch.

  7. Hallo,

    erst einmal ein Lob für die Dokumentation.
    Nach Vollzug der einzelnen Schritte mit entsprechenden Aufrufen habe ich „nur noch ein Problem“.
    Ruf eich den DNS Leaktest auf, wird mir anstatt eines Root-DNS Servers meine ISP angezeigt. Der ISP sollte eigentlich nur den Zugang zum INet bereitstellen oder wird über den Test nur dieser abgefragt? Wie kan ich sicherstellen, dass wirklich nur ein DNS-Root-Server angefragt wird?

    Vielen Dank

  8. Nachtrag:

    Beim Aufruf
    dig pi-hole.net @127.0.0.1 -p 5335
    erhalte ich keinen ad flag im DNS response wie bei Dir oben zu sehen,
    beim Aufruf
    dig dnssec.works @127.0.0.1 -p 5335
    allerdings schon.
    Warum?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert