Fritz!Box mit Pi-Hole und DNS over HTTTPS

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.

Win32 DiskImager

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:

  1. Tastaturlayout anpassen (Menüpunkt 4)
  2. Passwort ändern (Menüpunkt 1)
  3. SSH aktivieren (Menüpunkt 5)
  4. Falls Sie WLAN nutzen, WLAN-Landeseinstellungen laden (Menüpunkt 4)
  5. Update durchführen (Menüpunkt 8)
  6. 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.

Auswahl des Resolvers

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.

Auswahl der Blacklists

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.

Auswahl der IP-Protokolle

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.

Web-Interface

Damit das Webinterface funktioniert, müssen wir logischerweise einen Webserver installieren.

Webserver-Installation

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.

Query-Logbuch

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.

Log-Level

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.

Zusammenfassung

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.

DNS-Resolver-Auswahl

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:

DNS-Resolver-Einstellungen

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.

DHCP-Einstellungen

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.

Erweiterte Ansicht

Im Menü Heimnetzwerk > Netzwerk > Netzwerkeinstellungen > IPv4-Adressen aktivieren wir DHCP und tragen die IP-Adresse unseres Raspberry Pi als DNS-Server ein.

IPv4-Adressen

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.

IPv6-Adressen

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, muss hier auch die IPv6-Adresse des Raspberry Pi angeben.

DNS-Server

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.

Filterlisten

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.

Filterliste

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.

Filterliste zum Zugangsprofil zuordnen

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.

Zugangsprofil zupordnen

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:

Kommentar hinterlassen