Pi-Hole mit Unbound betreiben

Wer seine DNS-Abfragen noch etwas beschleunigen möchte, kann sich Unbound als DNS-Resolver installieren.

Was gibt es für Vorteile?
– Wir befragen die Root-Name-Server des Internets (Was das ist, steht hier: https://en.wikipedia.org/wiki/Root_name_server)
– Wir können mehr Cachen und Abfragen dann direkt beantworten
– Unser Internetanbieter, Google, CloudFlare & Co. kann unser Surfverhalten nicht mehr (so einfach) mitschreiben

Was gibt‘s für Nachteile?
– Die erste Anfrage könnte etwas länger dauern als über den DNS des Internetanbieters
– Es wird weiterhin unverschlüsselt die Anfrage ins Internet gelassen

Wie bekommst du das ganze hin?
Das zeige ich dir hier im Video!




Alle notwendigen Befehle findest du hier:

Wir installieren uns Unbound:

apt install unbound

Wir besorgen uns die Root-Name-Liste und schieben diese in den korrekten Ordner:

wget -O root.hints https://www.internic.net/domain/named.root
mv root.hints /var/lib/unbound/

Unbound braucht noch folgende Konfiguration:

nano /etc/unbound/unbound.conf.d/pi-hole.conf
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!
    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

   # TTL bounds for cache
   cache-min-ttl: 3600
   cache-max-ttl: 86400

   # Cache Memory rrset should have double size as msg
   msg-cache-size: 400m
   rrset-cache-size: 800m

Falls du IPv6 nutzen möchtest, aktiviere dies in Zeile 13.
Ebenfalls kann gerne die Anzahl der zur Verfügung stehenden CPU-Threads in Zeile 41 noch angepasst werden.

Wir starten Unbound neu:

service unbound restart

Nun kann getestet werden, ob eine Abfrage funktioniert:

dig hoerli.net @127.0.0.1 -p 5335

Zum guten Schluss tragen wir noch den Unbound-Server als DNS-Upstream im Pi-Hole ein.

Nun stellst du deine ganzen Anfragen von deinem Pi-Hole an deinen Unbound-Server!


DNSSEC ist auch nun aktiv und kann mit folgendem Befehl getestet werden:

dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5335
dig sigok.verteiltesysteme.net @127.0.0.1 -p 5335

Automatisches Update der Listen:
Erstelle dir ein kleines Script und speicher es irgendwo ab.

nano root-dns-update.sh

Trage dort folgenden Inhalt ein:

#!/bin/bash
     wget -O root.hints https://www.internic.net/domain/named.root &&
     (
      mv -fv root.hints /var/lib/unbound/
      service unbound restart
     )

Dann das ganze noch ausführbar machen:

chmod +x  root-dns-update.sh

Das ganze noch per CronJob anlegen:

nano /etc/crontab

Ein Beispiel für ein Update alle 4 Monate.

* * * */4 * root /root/root-dns-update.sh >/dev/null 2>&1

Die ganze Anleitung inkl. weiterer interesannten Befehle findest du auf der Pi-Hole-Webseite direkt!
https://docs.pi-hole.net/guides/unbound/

32 Kommentare

  1. Du hast Dich verschrieben !!! 😀 In Zeile 3 bei domain/named.root du hast da einen Punkt

    #!/bin/bash
    rm /var/lib/unbound/root.hints
    wget -O root.hints https://www.internic.net/domain/named.root
    mv root.hints /var/lib/unbound/
    service unbound restart

  2. … wenn das “wget” fehlschlägt, hat man keine “root.hints” mehr!

    Ich schlage folgendes Skript vor:

    #!/bin/bash
    wget -O root.hints https://www.internic.net/domain/named.root &&
    (
    mv -fv root.hints /var/lib/unbound/
    service unbound restart
    )

  3. Hi Hoerli. Kleine Frage. Ist im Beispiel für den Cronjob nicht ein Schreibfehler (Name der sh-Datei)? Sollte die Zeile nicht so lauten:

    * * * */4 * root /root/root-dns-update.sh >/dev/null 2>&1

  4. Ich habe mal eine kleine Frage, warum betreibt man ein PiHole hinter einen Unbound DNS. Unbound kann doch auch Werbung ähnlich PiHole Filtern.

  5. Hallo
    Ich habe versucht deinem youtube video zu forlen , welches anscheiden etwas ktueller ist als deine beschreibung auf dieser seite.

    Aktuell habe ich das Problem das piholt -t mit 127.0.0.1#5335 inf ::1#5335 ein

    validation XXXX is BOGUS
    reply error is SERVFAIL

    Ausgibt.

    Nur wenn ich die 127.0.0.1 in die IP vom SBC ändere geht diese…

    Wo könnte der Fehler liegen?

    • BOGUS-Fehler passieren in der Regel, wenn die Uhrzeit des Systems auf dem der DNS-Server läuft nicht korrekt ist.
      Gleiche mal die Zeit ab, damit sie zur Weltzeit synchron läuft.
      Ansonsten kann ich mir nicht erklären, wie es zu dem Fehler kommt.

  6. Hatte ich schon gemacht…

    Ist wie gesagt eine frische ubuntu Focal server installation mit pihole 5 + unbound 1.9.7 + openhabian 1.6 mit nginx 1.9.6. auf einem vim3

    Hatte diesen etwas neuere Anweisungen gefunden…
    https://www.privacy-handbuch.de/handbuch_93c.htm

    Wo man diese Service deaktivieren sollte…

    sudo systemctl disable systemd-resolved

    Jedoch funktioniert sudo aa-status bei mir nicht

  7. Hallo! Sollte der cronjob nicht so heissen?
    0 0 * */4 * root /root/root-dns-update.sh >/dev/null 2>&1
    Sonst wird das Skript jede Minute an jedem 4. Monat ausgeführt (also 1440 mal an diesem Tag). Siehe https://crontab.guru

    • Hi!
      Wenn du es an jedem 1. alle 4 Monate ausführen willst, dann ja.
      In meiner Schreibweise wird jeden 4. Monat um 0:00 Uhr der Cronjob ausgeführt.

      Kann man also machen, muss man aber nicht.

  8. 0 0 1 */4 * wäre ganz korrekt

  9. Bester Mann!! bei mir hat das nie geklappt nen Unbound zu installieren, egal welche Anleitung ich benutzt hab, aber deine hat funktioniert !!! 🙂
    vielen dank für deine Arbeit!! und dass die Listen sich jetzt auch noch updaten können 🙂

  10. Stand Juni 2021:
    Bin zwar nur ein absoluter Anfänger aber muß dein Beispiel:
    * * * */4 * root /root/root-dns-update.sh >/dev/null 2>&1
    angepasst werden ? Und wenn, wie ?
    Hat sich der Eintrag nicht geänder ? Wenn “nano /etc/crontab” aufgerufen wird,
    stimmt der Syntax deiner Zeile nicht mehr mit der Vorgabe in der Datei überein.

  11. Hallo, tolles Video, kurz und bündig. Den Eintrag in de Crontab würde ich allerdings anders setzen, 0 0 1 */4 * root /root/root-dns-update.sh >/dev/null 2>&1. Sollte der Eintrag zwingend in der /etc/crontab gesetzt werden, andere Autoren erzeugen einen Crontab im root@xxx:~#. Sollte oder muss “unbound-resolvconf.service” disable werden.

  12. Super Anleitung.
    Nun habe ich es auch entsprechend dieser Anleitung auf meinem Unraid Server und Dockern geschafft das Teil endlich zum laufen zu bekommen.

    BESTEN DANK!!!!

  13. Hall Hoerli,
    Anleitung ist super inkl. der Befehlszeilen!!
    Hat auch soweit alles Funktioniert bis auf Outlook (abruf über GMX)

    Fehler (0x800408FC) beim Ausführen der Aufgabe “[email protected] – Nachrichten werden empfangen”: “Der eingegebene Servername wurde im Netzwerk nicht gefunden. (Das Netzwerk steht möglicherweise gerade nicht zur Verfügung.) Überprüfen Sie den Namen und die Netzwerkverbindung.”

    Selbe Problem beim PAD Android 12

    Danke in voraus.

    • Hi Schänbauer,
      wo erhälst du den Fehler in Windows und was genau zeigt Android an?
      Was ich aktuell davon ableiten könnte ist, das deine Uhrzeit des Pi-Hole-Servers nicht stimmt und dadurch DNSSEC nicht korrekt funktioniert.
      Manchmal habe ich auch zeitweise Verbindungsprobleme mit Outlook / Microsoft, das legt sich aber nach 1-2h wieder.
      Ich vermute mal, das die Server im Hintergrund umstellen und DNSSEC darauf noch nicht klar gekommen ist.

  14. ich werd kirre. Dein Script funzt bei mir nicht, also das für die Aktualisierung.

    unable to resolve host address ‘www.internic.net’

    was mach ich da falsch?

  15. Ich habe das Problem das mein Pihole und Unbound auf jeweils einer anderen Ipadresse ist die range ist 192.168.2.0/24
    und sobald ist den unbound als custom server hinzufüge funktioniert das netz nicht mehr.
    wie muss ich das in der config anpassen?
    habe auch schon
    diesen Step ausgeführt da ich ein Debain System habe.

    Option 2 – Step 1 – Disable the Service¶
    openresolv has a systemd service called unbound-resolvconf.service. To check if this service is enabled for your distribution, run below one and take note of the Active line. It will show either active or inactive or it might not even be installed resulting in a could not be found message:

    sudo systemctl status unbound-resolvconf.service
    To disable the service if so desire, run the two statements below:

    sudo systemctl disable unbound-resolvconf.service
    sudo systemctl stop unbound-resolvconf.service

  16. Ich erhalte nach der Installation folgenden Fehlermeldung:
    “Job for unbound.service failed because the control process exited with error code.
    See “systemctl status unbound.service” and “journalctl -xeu unbound.service” for details.”

    Da ich absoluter Laie bin, kann ich hiermit nichts anfangen.

    Kannst Du mir bitte weiterhelfen?
    Danke

    • Auch ein Laie kann Google nutzen 😉
      Führe mal die aufgeführten Befehle systemctl status unbound.service und journalctl -xeu unbound.service aus.
      Dann wird dir das Problem angezeigt.
      Danach kannst du dann suchen und solltest eine Antwort finden können.
      Ich vermute mal, du hast entweder in der Konfiguration einen fehler gemacht, oder ein Port ist durch etwas anderes belegt.

  17. Moin,
    Unbound läuft wie Pi-Hole auf meinem Raspberry Pi 3b, aber wenn ich es in Pi-Hole als Custom Server eintrage, kann ich keine Seite mehr im Internet aufrufen.

    • In dem Fall prüfe einmal ob Unbound auch sauber funktioniert.
      Scheinbar läuft da etwas nicht korrekt.

      • Der läuft wohl, aber wenn ich ihn im Pi-Hole eintrage, kann ich keine Seite mehr aufrufen:

        Ohne Eintrag im Pi:

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

        ;; ANSWER SECTION:
        spiegel.de. 3600 IN A 128.65.210.8

        ;; Query time: 108 msec
        ;; SERVER: 127.0.0.1#5335(127.0.0.1)
        ;; WHEN: Tue Jan 09 18:00:03 CET 2024
        ;; MSG SIZE rcvd: 55

        Mit Eintrag im Pi:

        ; <> DiG 9.16.44-Debian <> spiegel.de @127.0.0.1 -p 5335
        ;; global options: +cmd
        ;; connection timed out; no servers could be reached

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.