Pi-Hole und Unbound Installation
Ein einziger Befehl reicht aus, um Pi-Hole zu installieren. Unter Umständen muss jedoch vorher das Paket curl über sudo apt install curl
installiert werden. Die Installation des Pakets erfolgt komfortabel per Skript direkt aus GitHub über
curl -sSL https://install.pi-hole.net | bash
Während der Installation erfolgt u. a. die Abfrage des Upstream-DNS-Servers. Hier wird ein beliebiger Anbieter aus der Liste ausgewählt. Dieser wird einfach ersetzt, nachdem unbound installiert und konfiguriert wurde. Des Weiteren wird nach der Installation des Web UI gefragt, was besonders für Einsteiger von Vorteil ist. Hat man den kompletten Wizard durchlaufen, beginnt bereits Pi-Hole zu installieren. Nach deren Abschluss wird der Startbildschirm mit der IPv4- und IPv6-Adresse sowie dem Passwort zum Einloggen in Pi-Hole angezeigt.
Wer das Passwort ändern oder ganz löschen möchte, wovon ich abrate, kann dies schnell und einfach mit dem Kommando sudo pihole -a -p
erledigen. Damit ist Pi-Hole auch schon installiert. Mit unbound geht es weiter.
unbound installieren
Mit sudo apt install unbound
und der anschließenden Bestätigung, die ausgewählten Pakete wirklich installieren zu wollen, wird unbound installiert. Danach muss nur noch kurz gewartet werden. Dann ist der Dienst mit den benötigten Abhängigkeiten installiert. Auch wenn die root.hints über die Abhängigkeiten vom Paketinstaller automatisch mitinstalliert werden sollten, empfiehlt es sich, die root.hints über den folgenden Befehl herunterzuladen:
wget https://www.internic.net/domain/named.root -qO-| sudo tee /var/lib/unbound/root.hints
Der Download ist abgeschlossen. Nun muss unbound noch konfiguriert werden. Dazu wird die Konfigurationsdatei in einem Editor geöffnet, in meinem Fall nano.
sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf
Der folgende Inhalt wird in die Konfigurationsdatei eingetragen. Falls keine IPv6-Adresse am lokalen Internetanschluss zur Verfügung steht, muss die entsprechende Zeile natürlich angepasst werden.
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: yes # 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
Nach dem Einfügen und Speichern des Inhalts der Konfigurationsdatei muss der unbound-Dienst mit dem folgenden Befehl neu gestartet werden.
sudo service unbound restart
Ob unbound funktioniert, kann mit folgendem Befehl getestet werden.
dig pi-hole.net @127.0.0.1 -p 5335
Bei der ersten Anfrage wurde die URL, die im Beispiel verwendet wurde, innerhalb von 144 ms gefunden. Die Zeit, in der unbound nun die Ziel-Adresse kennt, beträgt bei einem zweiten Aufruf 0 ms. In Zukunft müssen die Zieladressen erst beim ersten Mal abgerufen werden. Das Öffnen einer Webseite oder App dauert daher länger. In Zukunft wird das Abrufen der Adressen jedoch nahezu in Echtzeit erfolgen.
Pi-Hole und unbound miteinander verbinden
Für die Verbindung von Pi-Hole mit unbound ist nun der Aufruf des Web-UI über die im Vorfeld bekannte IP-Adresse bzw. den Hostnamen erforderlich. Mit dem vergebenen Passwort loggt man sich ein. Unter dem Punkt Settings ruft man die DNS-Einstellungen auf. Auf der linken Seite werden unter Upstream DNS-Servers alle Häkchen entfernt. Im rechten Feld wird unter Custom 1 (IPv4) 127.0.0.1#5335
eingetragen. Zusätzlich muss unter Custom 3 (IPv6) die lokale IPv6-Adresse ::1#5335
eingetragen werden, sofern man unbound für die Verwendung mit IPv6 konfiguriert hat. Anschließend wird noch DNSSEC aktiviert und die Einstellungen gespeichert. Schon ist die Verbindung zwischen den beiden Diensten hergestellt.
Automatische root.hints-Updates
Es empfiehlt sich nun, ein Update-Skript zu erstellen, damit unbound auch nach zukünftigen Updates von root.hints zuverlässig funktioniert. Dieses kann in einem beliebigen Ordner liegen.
#!/bin/bash wget -O root.hints https://www.internic.net/domain/named.root && ( mv -fv root.hints /var/lib/unbound/ service unbound restart )
Das erstellte Skript wird nun ausführbar gemacht. Je nachdem, wie das Skript benannt wurde, muss dazu das Befehl angepasst werden.
sudo chmod +x update_unbound_dns.sh
Zum automatischen Ausführen des Updater-Skripts ist nun ein Cron-Job erforderlich. Im Crontab ist hierbei unter Umständen eine Anpassung des Scriptpfades erforderlich.
sudo nano /etc/crontab
* * * */3 * root /home/user/update_unbound_dns.sh >/dev/null 2>&1
In der hier gezeigten Einstellung werden die root.hints nun automatisch alle drei Monate durch den Cronjob auf den neuesten Stand gebracht, sodass es keine Probleme mit unbound geben sollte.
DNS-Server im Router ändern
Damit Pi-Hole und unbound nun im gesamten Netzwerk funktionieren, muss nun noch der DNS-Server im eigenen Router geändert werden. Im Fall der FRITZ!Box ist dieser Punkt unter Internet – DNS-Server zu finden. Die Adressen des Pi-Hole Hosts müssen dort nun unter IPv4 und IPv6 eingetragen werden.
Anschließend müssen die Einstellungen noch gespeichert werden und schon funktioniert der Dienst. Die DNS-Anfragen, die von den eigenen Geräten gestellt werden, sollten nun auch über die Weboberfläche von Pi-Hole erscheinen. Über die Web-Benutzeroberfläche können weitere Filterlisten hinzugefügt und bestehende Listen aktualisiert werden.