Fritz!Box mit Pi-Hole und DNS over HTTPS
Dieser Artikel beschreibt die Einrichtung eines RaspberryPi mit Pi-Hole und sicherem DNS hinter einer Fritz!Box. So wird das gesamte Heimnetz vor schädlichen Webseiten und Werbung geschützt und die DNS-Abfragen bleiben dank DNS over HTTPS vor unberechtigten Einblicken geschützt.
Voraussetzungen
Benötigt wird folgende Hardware:
- Raspberry Pi
aus Performance-Gründen sollte es mindestens Version 2 sein - kurzes RJ45-Netzwerkkabel
15-30 cm - kurzes Micro-USB-Kabel (beim Raspberry 4 USB-C)
15-30 cm - Micro-SD-Karte
4 GB - USB-Kartenleser
zum Beschreiben der SD-Karte - USB-Tastatur
nur während der Installation, optional aber empfohlen - HDMI-Kabel (beim Raspberry Pi 4 Micro-HDMI)
nur während der Installation, optional aber empfohlen
Außerdem benötigen Sie folgende Software:
- Raspbian Stretch
Es wird zwingend ein altes Image (Stretch) benötigt, da Stand heute (26.07.2019) Pi-Hole auf Raspbian Buster noch nicht lauffähig ist! Die letzte Version ist hier verlinkt. Es gibt immer noch Updates, keine Sorge. - Win32 DiskImager
Das gilt natürlich nur für die Windows-Nutzer - PuTTY
Das gilt natürlich auch nur für die Windows-Nutzer
Raspbian installieren
Als erstes installieren wir Raspbian. Dazu stecken wir die SD-Karte in unseren Kartenleser und starten Win32 DiskImager. Nachdem das Image und das korrekte Laufwerk ausgewählt wurden, starten wir die Installation mit dem Button Schreiben.
Als erstes installieren wir Raspbian. Dazu stecken wir die SD-Karte in unseren Kartenleser und starten Win32 DiskImager. Nachdem das Image und das korrekte Laufwerk ausgewählt wurden, starten wir die Installation mit dem Button Schreiben. Nachdem das Programm geschlossen wurde, kann die SD-Karte sicher entfernt werden.
Hardware-Aufbau
Nun ist es an der Zeit, den Raspberry Pi zu verkabeln und in Betrieb zu nehmen. Dazu setzten wir die SD-Karte in den Kartenslot. Anschließend stecken wir das kurze Netzwerkkabel zwischen einen LAN-Port der Fritz!Box und unseren Raspberry Pi. Optional, aber empfehlenswert ist der Anschluss eines Monitors (oder TV) per HDMI-Kabel und einer Tastatur, damit die ersten Schritte direkt am Gerät durchgeführt werden können.
Als letztes schließen wir den Raspberry Pi per USB-Kabel an die Fritz!Box an und starten ihn dadurch. Selbstverständlich kann auch ein Netzteil verwendet werden; allerdings erscheint es sinnvoll, dass unser neuer DNS-Server automatisch startet, sobald die Fritz!Box eingeschaltet wird. Außerdem sind die USB-Anschlüsse der Fritz!Box meißt ungenutzt während Steckdosen in deutschen Wohnzimmern immer knapp sind.
Raspbian konfiguieren
Nachdem Raspbian hochgefahren ist, können wir uns mit diesen Zugangsdaten anmelden (Vorsicht englische Tastatur! Das Y ist auf der Z-Taste zu finden!):
User: pi Passwort: raspberry
Anschließend nehmen wir die grundlegende Konfiguration des Systems vor. Diese wird mit dem Kommando
sudo raspi-config
gestartet. Minimale Schritte sind:
- Tastaturlayout anpassen (Menüpunkt 4)
- Passwort ändern (Menüpunkt 1)
- SSH aktivieren (Menüpunkt 5)
- Falls Sie WLAN nutzen, WLAN-Landeseinstellungen laden (Menüpunkt 4)
- Update durchführen (Menüpunkt 8)
- Optional: Übertakten (Menüpunkt 7)
Falls ein Neustart verlangt wird, können wir uns den erst einmal sparen. Zuerst führen wir ein Update des Systems durch:
sudo apt update && sudo apt dist-upgrade
Als letzten Schritt verpassen wir dem System eine statische IP-Adresse, denn schließlich wollen wir einen DNS-Server betreiben. Dazu ändern wir die Datei /etc/network/interfaces. Für die meisten ISPs ist es aktuell noch zweckmäßig, IPv6 zu deaktivieren, denn wenn es angeboten wird, ist es üblicherweise schlecht konfiguriert oder furchtbar langsam. Natürlich kann es auch konfiguriert werden, dann aber bitte mit statischer IP-Adresse!
auto eth0 allow-hotplug eth0 iface eth0 inet static address 192.168.178.2 netmask 255.255.255.0 gateway 192.168.178.1 up sysctl -qw net.ipv6.conf.eth0.disable_ipv6=1
Da das System-Update mit Sicherheit einen neuen Kernel installiert hat, starten wir das System erst einmal neu:
sudo init 6
Während des Neustarts können HDMI-Kabel, Monitor und Tastatur abgebaut werden, denn nun können wir per SSH fortsetzen.
Pi-Hole installieren
Sobald der Raspberry Pi wirder hochgefahren ist, verbinden wir uns mit den bekannten Zugangsdaten per SSH auf das Gerät. Die Installation von Pi-Hole ist denkbar einfach:
curl -sSL https://install.pi-hole.net | bash
Nach den ersten rein informativen Meldungen werden wir aufgefordert, einen übergeordneten DNS-Server auszuwählen. Wählen Sie frei aus, das wird später sowieso nochmal geändert.
Wer keinen triftigen Grund für Änderungen anführen kann, sollte alle Listen aktiviert lassen. Nur so werden zuverlässig Werbung und schadhafte Seiten herausgefiltert.
Die Protokolle müssen ebenfalls nicht geändert werden. Auch wenn in Heimnetzwerken IPv6 üblicherweise noch nicht zum Einsatz kommt, darf es gerne eingeschaltet bleiben. So wird unser Pi-Hole automatisch IPv6-fähig, sobald unser ISP im 21. Jahrhundert ankommt.
Nachdem wir die IP-Einstellungen nochmals bestätigt haben und zwei mehr oder weniger informative Warnmeldungen ignoriert haben, werden wir gefragt, ob wir das Web-Interface nutzen möchten. Das ist natürlich sinnvoll.
Damit das Webinterface funktioniert, müssen wir logischerweise einen Webserver installieren.
Ein Query-Log mag zwar auf dem ersten Blick die eine oder andere Datenschutz-Frage aufwerfen, ist aber sinnvoll, damit die Auswertefunktionen im Webinterface funktionieren.
Das Gleiche gilt für den Privacy Mode. Die Daten bleiben auf unserem Raspberry Pi und werden nicht nach außen übertragen. Es gibt also keinen Grund, uns selbst zu beschneiden.
Im Anschluss läuft die automatische Installation und Konfiguration aller Pakete. Da der Raspberry Pi nicht gerade zu den leistungsfähigsten PCs gehört, kann dieser Vorgang einige Zeit in Anspruch nehmen. Die Ablussmeldung sollen Sie nicht einfach bestätigen, denn sie zeigt das zufällig generierte Admin-Passwort für das Webinterface.
Damit alle Pakete ordentlich starten können, sollte auch hier nochmals ein Neustart durchgeführt werden, auch wenn dieser nicht zwingend erforderlich ist.
sudo init 6
DNS over HTTPS installieren
Nach dem Neustart gehen wir nicht ins Webinterface, sondern melden uns nochmals per SSH an. Pi-Hole spricht von sich aus kein DNS over HTTPS (DoH). Dazu muss eine zusätzliche Software installiert werden, die wir uns von Cloudflare besorgen:
cd /usr/local/bin sudo wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-arm.tgz sudo tar -xvzf cloudflared-stable-linux-arm.tgz sudo rm cloudflared-stable-linux-arm.tgz cloudflared -v
Wir erstellen einen unprivilegierten Benutzer, mit dem der DNS-Daemon ausgeführt werden soll:
sudo useradd -s /usr/sbin/nologin -r -M cloudflared
Anschließend tragen wir die Standard-Optionen in die Konfigurationsdatei /etc/default/cloudflared ein:
# Commandline args for cloudflared CLOUDFLARED_OPTS=--port 5053 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query
Besitzer und Rechte müssen angepasst werden:
sudo chmod +x /usr/local/bin/cloudflared sudo chown cloudflared:cloudflared /etc/default/cloudflared sudo chown cloudflared:cloudflared /usr/local/bin/cloudflared
An nächstes erstellen wir den Service für SystemD, indem wir die Datei /lib/systemd/system/cloudflared.service mit folgendem Inhalt erstellen:
[Unit] Description=cloudflared DNS over HTTPS proxy After=syslog.target network-online.target [Service] Type=simple User=cloudflared EnvironmentFile=/etc/default/cloudflared ExecStart=/usr/local/bin/cloudflared proxy-dns $CLOUDFLARED_OPTS Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
Als letzten Schritt starten wir den Dienst und sehen ihn für den Start bei jedem Bootvorgang vor:
sudo systemctl enable cloudflared sudo systemctl start cloudflared sudo systemctl status cloudflared
Ein kurzer Test zeigt uns, ob der Dienst sauber arbeitet:
dig @127.0.0.1 -p 5053 google.com ; <<>> DiG 9.10.3-P4-Ubuntu <<>> @127.0.0.1 -p 5053 google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65181 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1536 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 299 IN A 243.65.127.221 ;; Query time: 3 msec ;; SERVER: 127.0.0.1#5053(127.0.0.1) ;; MSG SIZE rcvd: 65
Pi-Hole konfigurieren
Jetzt ist es an der Zeit, Pi-Hole über das Webinterface zu konfigurieren. Dieses erreichen wir im Browser über die IP-Adresse des Rasberry Pi. Anmelden können wir uns mit dem Passwort, das uns während der Installation angezeigt wurde. Wer das schon wieder vergessen hat, kann es per SSH mit folgendem Kommando ändern:
pihole -a -p
Die voreingestellten DNS-Server deaktivieren wir alle. Stattdessen tragen wir den zuvor installierten DNS over HTTPS Daemon als Custom Server 1 ein.
Zusätzlich scrollen wir nach unten und aktivieren die alle Advanced Settings. Außerdem leiten wir die Domain der Fritz!Box (fritz.box) zu dieser weiter:
Entgegen vieler anders lautender Tutorials ist es sinnvoll, den DHCP-Server zu deaktivieren. Wir werden den DHCP der Fritz!Box verwenden, den wir später noch entsprechend konfigurieren. Dadurch bleiben Funktionen der Fritz!Box, wie die Anzeige korrekter Hostnamen im Webinterface, weiterhin erhalten.
Fritz!Box konfigurieren
Im letzten Abschnitt konfigurieren wir die Fritz!Box so,
- dass sie bei DHCP-Abfragen die IP-Adresse des Raspberry Pi als DNS-Server sendet,
- dass sie ihre eigenen Anfragen auch an den Raspberry Pi sendet und
- dass es allen Geräten außerdem dem Raspberry Pi verboten ist, DNS-Anfragen ins Internet zu senden.
Als erstes aktivieren wir über das Menü in der rechten, oberen Ecke die erweiterte Ansicht.
Im Menü Heimnetzwerk > Netzwerk > Netzwerkeinstellungen > IPv4-Adressen aktivieren wir DHCP und tragen die IP-Adresse unseres Raspberry Pi als DNS-Server ein.
Sofern in der Fritz!Box IPv6 aktiviert ist, muss im Menü Heimnetzwerk > Netzwerk > Netzwerkeinstellungen > IPv6-Adressen der Box-interne DNS-Server für dieses Protokoll ebenfalls deaktiviert werden. Grundsätzlich kann man hier nun auch den Raspberry Pi eintragen. Allerdings führt dies dazu, dass nicht vorhandene Domains nacheinander auf beiden IP-Adressen abgefragt werden, was alles langsamer macht. Am besten wird DNS über IPv6 also deaktiviert.
Im Menü Internet > Zugangsart > DNS-Server tragen weisen wir die Box an, dass sie den Raspberry Pi selbst auch als DNS-Server nutzen soll.
Wer IPv6 aktiviert hat, kann hier auch die IPv6-Adresse des Raspberry Pi angeben. Es ist allerdings nicht sinnvoll, beide Adressen auszufüllen, denn das verlangsamt die Anfragen wenn eine Adresse nicht existiert. Kann über IPv4 nicht aufgelöst werden, versucht die Fritzbox den „zweiten“ Server (IPv6), was natürlich auch scheitert. Bei IPv6 einfach „::“ eintragen (ohne die Anführungszeichen, um Anfragen über IPv6 zu unterbinden.
Anschließend sorgen wir dafür, dass nur noch der Raspberry Pi DNS-Abfragen ins Internet senden kann. Dadurch zwingen wir alle anderen Geräte, entweder den DNS-Server der Fritzbox, oder das per DHCP zugeteilte Pi-Hole zu nutzen. Versucht jemand dieses zu umgehen, indem er die Fritz!Box händisch einträgt, nutzt er indirekt auch das Pi-Hole, denn wir haben die Fritz!Box vorher so konfiguriert, dass sie Anfragen an das Pi-Hole weiterteitet.
Dazu legen wir nun im Menü Internet > Filter > Listen > Netzwerkanwendung hinzufügen einen Filter für die Firewall der Fritz!Box an. Da dieser Filter bei mir nicht nur DNS blockt, habe ich ihn Security-Blocks genannt.
Dieser Filter muss dir Ports TCP/53 und UDP/53 enthalten. Außerdem können dort weitere Ports wie z.B. die Microsoft NetBIOS-Ports eingetragen werden, die kein Computer im Internet kontaktieren sollte.
Im Menü Internet > Filter > Zugangsprofilebearbeiten wir jetzt das Profil Standard. Dort tragen wir unter dem Punkt Gesperrte Netzwerkanwendungen unsere neu definierte Filterliste Security-Blocks ein.
Als letztes weisen wir im Menü Internet > Filter > Kindersicherung unserem Raspberry Pi das Profil Unbeschränkt zu, damit er weiterhin DNS-Abfragen senden kann. Allen anderen Geräten geben wir das Profil Standard, für das wir zuvor die Sperren definiert haben. Sofern wir Geräte haben, die ganz ohne Internetzugang auskommen sollen (z.B. TV oder Drucker), können wir diese in das Profil Gesperrt einfügen.
Optional: Browser-Plugin
Nicht zwingend erforderlich, aber immer mal wieder praktisch, ist das Browser-Plugin von Pi-Hole. Es erlaubt uns, Pi-Hole vom Browser aus temporär zu deaktivieren, ohne uns dafür im Web-Frontend anmelden zu müssen. Wenn man ab und an mal Google Shopping nutzt, Google aber nicht dauerhaft auf die Whitelist setzen möchte, kann Pi-Hole so mit zwei Mausklicks direkt in der Menüleiste des Browsers für 10 Minuten deaktiviert werden. Nach Ablauf dieser Zeit aktiviert es sich automatisch wieder.
Für die Funktion des Addons ist der API-Key erforderlich, den man sich im Web-Frontend im Menü Einstellungen besorgen kann.
Das Plugin kann hier heruntergeladen werden:
Peter
Hallo zusammen, danke für die tolle Anleitung. Ist die denn noch aktuell? Werde das Projekt bald in Angriff nehmen, daher mach ich mich jetzt schonmal schlau.
Gruß