Eigener DNS-Server: Unbound in Pi-Hole integrieren

Fr, 19. November 2021, Norbert Rüthers

Viele von euch betreiben zu Hause ein Pi-Hole. Als DNS-Server wird in den allermeisten Fällen der voreingestellte DNS-Server des Providers oder ein anderer öffentlicher DNS-Server benutzt.

Da wären z.B. Google mit der IP 8.8.8.8  oder Cloudflare mit der IP 1.1.1.1 usw. usw. Es gibt da draussen viele DNS-Server die man benutzen kann. Das ist nicht nötig, wie in diesem Artikel beschrieben wird

Wenn man alldem nicht trauen möchte, bietet sich an auch gleich einen eigenen privaten DNS Server zu benutzen. Wenn man den dann noch auf demselben Raspberry wie Pi-Hole betreiben kann, umso besser Und an dieser Stelle kommt unbound ins Spiel

Beschreibung der Entwickler:

Es handelt sich um freie, quelloffene Software unter der BSD-Lizenz. Die Leitprinzipien für unseren Produktentwicklungsplan sind in erster Linie die Sicherheit und der Schutz der Privatsphäre des Nutzers. Darüber hinaus müssen alle Funktionen durch etablierte offene Standards unterstützt werden. Wir verbessern kontinuierlich die Funktionalität von Unbound für alle unsere Nutzer. Das bedeutet, dass wir keine Sonderanfertigungen machen oder spezielle Funktionen nur für zahlende Kunden bereitstellen. Unsere Prioritäten richten sich nach dem Feedback unserer Benutzer

Unbound funktioniert tadellos parallel zu Pi-Hole auf dem Raspberry ohne dass es zu Engpässen bei der Performance kommt. Die paar DNS Anfragen fallen nicht ins Gewicht. Nur die erste DNS-Anfrage zu einem neuen Ziel wird ins Netz geschickt und jede weitere zum selben Ziel wird aus dem Cache abgerufen. Die Antwortzeit beträgt dann 0 msec !

DNS-Server hört sich kompliziert an und ist es im Prinzip auch. Aber Unbound macht die Installation sehr einfach 

Installiert wird unbound mit:

sudo apt install unbound

Danach lädt man sich die aktuelle Liste der Root Server im Internet herunter

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

Am Inhalt dieser Liste ändert sich nur selten etwas. Und selbst wenn sich etwas ändert, arbeitet unbound trotzdem noch. Ich empfehle jedoch ca. jedes halbe Jahr eine aktuelle Liste herunterzuladen. Wie man das automatisieren kann, beschreibe ich weiter unten.

Die Features von unbound lauten wie folgt:

  • Lauscht nur auf Anfragen von der lokalen Pi-Hole-Installation (auf Port 5335)
  • Lauscht sowohl auf UDP- als auch auf TCP-Anfragen
  • Überprüfen von DNSSEC-Signaturen und verwerfen von BOGUS-Domains
  • Eigene Sicherheits- und Datenschutztricks können angewendet werden

Danach legt man eine Konfigurationsdatei an mit:

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

Diese Datei bekommt folgenden Inhalt:

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

Danach kann man den Server starten

sudo service unbound restart
dig pi-hole.net @127.0.0.1 -p 5335

Ein Test kann z.B. so ausgeführt werden

dig gnulinux.ch @127.0.0.1 -p 5335

Damit wird die DNS-Anfrage an unbound auf dessen Port 5335 gesendet

DNS Anfragen werden normalerweise an den Port 53 gesendet. Unbound verwendet den Port 5335 also nicht wundern, woher diese Zahl kommt. Der Port kann in der Konfigurationsdatei geändert werden, muss dann aber überall angepasst werden. Jetzt müssen wir unserem Pi-Hole nur noch mitteilen, dass wir ab sofort einen anderen DNS Server benutzen wollen. Wir konfigurieren Pi-Hole so, dass es euren rekursiven DNS-Server verwendet, indem 127.0.0.1#5335 als Custom DNS (IPv4) angegeben wird.

Im Pi-Hole findet man unter Settings -> DNS folgendes

Nach der Änderung das speichern nicht vergessen.

Update Datei erstellen

nano /root/updateroot

Inhalt:

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

Datei ausführbar machen

chmod +x /root/updateroot

Cronjobs-Datei öffnen:

crontab -e

Am Ende der Datei folgende Zeile einfügen:

0 0 1 */6 * /root/updateroot &

Cron zum Schluss neu starten

service cron restart

Das ganze bewirkt, dass die Datei mit den Root DNS Servern jedes halbe Jahr aktualisiert wird.

Das wars auch schon

Viel Spass !!

Quelle: https://www.nlnetlabs.nl/projects/unbound/about