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, 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.

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:

Aufrufe: 4010

Ähnliche Artikel

Comments

0D8C5200

Hallo Heiko,

klasse Tutorial, das mir vor allem deshalb sehr geholfen hat, weil es zuerst mal auf die für mich ganz grundsätzlichen Fragen eingeht (z. B. die Vorteile/Unterschiede von DHCP über die FRITZ!Box oder den Raspi) und auch vermeintlich banale Punkte wie PuTTY/SSH kurz behandelt.

Ich hätte noch eine kurze Verständnisfrage:
Auf deinem 5. Screenshot von unten (Internet > Zugangsart > DNS-Server) ist bei dir als DNSv4-Server die IP-Adresse 192.168.178.4 eingetragen. Stimmt das tatsächlich so oder ist da evtl. ein Fehler passiert? Der Raspi hat doch eigentlich die 192.168.178.2 als IP-Adresse/lokaler DSN-Server (7. Screenshot von unten).

Vielen Dank!
M 😉

    Heiko Richter

    Ja, das stimmt so.

    Sinn ist es, dass alle DNS-Anfragen über Pi-Hole laufen. Unter Internet>Zugangsdaten>DNS-Server stehen normalerweise die DNS-Server des Internet-Providers, an die die Fritzbox alle DNS-Anfragen aus dem Heimnetz weiterreicht. Tärgt man dort die Adresse von Pi-Hole ein, werden Anfragen von der Fritzbox an Pi-Hole weitergeleitet und eben nicht an den Internetprovider. Dadurch werden DNS-Anfragen selbst dann gefiltert, wenn das Gerät bei der Fritzbox anfragt.

    Außerdem werden nur so auch die Anfragen gefilter, die die Fritzbox selbst produziert. Ist die Fritzbox jetzt einem Angriff durch Kriminelle ausgesetzt, kann es u.U. helfen, wenn manche DNS-Adressen nicht mehr aufgelöst werden können. Wurde sie z.B. durch Schadsoftware infiziert, die in Ihrem Namen E-Mails versendet oder Server attackiert, so wird diese Software außer Gefecht gesetzt, wenn der Command&Control-Server, von dem sie ihre Anweisungen erhält, nicht mehr erreichbar ist.

      0D8C5200

      Hallo Heiko,

      vielen Dank für deine sehr schnelle Antwort und die ausführliche Erläuterung! Mein Raspberry Pi bzw. Pi-hole und Unbound (ich habe dein How-to ab einem gewissen Punkt modifiziert, um stattdessen DNSOverTLS zu nutzen) arbeiten mittlerweile auch absolut perfekt, deshalb erst mal beide Daumen hoch. 😉

      Ich bin mir gerade nicht sicher, ob wir evtl. ein Stück weit aneinander vorbeigetextet haben? Deine Antwort ist sauber formuliert und war komplett für mich nachvollziehbar.

      Es gibt ja, wie du bereits erklärt hattest, zwei im Prinzip voneinander unabhängige Wege, Pi-hole in der FRITZ!Box einzutragen.

      1) Unter Internet > Zugangsdaten > DNS-Server (hierauf bezog sich unsere Konversation und das ist die DNS-Server-Einstellung, die die FRITZ!Box selbst nutzt)

      2) Unter Heimnetz > Netzwerk > Netzwerkeinstellungen > IPv4-Konfiguration > Lokaler DNS-Server (das ist die DNS-Server-Einstellung, die die FRITZ!Box per DHCP an sämtliche Geräte im Heimnetzwerk kommuniziert)

      Meine Frage an dich zielte eigentlich darauf ab, weshalb du bei Möglichkeit 1) der FRITZ!Box mit der 192.168.178.4 eine im Heimnetzwerk nicht vergebene IP-Adresse mitteilst. Bei Möglichkeit 2) ist mir soweit klar, dass es definitiv die 192.168.178.2 sein muss, da Pi-hole ansonsten gar keine Anfragen aus dem Heimnetzwerk erreichen würden.

      Aber hat es tatsächlich einen tieferen Sinn, dass du bei Weg 1) die FRITZ!Box mit ihren DNS-Anfragen quasi ins Leere laufen lässt oder ist die .4 letztendlich doch ein Versehen (obwohl du das in deiner ersten Antwort an mich ja eigentlich bereits definitiv verneint hattest)? Der DHCP-Server der FRITZ!Box vergibt ja nur Adressen im Bereich von .20 bis .200, weshalb die .4 in deinem eigenen Heimnetzwerk ebenfalls nicht “existieren”/vergeben sein dürfte.

      In einigen anderen Tutorials, die ich mir zusätzlich angeschaut hatte, war zu lesen, dass auch bei Weg 1) die 192.168.178.2 (bzw. allgemein formuliert die interne IP-Adresse des Raspberry Pi) eingetragen wird.

      Ich danke dir schon mal Vorab fürs Durchlesen und deine Geduld! 😉

        Heiko Richter

        Die beiden genannten Einstellungen sind grundverschieden und haben als solches erst einmal nichts miteinander zu tun. Pi-Hole sollte an beiden Stellen eingetragen werden, um eine möglichst reibungslose und schnelle Bearbeitung von DNS-Anfragen zu ermöglichen und um eine Umgehung von Pi-Hole auszuschließen.

        Unter Heimnetz > Netzwerk > Netzwerkeinstellungen > IPv4-Konfiguration > Lokaler DNS-Server wird die Adresse eingetragen, die die Fritzbox per DHCP an alle Geräte im Heimnetz weitergibt. Nach dieser Änderung fragt der Computer also nicht mehr bei der Fritzbox, sondern direkt bei Pi-Hole an. Das beschleunigt die Abfragen, weil der interne DNS-Server der Fritzbox und sein Cache umgangen werden.

        Unter Internet > Zugangsdaten > DNS-Server wird die Adresse festgelegt, an die die Fritzbox ihre eigenen Anfragen sendet. Das sind z.B. die Auflösung von Hostnamen für Timeserver, VoIP-Telefonie, Firmen-VPN und der AVM-Update-Server. Außerdem ist das auch die Adresse, an die der interne DNS-Server der Fritzbox externen Anfragen weiterleitet (sog. Upstream-DNS, oder DNS-Resolver).

        Durch das Ändern beider Anfragen und das Einrichten einer Sperre für DNS-Verkehr nach außen (Internet > Filter > Zugangsprofile) wird sichergestellt, dass alle DNS-Anfragen zwingend über Pi-Hole laufen. Möchte z.B. der pubertierende Sohn Pornoseiten besuchen, die von Pi-Hole geblockt werden, kann er das nicht mit einer Änderung des DNS-Server auf seinem Laptop erledigen. Ändert er von Pi-Hole auf die Fritzbox, so leitet die Fritzbox die Anfragen an Pi-Hole weiter. Ändern er zu GoogleDNS, Quad9 oder Cloudflare, werden seine DNS-Anfragen einfach geblockt und er kann garnicht mehr surfen. Das gleiche gilt natürlich auf für den Trojaner, den sich der junge Mann für der Installation von Pi-Hole auf einer Schmuddelseite eingefangen hat. Der kann nun auch auf Umwegen keinen Kontakt mehr zu seinen Command & Control Server herstellen.

        PS: Anfragen an die 192.168.178.4 laufen in meinem Netzwerk nicht ins Leere. Das ist bei mir die Adresse von Pi-Hole. Ich habe für den Screenshot nur vergessen, die Adresse zu ändern. Bild habe ich gerade ausgetauscht.

bytesortierer

Hallo Heiko,
Lass ich die unter Heimnetzwerk > Netzwerk > Netzwerkeinstellungen > IPv6-Adressen die Felder für DNSv6-Server im Heimnetzwerk leer? So wie im Screeenshot? Danke für dein Feedback!

    Heiko Richter

    Die Angabe einer zweiten IP-Adresse würde dazu führen, dass eine unbekannte Domain erst bei der einen und dann nochmals bei der anderen Adresse angefragt wird. Wenn Pi-Hole die Anfrage beim ersten Versuch über IPv4 nicht beantworten kann, wird es beim zweiten Versuch über IPv6 nicht anders aussehen.

    Bei FritzOS muss zwingend ein IPv4-DNS-Server angegeben werden, die Angabe eines IPv6-Servers ist dagegen optional. Um unnötige, doppelte Anfragen zu vermeiden, wird also nur die IPv4-Adresse angegeben, die IPv6-Adressfelder bleiben leer.

Leave a Comment