Pi-hole: Einrichtung und Konfiguration mit Fritz!Box – AdBlocker Teil1

1. Werbe- und trackerfreiPi-hole mit Fritz!Box

Mittlerweile dürfte jeder den Einplatinencomputer Raspberry Pi kennen. Mit dem kleinen Computer im Scheckkartenformat lassen sich verschiedene Projekte realisieren. Eines davon ist der Pi-hole, mit dem sich Werbung und Tracker auf allen Geräten im (Heim-)Netzwerk ausblenden/blockieren lassen.

Der vorliegende Artikel bildet den Auftakt zu einer Artikelserie, in der verschiedene AdBlocker-Lösungen vorgestellt werden. Wir beginnen mit Pi-hole, der in Kombination mit einer Fritz!Box, einer weit verbreiteten Routerlösung von AVM, konfiguriert wird. Der Fokus liegt dabei auf einer einfachen Konfiguration, die leicht aktualisiert werden kann und sich an Anfänger und Fortgeschrittene richtet.

Dieser Beitrag ist Teil einer Artikelserie:

2. Was wir erreichen wollen

Dies ist eine Schritt-für-Schritt-Anleitung von der ersten Konfiguration eines Raspberry Pi bis zu dem Punkt, an dem Pi-hole alle DNS-Anfragen aus unserem Netzwerk beantwortet. Ziel ist es, ausgehende DNS-Anfragen an Werbe- und Tracking-Domains zu blockieren.

Wer direkt mit der Installation beginnen möchte, benötigt einen Raspberry Pi mit mindestens 512 MB RAM und eine (micro) SD-Karte mit mindestens 4 GB Speicher. Dann kann es direkt mit Punkt 4 weitergehen. Wer sich für die technischen Hintergründe und den geplanten Aufbau interessiert, sollte zuerst weiterlesen.

2.1 Konzept | Technischer Hintergrund

Am Beispiel von In-App-Werbung möchte ich zunächst erläutern, wie Pi-hole technisch funktioniert. Nehmen wir an, ein App-Entwickler hat ein Werbemodul in seine App integriert. Bei jedem Start der App oder auch während der Laufzeit kontaktiert die App bzw. das integrierte Modul die Adresse:

werbung.server1.de

Dieser Domainname muss jedoch zunächst in eine IP-Adresse übersetzt werden, damit die Werbung von dort aus geladen werden kann. Diese Aufgabe übernimmt das Domain Name System (DNS) – einer der wichtigsten Dienste im Internet, der für genau diese Übersetzung zuständig ist. Das Prinzip dahinter kennt jeder: Ihr gebt im Browser eine URI (also den Domainnamen) ein, dieser wird dann von einem DNS-Server in die zugehörige IP-Adresse übersetzt. Namen sind eben leichter zu merken als IP-Adressen. In eurem Router sind daher üblicherweise DNS-Server von eurem Provider hinterlegt oder ihr habt manuell eigene eingetragen, die dann anschließend die Adresse »werbung.server1.de« in eine IP-Adresse übersetzen.

Dieses DNS-Prinzip macht sich Pi-hole zunutze. In seinem Speicher verwaltet Pi-hole eine Liste mit Domainnamen, die entweder Werbung ausliefern, den Nutzer tracken/verfolgen oder sich anderweitig negativ auf Sicherheit und Privatsphäre auswirken können. Habt ihr Pi-hole installiert, wird die DNS-Abfrage zunächst mit der intern hinterlegten Liste abgeglichen. Befindet sich die Adresse

werbung.server1.de

in der Liste bzw. bei einem Treffer, wird die IP-Adresse nicht wie üblich aufgelöst, sondern euer Gerät bzw. die App erhält sinngemäß die Antwort: »Nicht erreichbar« – die Übersetzung in die korrekte IP-Adresse wird also von Pi-hole unterdrückt. Die Folge: Die Werbung kann nicht von der tatsächlichen Quelle bzw. IP-Adresse nachgeladen werden. Statt der Werbung sieht der User einen Platzhalter oder schlicht nichts. Ein einfaches Prinzip, das die Werbung schon vor der Auslieferung blockiert – sogar noch vor der Übersetzung in die IP-Adresse:

DNS-Ad-Blocking

2.2 Netzwerkaufbau

In der Standardkonfiguration stellt Pi-hole seine DNS-Anfragen via UDP/TCP über Port 53 an einen DNS-Server, wie Google, OpenDNS oder Quad9. Die Anfragen erfolgen jedoch unverschlüsselt, also im Klartext. Selbst wenn man einen unzensierten und freien DNS-Server konfiguriert hat, besteht die Möglichkeit, dass jemand die DNS-Anfragen mitliest und auswertet.

Im folgenden Netzwerkaufbau sehen wir, dass der Pi-hole seine DNS-Anfragen nicht direkt an einen DNS-Server eines Anbieters sendet, sondern an die lokale Fritz!Box. Diese wiederum leitet die Anfrage an einen Upstream-DNS-Server weiter. Im Gegensatz zu einem Standard-Pi-hole ist die Fritz!Box nämlich in der Lage, die DNS-Anfragen via DNS over TLS (DoT) zu verschlüsseln. Dies erschwert das Mitlesen bzw. Auswerten des Surfverhaltens – bietet aber natürlich auch keinen hundertprozentigen Schutz (Stichwort: SNI, OCSP). Wer sein Surfverhalten »geheim« halten möchte, muss dann auf den Tor-Browser zurückgreifen und sich an bestimmte Verhaltensregeln halten.

Nachfolgend möchte ich kurz erläutern, was im Netz passiert, wenn ein Smartphone eine Website (www.kuketz-blog.de) aufrufen möchte. Zunächst gibt der Nutzer die Adresse www.kuketz-blog.de in die Adresszeile des Browsers ein. Damit der Browser die Seite anzeigen kann, muss die Domain zunächst in die zugehörige IP-Adresse umgewandelt werden. Dazu stellt das Smartphone zunächst eine DNS-Anfrage [1] an den Pi-hole. Der Pi-hole prüft nun lokal in seinen Filterlisten, ob es sich bei der Domain um eine Werbe- oder Tracking-Domain handelt. Ist dies nicht der Fall, wird die DNS-Anfrage [2] an die Fritz!Box im lokalen Netzwerk weitergeleitet. Die Fritz!Box wiederum sendet die DNS-Anfrage [3] nun per DoT verschlüsselt an den hinterlegten (primären) DNS-Server. Nach Erhalt der zugehörigen IP-Adresse vom DNS-Server, wird die Fritz!Box diese Information nun an den Pi-hole [4] weiterreichen und dieser wiederum an das Smartphone. Anschließend kennt der Browser die zugehörige IP-Adresse der Domain www.kuketz-blog.de (46.38.242.112) und sendet die HTTP-Anfrage [5] zunächst an die lokale Fritz!Box. Diese wiederum leitet die HTTP-Anfrage [6] an den für die IP-Adresse 46.38.242.112 zuständigen Webserver weiter. Anschließend kann die Website an das Smartphone ausgeliefert werden.

Netzwerkaufbau

Zusammengefasst nehmen DNS-Anfragen den folgenden Weg:

Clients -> Pi-hole -> Fritz!Box -> Upstream-DNS-Server

Zu beachten gilt, dass sowohl IPv4 als auch IPv6 im Netzwerk benutzt wird. Der Pi-hole bekommt also eine private IPv6-Adresse (Unique Local Address (ULA)) von der Fritz!Box zugewiesen. Geräte im Netzwerk können dann mittels IPv4 oder IPv6 DNS-Anfragen an den Pi-hole senden.

2.3 Minimale Geschwindigkeitseinbußen

Die Fritz!Box ist im dargestellten Netzwerkaufbau eine weitere Zwischenstation, die DNS-Anfragen auf dem Weg zu ihrem Ziel passieren müssen. Das bedeutet zwangsläufig, dass die Pakete etwas länger unterwegs sind. Außerdem wird statt ungesichertem UDP mit TLS gesichertes TCP (DoT) verwendet, was zusätzlichen Overhead bedeutet. Mit dem Benchmark-Tool DNSBench kann man herausfinden, wie groß die zusätzliche Latenz ist – das variiert natürlich je nach verwendetem Upstream-DNS-Server in der Fritz!Box.

Mit den öffentlichen DNS-Servern von AdGuard habe ich Folgendes gemessen:

  • UDP/TCP Port 53 (unverschlüsselt): ca. 50 bis 80 Millisekunden
  • DNS over TLS Port 853 (verschlüsselt): ca. 90 bis 140 Millisekunden

Die Latenz steigt also tatsächlich – einen spürbaren Unterschied beim Surfen konnte ich allerdings nicht feststellen. Das liegt vermutlich auch daran, dass Pi-hole viele Anfragen ohnehin aus dem Cache liefert.

2.4 Verwendete Software/Version

Nachfolgend möchte ich die verwendete Software kurz vorstellen. Insbesondere die Versionsnummern sind von Interesse, da sich die hier beschriebene Installation durch Updates ändern kann.

  • Basissystem: Raspberry Pi OS Lite (64 Bit) auf Basis von Debian GNU/Linux Bullseye
  • Pi-hole: Pi-hole v5.17.1 | FTL v5.23 | Web Interface v5.20.1
  • Fritz!OS: 7.80
  • Raspberry Pi: Raspberry Pi 3 Mod. B

Bitte beachten

Die Blog-Beiträge haben nicht wie Enzyklopädie-Einträge (bspw. Wikipedia) den Anspruch, dauerhaft aktuell und richtig zu sein, sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Redaktionsschluss. Lediglich die Empfehlungsecke wird regelmäßig aktualisiert.

3. Hardware: Raspberry Pi

Bereits auf einem Raspberry Pi Zero ist Pi-hole lauffähig. Da der Zero allerdings keinen Ethernet-Port hat, würde ich auf ein anderes Modell zurückgreifen. Die aktuellen Raspberry Pi 4 sind für diese Aufgabe fast schon überdimensioniert. Persönlich verwende ich einen Raspberry Pi 3 Mod. B aus dem Jahr 2016. Ihr könnt aber auch schon mit einem Raspberry Pi 1 Mod. B aus dem Jahr 2012 einsteigen – die offizielle Empfehlung lautet nur: Mindestens 512MB RAM.

Hinweis

Auf Wikipedia gibt es eine tabellarische Übersicht, die die Eigenschaften aller Raspberry Pi Modelle übersichtlich darstellt.

Wer noch keinen Raspberry Pi zu Hause hat, greift am besten zu einem KIT. Die offizielle Pi-hole Dokumentation empfiehlt bspw. das Official Pi-hole Raspberry Pi 4 Kit. Daran könnt ihr euch orientieren. Anbei mein Setup:

  • Raspberry Pi 3 Modell B (inkl. WLAN)
  • Offizielles Micro USB Netzteil 2A – 5V für Raspberry Pi 3
  • Offizielles Gehäuse für Raspberry Pi 3 (himbeer / weiß)
  • SanDisk Ultra Android microSDHC 16GB bis zu 80 MB/Sek Class 10

Ein Bildschirm oder eine externe Tastatur werden normalerweise nicht benötigt. Nach dem Aufspielen eines Raspberry Pi Images greifen wir über eine Secure Shell (SSH) über das Netzwerk auf den Pi zu.

4. Installation Betriebssystem

Zunächst wird ein Basissystem installiert. Die Raspberry Pi Foundation bietet ein Raspberry Pi OS Lite (64 Bit) auf ihrer Website zum Download an. Bei den Lite-Images handelt es sich um ein minimales System, das aktuell auf Debian Old-Stable (Bullseye) basiert. Der einfachste Weg, das System auf einer SD-Karte zu installieren, ist der Raspberry Pi Imager. Nachfolgend sind die Schritte kurz erklärt.

4.1 Raspberry Pi Imager

  • Installiert den Raspberry Pi Imager für euer System (Windows, macOS oder Ubuntu)
  • Anschließend startet ihr das Programm und klickt auf OS WÄHLEN
  • Navigiert zu »Raspberry Pi OS (other) -> Raspberry Pi OS Lite (64-bit)« (0.3 GB)
  • Danach selektiert ihr im Hauptmenü SD-KARTE WÄHLEN. Wählt die korrekte/gewünschte SD-Karte aus, auf dem das System installiert werden soll.
  • Vor dem Schreiben des Systems klickt ihr unten rechts auf das Zahnrad und wählt dort Folgendes:
    • SSH aktivieren: Check
    • Benutzername und Passwort setzen:
      • Benutzername: pi
      • Passwort: raspberry
    • Telemetry aktvieren: Uncheck
  • Klickt auf SPEICHERN und anschließend im Hauptmenü auf SCHREIBEN. Nachdem der Vorgang abgeschlossen ist, legt ihr die SD-Karte in den Raspberry Pi ein, verbindet das Ethernetkabel mit der Fritz!Box und schließt das Netzteil an.

Hinweis

Es gibt auch ein Video, das die Schritte nochmal visuell darstellt.

4.2 Alternativ: Manuelle Installation des Images

Ihr könnt die Schritte natürlich auch manuell ausführen. Das sieht dann wie folgt aus:

  • Download Raspberry Pi OS Lite (64-bit)
  • Zip-File entpacken
  • Schreibt das Image auf die SD-Karte. Unter Linux (Terminal) funktioniert das bspw. wie folgt:
    sudo dd bs=4M if=/Pfad/zum/Image/2023-05-03-raspios-bullseye-arm64-lite.img of=/dev/sdX conv=fsync

    Stellt unbedingt sicher, dass ihr bei /dev/sdX das korrekte Device/Gerät angeben habt (also die SD-Karte).

  • Nachdem das Image auf die SD-Karte geschrieben wurde, könnt ihr auf das Dateisystem zugreifen. Navigiert auf die Partition /boot[fs] und legt dort folgende Dateien an:
    • ssh: Legt eine Datei mit der Bezeichnung ssh an. Dies ist erforderlich, um anschließend mittels Secure Shell (SSH) auf den Raspberry Pi zugreifen zu können. Unter Windows gibt es diesen Ordner nicht, hier legt ihr die Datei direkt im Hauptverzeichnis der SD-Karte an.
    • userconf.txt: Anschließend wird eine Datei mit der Bezeichnung userconf.txt angelegt. Dort tragt ihr Folgendes ein:
      pi:$6$T6s1r19kJcX4WPpC$W5K/SPq6HE84yK.GwLuS2tqQhV6W4g6vHe/bIsBeE2rHJpbRXeQIEAjP0KnlCU5ifFfq.t96.KWX81iGO3kQV/

      Der Nutzername ist dann pi und das initiale Passwort raspberry.

  • Nachdem die Dateien angelegt sind, legt ihr die SD-Karte in den Raspberry Pi ein, verbindet das Ethernetkabel mit der Fritz!Box und schließt das Netzteil an.

4.3 Netzwerkverbindung Raspberry Pi

Ihr könnt den Raspberry Pi nun zum ersten Mal starten. Im Normalfall sollte eure Fritz!Box einen bestimmten IP-Adressbereich reserviert haben, um mittels DHCP eine IP-Adresse an den Pi zu vergeben. Über das Webinterface der Fritz!Box vergeben wir nachfolgend eine feste IP-Adresse an den Pi:

  • Meldet euch am Webinterface der Fritz!Box an und navigiert zu Heimnetz -> Netzwerk. Dort sollte der Pi in der Liste der aktiven Verbindungen erscheinen. Über das Bleistiftsymbol am Ende der Zeile gelangt man zu den Details des Gerätes. Legt dort folgende Optionen/Einstellungen fest:
    • Setzt ein Häkchen bei Internetnutzung priorisiert
    • Verändert unter IPv4-Adresse die letzte Zahl – nach dem dritten Punkt – und stellt damit eine feste IP-Adresse ein
    • Klickt anschließend auf Übernehmen

Das sieht dann unter FRITZ!OS 7.57 wie folgt aus:

Raspberry Pi: Feste IP-Adresse

Hinweis

Die hier verwendete IP-Adresse (192.168.50.5) müsst ihr in der Folge dann immer entsprechend durch eure selbst vergebene ersetzen.

Damit die Fritz!Box dem Raspberry Pi die eingestellte IP-Adresse zuweist, müsst ihr das Netzwerkkabel ziehen oder den Pi kurz vom Strom trennen bzw. neu starten. Danach ist euer Raspberry Pi unter der vergebenen IP-Adresse per SSH erreichbar.

4.4 Einrichtung Raspberry Pi

Unter macOS oder Linux starten wir eine SSH-Sitzung über das Terminal – für Windows kann PuTTY verwendet werden. Die Zugangsdaten lauten: Benutzername (pi) / Passwort (raspberry)

ssh pi@192.168.50.5

Zunächst ändern wir das initial vergebene Passwort:

passwd

Die Zeitzone (Europe/Berlin) passen wir mit raspi-config an:

sudo raspi-config
Localisation Options -> Timezone -> Europe -> Berlin
Finish

Anschließend aktualisieren wir die Paketdatenbank und bringen die vorinstallierte Software auf den neuesten Stand:

sudo apt-get update 
sudo apt-get upgrade 
sudo apt-get dist-upgrade 
sudo apt-get autoremove

Das dauert für gewöhnlich etwas. Nach Abschluss des Vorgangs wird ein Neustart eingeleitet:

sudo reboot

5. Pi-hole

Vor der Installation von Pi-hole konfigurieren wir die Fritz!Box so, dass der Raspberry Pi bereits eine private IPv6-Adresse (ULA) zugewiesen bekommt. Über diese IPv6-Adresse ist der Pi-hole anschließend via IPv6 für die Clients im Netzwerk erreichbar.

5.1 Vor-Einstellungen Fritz!Box

Navigiert zu Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> IPv6-Einstellungen (fast ganz unten). Passt die Einstellungen dort nun wie folgt an:

  • Router Advertisement im LAN aktiv: Check
    • Unique Local Addresses (ULA) immer zuweisen: Check
    • ULA-Präfix manuell festlegen
      • fd 00 : [leer] : [leer] : [leer] /64

Das sieht dann wie folgt aus:

Fritz!Box ULA

5.2 Installation

Wir melden uns erneut über SSH am Pi-hole an und starten die Installation mit folgendem Befehl:

sudo curl -sSL https://install.pi-hole.net | bash

Der Installationsassistent bietet Optionen zur Konfiguration an. Diese werden wie folgt vorgenommen:

Static IP Address
   Yes: Set static IP using current values
Upstream DNS Provider
   OpenDNS (ECS, DNSSEC)
Blocklists
   Yes (include StevenBlack's)
Admin Web Interface
   Yes
Web Server
   Yes
Enable Logging
   Yes
Privacy mode FTL
   Show everything (private Installation)

Nach der Installation werden die IPv4- und die IPv6-Adresse des Pi-Holes angezeigt. Notiert euch beide Adressen oder macht einen Screenshot, da beide Angaben noch benötigt werden. Ebenso die Adresse, unter der das Webinterface erreichbar ist. Das Passwort für das Webinterface ist standardmäßig etwas kurz, wir können dies mit folgendem Befehl ändern und ein sicheres Passwort vergeben:

pihole -a -p

Wer die Informationen mit den IP-Adressen zu schnell wegklickt, sollte nicht verzagen: Die IP4- und IPv6-Adressen des Pi-hole können ebenfalls über das Terminal ermittelt werden.

  • IPv4:
    ip address | grep "inet 192"
  • IPv6:
    ip address | grep "inet6 fd"

6. Konfiguration

Wir wollen nun erreichen, dass alle DNS-Anfragen von den Clients zunächst an den Pi-hole gestellt werden. Dieser leitet die Anfrage dann an die Fritz!Box weiter, die gegenüber dem Pi-hole als Upstream-DNS-Server fungiert. In der Fritz!Box wird der Pi-hole per DHCP als lokaler DNS-Server für alle Clients bekannt gemacht. Falls kein DHCP verwendet wird, muss der DNS-Server auf den Clients manuell geändert werden.

6.1 Fritz!Box: Pi-hole als DNS-Server

Nachfolgend wird Pi-hole als lokaler DNS-Server für alle Clients bekannt gemacht.

Zunächst werden die IPv4-Netzwerkeinstellungen auf der Fritz!Box angepasst. Navigiert dazu zu Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> IPv4-Einstellungen (fast ganz unten):

  • Lokaler DNS-Server: 192.168.50.5 [hier die IPv4-Adresse des Pi-hole eintragen]

Anschließend passen wir die IPv6-Netzwerkeinstellungen über Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> IPv6-Einstellungen (fast ganz unten) wie folgt an:

  • DNSv6-Server auch über Router Advertisement bekanntgeben (RFC 5006): Check
  • Lokaler DNSv6-Server: fd00 : 0 : 0 : 0 : eae7 : a43a : 2f8c : 9fd6 [hier die IPv6-Adresse des Pi-hole eintragen]

6.2 Fritz!Box: DoT-fähige DNS-Server hinterlegen

DNS-Anfragen aus dem lokalen Netzwerk sollen DoT-verschlüsselt an einen Upstream-DNS-Server gesendet werden. Dies übernimmt die Fritz!Box. Dazu öffnet man die Einstellungen unter Internet -> Zugangsart -> DNS-Server. Nachfolgend habe ich die DNS-Server von AdGuard (bevorzugt) und dnsforge.de (alternativ) verwendet. In der Empfehlungsecke sind weitere DNS-Server aufgelistet.

  • DNSv4-Server
    • Andere DNSv4-Server verwenden: Check
      • Bevorzugter DNSv4-Server: 94.140.14.140
      • Alternativer DNSv4-Server: 176.9.93.198
  • DNSv6-Server
    • Andere DNSv6-Server verwenden: Check
      • Bevorzugter DNSv6-Server: 2a10:50c0::1:ff
      • Alternativer DNSv6-Server: 2a01:4f8:151:34aa::198
  • DNS over TLS (DoT)
    • Verschlüsselte Namensauflösung im Internet (DNS over TLS): Check
      • Zertifikatsprüfung für verschlüsselte Namensauflösung im Internet erzwingen: Check
    • Auflösungsnamen der DNS-Server
      • unfiltered.adguard-dns.com
        dnsforge.de

6.3 Pi-hole

Abschließend ist noch eine Anpassung über das Webinterface des Pi-hole erforderlich. Während der Installation wurde als Upstream-DNS-Server OpenDNS (ECS, DNSSEC) gewählt, dies muss angepasst werden. Wir geben folgende Adresse in den Browser ein und melden uns an:

192.168.50.5/admin

Unter Settings -> DNS nehmen wir folgende Einstellungen vor:

  • Alle Häkchen bei OpenDNS (ECS, DNSSEC) und auch bei allen weiteren DNS-Servern (falls vorhanden) entfernen
  • Custom 1 (IPv4): 192.168.50.1 (IPv4-Adresse der Fritz!Box)
  • Custom 3 (IPv6): fd00::de15:c8ff:fe13:9af5 (IPv6-Adresse der Fritz!Box)

Hinweis

Die Unique Local Address bzw. die private IPv6-Adresse der Fritz!Box könnt ihr wie folgt herausfinden. Meldet euch im Webinterface der Fritz!Box an und öffnet die Einstellungen unter Netzwerk -> Netzwerkeinstellungen -> IPv6-Einstellungen. Direkt oben unter »Unique Local Addresses« findet ihr hinter der Bezeichnung Unique Local Address Ihrer FRITZ!Box die IPv6-Adresse eurer Fritz!Box.

Pi-hole Upstream-DNS-Server

Anschließend wird ganz unten auf der Seite Use Conditional Forwarding angekreuzt und die folgenden Werte eingetragen:

  • Local network in CIDR notation: 192.168.50.0/24 (an euer Netzwerk anpassen)
  • IP address of your DHCP server (router): 192.168.50.1 (IPv4-Adresse eurer Fritz!Box)
  • Local domain name (optional): fritz.box

Nach einem Klick auf Save ist euer Pi-hole bereits einsatzbereit. Startet eure Geräte im Netzwerk neu, damit ihnen der neue DNS-Server (Pi-hole) per DHCP mitgeteilt wird. Danach werden ausgehende DNS-Anfragen über das Pi-hole gefiltert.

7. Anpassungen: Filterlisten, Updates und Co. [optional]

7.1 Filterlisten

Die mitgelieferte Filterliste (StevenBlack) entfernt bereits eine Menge Werbung, Tracker und anderen unnötigen Netzballast. Im Webinterface von Pi-hole kann man über das Menü Adlists weitere Filterlisten hinzufügen. Persönlich verwende diese drei Filterlisten:

Natürlich können auch andere/weitere (kombinierte) Filterlisten (bspw. The Firebog, WindowsSpyBlocker (Hosts)) aktiviert bzw. hinzugefügt werden. Eventuelle Überschneidungen werden von Pi-hole automatisch entfernt – doppelte Einträge wären für die Verarbeitung der Filterlisten zu ineffizient. Nach dem Hinzufügen der Filterlisten kann ein manuelles Update angestoßen werden, damit diese sofort verwendet werden. Öffnet dazu den Menüpunkt Tools -> Update Gravity und klickt auf den Update-Button. Standardmäßig aktualisiert Pi-hole die Filterlisten einmal pro Woche.

Durch die Aktivierung von Filterlisten kann es zum sogenannten »Overblocking« kommen. Das bedeutet, dass Domains, die für die Funktionalität einer App/Website notwendig sind, fälschlicherweise gefiltert werden. Es muss dann im Einzelfall entschieden werden, welche Domain(s) über das Webinterface in Pi-hole freigegeben werden. Meldet euch dazu am Pi-hole-Webinterface an und klickt im Menü auf Query Log – dort werden alle DNS-Anfragen protokolliert. Am Ende jeder Zeile kann eine Aktion für die Domain ausgewählt werden:

  • Blacklist: Die Domain wird in Zukunft gefiltert, d.h. blockiert
  • Whitelist: Die Domain wird in Zukunft nicht mehr gefiltert, d.h. nicht mehr blockiert

Action: Whitelist/Blacklist

7.2 Update-Verhalten anpassen [Fortgeschrittene]

Über die Konfigurationsdatei /etc/cron.d/pihole kann das Update-Verhalten von Pi-hole an die eigenen Bedürfnisse angepasst werden. Persönlich habe ich die Aktualisierung von Filterlisten bspw. auf Sonntagabend um 22:30 Uhr gelegt:

sudo nano /etc/cron.d/pihole
# Pi-hole update ad sources
30 22   * * 0   root    PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole updateGravity >/var/log/pihole/pihole_updateGravity.log || cat /var/log/pihole/pihole_updateGravity.log

7.3 Energie/Strom sparen [Fortgeschrittene]

Ein Raspberry Pi verfügt über verschiedene Schnittstellen wie Audio, Bluetooth, WiFi etc. Die meisten Schnittstellen sind für den Betrieb des Pi-hole nicht notwendig. Das Deaktivieren dieser Schnittstellen reduziert den Stromverbrauch des kleinen Einplatinencomputers. Nach dem Abschalten von Audio, Bluetooth, WiFi und HDMI habe ich im Betrieb noch einen Verbrauch von ca. 1,2 bis 1,5 Watt gemessen – je nach Auslastung. Das bedeutet, dass der Stromverbrauch eines Raspberry Pi 3 Mod. B von ca. 1,8 Watt um ca. 0,5 bis 0,6 Watt reduziert werden kann. Die notwendigen Anpassungen können direkt in einer Konfigurationsdatei (config.txt) vorgenommen werden, nachdem man sich per SSH mit dem Pi verbunden hat:

sudo nano /boot/config.txt
# Disable analog audio 
dtparam=audio=off
# Disable audio via HDMI 
dtoverlay=vc4-kms-v3d,noaudio 
# Disable Bluetooth, WiFi and HDMI 
dtoverlay=disable-bt  
dtoverlay=disable-wifi 
hdmi_blanking=1

Die Zeilen mit dtparam=audio und dtoverlay sind bereits vorhanden und müssen angepasst werden. Die Befehle zum Deaktivieren von Bluetooth, WiFi und HDMI können einfach am Ende der Konfigurationsdatei hinzugefügt werden.

7.4 Schreibzugriffe auf SD-Karte minimieren [Fortgeschrittene]

Permanente Schreibvorgänge können die Lebensdauer einer SD-Karte verkürzen. Nachfolgend werden zwei Möglichkeiten vorgestellt, die Lebensdauer der SD-Karte in Kombination mit Pi-hole (möglicherweise) zu verlängern.

Standardmäßig schreibt Pi-hole jede Minute in eine Log-Datei bzw. eine SQL-Lite-Datenbank (SQLite3). Durch die zeitliche Streckung dieses Schreibvorgangs auf 30 Minuten kann die SD-Karte etwas geschont werden. Außerdem werden wir die Langzeitdaten (Long-term Data), die Pi-hole sammelt, von 365 Tagen auf 30 Tage reduzieren:

sudo nano /etc/pihole/pihole-FTL.conf
#; How often do we store queries in FTL's database [minutes] | Default: 1.0 
DBINTERVAL=30
#; IP addresses older than the specified number of days are removed from database | Default: 365 
MAXDBDAYS=30

Zusätzlich besteht die Möglichkeit, bestimmte Ordner, auf die häufig Schreibzugriffe erfolgen, in eine RAM-Disk auszulagern. Mit dem Linux-Tool tmpfs ist dies einfach zu bewerkstelligen. Auf Linux-Systemen, die journald für die Protokollierung verwenden, hat dieser Schritt jedoch wenig Einfluss auf eine mögliche Verlängerung der Lebensdauer. Die Schreibvorgänge sind in der Regel gebündelt und erfolgen ca. alle 5 Minuten. Wer dies dennoch umsetzen möchte, kann bspw. die Verzeichnisse /tmp und /var/log in eine tmpfs-RAM-Disk mit jeweils 100 MB RAM auslagern:

sudo nano /etc/fstab
tmpfs   /tmp       tmpfs   defaults,noatime,nosuid,size=100m   0   0 
tmpfs   /var/log   tmpfs   defaults,noatime,nosuid,mode=0755,size=100m   0   0

Hinweis

Nach einem Absturz oder Neustart des Gerätes sind Dateien/Informationen in diesen Verzeichnissen verschwunden. Entweder man erstellt sich einen Cronjob, der die Daten regelmäßig vom RAM auf die SD-Karte schreibt oder man verwendet ein Tool wie Log2Ram.

Alle Lese- und Schreibvorgänge auf die SD-Karte (bzw. Fesplatte) können übrigens mit dem Tool fatrace dargestellt werden:

sudo apt-get install fatrace

Mit dem folgenden Kommando kann fatrace so eingestellt werden, dass nur Schreiboperationen ausgegeben werden:

sudo fatrace --filter=W --timestamp

Das sieht dann bspw. wie folgt aus:

09:14:49.934532 pihole-FTL(572): CW /etc/pihole/pihole-FTL.db
09:14:50.946265 php-cgi(654): CW /etc/pihole/gravity.db
[…]

Unterstütze den Blog mit einem Dauerauftrag!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

7.5 Automatische Updates: System und Pi-hole [Fortgeschrittene]

Beim Thema Updates bzw. Aktualisierungen müssen wir zunächst zwischen verschiedenen Komponenten unterscheiden:

  • Updates des Basissystems bzw. der installierten Debian-Pakete
  • Update des Pi-hole bzw. FTL
  • Update der hinterlegten Filterlisten

Die Filterlisten werden von Pi-hole standardmäßig einmal pro Woche aktualisiert. Diesen Punkt können wir also abhaken. Zur automatischen Aktualisierung von Pi-hole bzw. seiner Komponenten wie FTL sagt das Pi-hole-Projekt:

This is technically possible, but we do not recommend auto-updating Pi-hole. Some updates are breaking, and if you wake up in the morning with an update that doesn’t meet your needs (and no backup) you will have a problem.

The dashboard will notify you when an update is available. Read the release notes, then if you want to update do so manually.

Über die Weboberfläche von Pi-hole wird man über ein anstehendes Update demnach informiert. Nach Durchsicht der Versionshinweise bzw. der Änderungen sollte das Update dann vom Benutzer manuell angestoßen werden.

Das Basissystem hingegen, das auf Debian basiert, kann nach meiner Erfahrung automatisch (UnattendedUpgrades) aktualisiert werden. Dazu sind folgende Schritte notwendig:

Zunächst werden die Pakete unattended-upgrades und apt-listchanges installiert:

sudo apt-get install unattended-upgrades apt-listchanges

Danach passen wir die Konfigurationsdatei an:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Damit automatisch Pakete vom Raspbian-Projekt eingespielt werden, ist die folgende Anpassung notwendig. Nach

"origin=Debian,codename=${distro_codename}-security,label=Debian-Security";

werden die folgenden zwei Zeilen hinzugefügt:

"origin=Raspbian,codename=${distro_codename},label=Raspbian";  
"origin=Raspberry Pi Foundation,codename=${distro_codename},label=Raspberry Pi Foundation";

Mit dem nachfolgenden Befehl kann eine Paketprüfung manuell angestoßen werden:

sudo unattended-upgrade -d

Hinweis

UnattendedUpgrades aktualisiert nur die Pakete der aktuell installierten Debian/Rasbian-Version. Upgrades auf neue Debian-Versionen (bspw. von Bullseye auf Bookworm) müssen manuell durchgeführt werden.

8. Benötige ich noch einen weiteren AdBlocker?

Pi-hole blockiert Werbung und Tracker auf DNS-Ebene. Insbesondere Geräte, auf denen sich bspw. kein AdBlocker installieren lässt, profitieren also vom Pi-hole. Auf Computern oder Geräten, auf denen AdBlocker wie uBlock Origin im Browser installiert werden können, sollte dies dennoch weiterhin geschehen. Denn diese verfügen über zusätzliche Filtermechanismen und Logik. Im Idealfall blockieren die Browser-Add-ons also all jene Gemeinheiten, die der Pi-hole auf DNS-Ebene nicht erkennt. Der Pi-hole ist eure erste Verteidigungslinie – ein Browser-Add-on wie uBlock Origin »eliminiert« dann den Rest.

9. Fazit

In diesem Artikel wurde gezeigt, wie man ein Pi-hole in das (Heim-)Netzwerk einer Fritz!Box integriert. Alle DNS-Anfragen werden TLS-verschlüsselt (DoT) an Upstream-DNS-Server gesendet, die in der Fritz!Box hinterlegt sind. Somit agiert Pi-hole nur im lokalen Netzwerk und filtert zuverlässig Werbung/Tracker heraus.

Im nächsten Teil der Artikelserie wird Pi-hole in Kombination mit unbound konfiguriert, um die Abhängigkeit zu den DNS-Servern bzw. Providern aufzulösen. Alle DNS-Anfragen werden dann direkt an die Root-Server des Internets gestellt. Einsteigern empfehle ich jedoch, das vorliegende Setup umzusetzen.

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

Ich freue mich auf Deine Beteiligung zum Artikel

HilfeWenn du Ergänzungen oder konkrete Fragen zum Beitrag hast, besuche das offizielle Forum. Dort kann der Beitrag diskutiert werden. Oder besuche den Chat, um dein Anliegen zu besprechen. zur Diskussion ➡

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.