Eigener DNS-Server: Unbound in Pi-Hole integrieren

  Norbert Rüthers   Lesezeit: 8 Minuten  🗪 6 Kommentare

Unabhängig von Google und Co. dank eigenem DNS-Server

eigener dns-server:  unbound in pi-hole integrieren

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.

Nun kann es sein das man die Aktivitäten von Unbound verfolgen möchte. Per default legt unbound aber keine Log-Datei an. Das kann mn aber relativ leicht ändern. Dazu muss man die Datei unbound.conf editieren

nano /etc/unbound/unbound.conf

Folgende Zeilen müssen an das Ende der Datei eingefügt werden.

server:
    chroot: ""
    logfile: /var/log/unbound.log
    verbosity: 1
    log-queries: yes

Die Datei unbound.log erzeugen

touch /var/log/unbound.log

Und mit den passenden Rechten versorgen.

chown unbound:unbound /var/log/unbound.log

Danach unbound neu starten

/etc/init.d/unbound restart

Danach kann man die Aktivitäten in Realzeit verfolgen. Es ist sehr interessant von welchen Geräten welche DNS-Anfragen kommen

cd /var/log

tail -f /var/log/unbound.log

Das war's auch schon

Viel Spass !!

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

Tags

Unbound, DNS, DNS-Server, Server, Pi-Hole, Hole, Datei

Bernhard
Geschrieben von Bernhard am 20. November 2021 um 09:37

Hallo, danke für die Anleitung! Aus welchem Grund ist eigentlich folgene Zeile auskommentiert? Schließlich wurde ja die rootlist runtergeladen?

root-hints: "/var/lib/unbound/root.hints"

norbert
Geschrieben von norbert am 20. November 2021 um 10:56

Danke für den Hinweis. Hatte das Original Listing von unbound übernommen und nicht nachgeprüft ist jetzt geändert

Peter
Geschrieben von Peter am 20. November 2021 um 13:52

Vielen Dank! Mehr davon, bitte!

👓
Geschrieben von 👓 am 20. November 2021 um 15:07

"Nur die erste DNS-Anfrage zu einem neuen Ziel wird ins Netz geschickt"

Wie gross wäre so eine Liste aller existierender Domains? Und wie macht das eigentlich der unbound vom Provider?

Manuel
Geschrieben von Manuel am 24. November 2021 um 16:28

Hi, warum sollte ich das nicht nutzen?

If you use the default dns-root-data package, unbound will find it automatically

forca
Geschrieben von forca am 26. Februar 2024 um 16:34

so wie es aussieht, das list-file, das mit dem package "dns-root-data" mitkommt, scheint etwas älter zusein, als das, wan man mit wget holen würde (zeitpunkt jetzt, raspbian 12.5)

~ $ diff /usr/share/dns/root.hints named.root 
12,13c12,13
< ;       last update:     January 01, 2023
< ;       related version of root zone:     2023010101
---
> ;       last update:     February 15, 2024
> ;       related version of root zone:     2024021501
24,25c24,25
< B.ROOT-SERVERS.NET.      3600000      A     199.9.14.201
< B.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:200::b
---
> B.ROOT-SERVERS.NET.      3600000      A     170.247.170.2
> B.ROOT-SERVERS.NET.      3600000      AAAA  2801:1b8:10::b