Filterbeere
Schadcode und Werbung mit Raspberry Pi und Pi-hole filtern
Manche Dinge möchte man von vornherein aus dem Internetverkehr fernhalten: etwa Kryptogeld-Sauger, Phishing-Seiten, Tracking-Code und aggressive Werbeanzeigen. Pi-hole filtert so was gleich fürs ganze (W)LAN heraus. Es lässt sich leicht installieren und bequem per Browser konfigurieren.
Pi-hole funktioniert wie ein schwarzes Loch im Netzwerk, das schädliche und nervige Inhalte verschluckt – daher der Name. Die technische Grundlage ist schnell erklärt: Pi-hole sitzt als DNS-Proxy zwischen den Clients im LAN und dem DNS-Server des Providers. Anhand von Filterlisten entscheidet der Proxy, welche DNS-Anfragen er an den DNS-Server weiterleitet und welche er blockiert. Fragt etwa ein Client nach der IP-Adresse von heise.de, leitet der Proxy die Anfrage durch und sendet die darauffolgende Antwort mit den IP-Adressen 193.99.144.80 (IPv4) sowie 2a02:2e0:3fe:1001:302:: (IPv6) anschließend an den Client zurück.
Möchte der Client jedoch die IP-Adresse zu einer Domain erfahren, die auf einer schwarzen Liste steht, beantwortet der Proxy die Anfrage mit seiner eigenen IP-Adresse. Versucht der Client daraufhin, eine HTTP-Verbindung dorthin aufzubauen, liefert Pi-hole eine Website mit dem Hinweis zurück, dass der Zugriff blockiert wurde. Der DNS-Proxy filtert Verbindungen auf diese Weise effektiv, ohne dass der gesamte Datenverkehr umgeleitet werden muss – eine Beeinträchtigung der Performance ist nicht spürbar. Pi-hole kümmert sich auf Wunsch zentral um alle Clients im lokalen Netz; von PCs über Smartphones bis hin zu Smart-TVs und IoT-Geräten. Eine Software-Installation auf den Clients ist dafür nicht nötig.
Das Pi-hole-Projekt erfindet das Rad nicht neu, sondern setzt auf verbreitete Open-Source-Tools wie den DNS-Server dnsmasq und den Webserver lighttpd. Zum Filtern nutzt es etablierte Blacklists, auf denen insgesamt über 100.000 Domains stehen – zumeist von Werbefirmen.
Die Installation und Konfiguration von Pi-hole übernimmt ein Setup-Skript. Es bringt den DNS-Filter in wenigen Schritten an den Start und setzt keine tiefergehenden Netzwerktechnik- oder Linux-Kenntnisse voraus. Die wichtigsten Einstellungen wie die Verwaltung der Filterlisten nimmt man anschließend über ein übersichtliches Webinterface vor. Dieses liefert auch interessante Statistiken über die DNS-Anfragen der Clients. Wer tiefer in die Materie einsteigen möchte, kann das offene Do-it-yourself-System nach Gusto modifizieren. Pi-hole ähnelt in seiner Funktionsweise der in c’t 21/17 auf Seite 158 vorgestellten Konfiguration mit dem DNS-Server Unbound, ist jedoch deutlich einsteigerfreundlicher.
Bei den Anforderungen an die Hardware ist Pi-hole genügsam: Es ist für den Einsatz auf einem Raspberry Pi mit mindestens 512 MByte RAM ausgelegt, läuft aber auch auf anderen Linux-Maschinen unter Ubuntu, Debian, Fedora oder CentOS. Es reicht ein altes Raspi-Modell, das sich möglicherweise noch in irgendeiner Schublade findet. Dieser Artikel beschreibt die Einrichtung auf dem Raspi in einem Fritzbox-Netz. Wer auf Docker setzt, findet unter ct.de/y16v ein Pi-hole-Image, das etwa auch erweiterbare NAS von QNAP, Synology & Co. zum filternden DNS-Proxy macht. Wir haben allerdings arg mit der IPv6-Inbetriebnahme in solchen Szenarien gekämpft und können diese Betriebsweise deshalb nicht empfehlen.
Raspi-Schnellstart
Ein Raspberry Pi für Pi-hole ist schnell an den Start gebracht. Haben Sie bereits einen Raspi konfiguriert, können Sie direkt zum Abschnitt „Pi-hole installieren“ springen. Laden Sie zunächst die aktuelle Raspbian-Version herunter und entpacken Sie das Image. Für Pi-hole genügt das aufs Nötigste reduzierte Raspbian Stretch Lite. Schreiben Sie das Raspbian-Image anschließend auf eine mindestens vier GByte große Speicherkarte, die Sie für diesen Zweck abgestellt haben – deren ursprünglicher Inhalt geht verloren. Unter Windows kommen Sie mit dem Win32 Disk Imager schnell ans Ziel: Wählen Sie unter „Image-Datei“ das entpackte Raspbian-Image und bei „Datenträger“ den Laufwerksbuchstaben des Kartenlesers. Der Knopf „Schreiben“ kopiert das Image auf die Karte. Nach dem Schreiben finden Sie auf der Karte eine FAT32-Partition namens „boot“. Damit Sie über SSH auf den Raspi zugreifen können, legen Sie dort eine leere Datei namens „ssh“ an.
Da DNS latenzempfindlich ist, sollten Sie den Raspberry nach Möglichkeit über LAN mit Ihrem Netzwerk verbinden. Wenn es nicht anders geht – etwa, weil Sie einen Raspbi Zero W ohne LAN-Schnittstelle nutzen –, können Sie den Minirechner wie folgt ins WLAN hängen: Legen Sie auf der boot-Partition einfach eine Datei namens wpa_supplicant.conf mit dem folgenden Inhalt an:
ctrl_interface=DIR=/var/run/wpa_:
.supplicant GROUP=netdev
update_config=1
country=DE
network={
ssid="<SSID Ihres WLAN>"
psk="<WLAN-Passwort>"
key_mgmt=WPA-PSK
}
Topfen Sie nun die Speicherkarte in den Raspberry um. Nachdem Sie den Raspi mit Strom versorgt haben, fährt er hoch und ist innerhalb einer Minute im Heimnetz unter dem Hostnamen „raspberrypi“ erreichbar. Als Nächstes bauen Sie eine SSH-Verbindung mit dem Host auf, um Raspbian zu konfigurieren und Pi-hole zu installieren.
Bei Linux und macOS ist bereits ein SSH-Client an Bord, unter Windows 10 können Sie mit wenigen Klicks einen OpenSSH-Client aktivieren: Suchen Sie über das Startmenü nach „Apps & Features“, klicken Sie auf „Optionale Features verwalten/Feature hinzufügen“ und installieren Sie dort den „OpenSSH Client (Beta)“. Nach einem Neustart kennt die Eingabeaufforderung das ssh-Kommando. Der folgende Befehl baut die Verbindung zum Raspi auf: ssh pi@raspberrypi
Geben Sie das vorkonfigurierte Passwort „raspberry“ ein und Sie sind als Standard-User pi angemeldet. Als Erstes ändern Sie das Standardpasswort mit passwd. Sparen Sie nicht beim Passwort, denn jeder, der es kennt und sich im gleichen Netz befindet, kann sich an Ihrem Raspi anmelden und ihn via sudo mit Root-Rechten beliebig manipulieren – und damit auch den Internetverkehr analysieren, umleiten und fälschen. Wählen Sie also ein möglichst langes Kennwort und notieren Sie es in Ihrem Passwort-Manager.
Danach bringen Sie Betriebssystem und Komponenten mit sudo apt-get update und sudo apt-get upgrade auf den aktuellen Stand. Das kann eine Viertelstunde dauern; danach ist der Raspi startklar.
Pi-hole installieren
Die Installation von Pi-hole geht leicht von der Hand. Die Entwickler bieten ein Installations-Skript an, das Sie mit einem Einzeiler herunterladen und anstoßen:
curl -sSL https://install.pi-hole.net :
.| bash
Das Skript kümmert sich um die Installation aller nötigen Skripte und Abhängigkeiten. Währenddessen bestätigen Sie einige Info-Fenster schlicht über die Leertaste mit „Ok“, das Skript fragt jedoch auch einige Konfigurationsparameter ab: So stellen Sie unter „Select Upstream DNS Provider“ den DNS-Server ein, den Pi-hole für die Namensauflösung nutzen soll. Nutzen Sie eine Fritzbox, geben Sie hier unter „Custom“ am besten deren IPv4-Adresse an, damit die DNS-Anfragen den gewohnten Weg nehmen, nachdem sie von Pi-hole gefiltert wurden. Die Anfragen der Clients gehen also zunächst an Pi-hole, dann an die Fritzbox und anschließend an den dort eingestellten DNS-Server. So ist sichergestellt, dass die Hostnamenauflösung im lokalen Netz weiterhin funktioniert und Sie etwa das Webinterface des Routers über fritz.box erreichen können. Möchten Sie einen anderen DNS-Dienst ausprobieren, etwa weil Sie dem DNS-Dienst Ihres Providers nicht trauen oder Sie sich einen Geschwindigkeitsvorteil erhoffen, können Sie in den Einstellungen der Fritzbox einen anderen wie Quad9 (9.9.9.9) eintragen (unter „Internet/Zugangsdaten/DNS-Server“).
Pi-hole lauscht im lokalen Netz standardmäßig über IPv4 und IPv6. Im nächsten Schritt haben Sie die Möglichkeit, eines der beiden Protokolle zu deaktivieren. In den meisten Fällen ist es ratsam, es bei der Standardeinstellung zu belassen.
Der Raspberry benötigt eine statische IP-Adresse, damit ihn die Clients dauerhaft erreichen können. Deshalb klopft das Setup-Skript anschließend eine solche fest. Es gibt die aktuell genutzte IP vor, die der Raspi via DHCP vom Router erhalten hat. Diese ist zumeist eine gute Wahl. Problematisch wird es nur, wenn der Fall eintritt, dass der Router diese IP-Adresse über DHCP einem anderen Client zuweist. Dieses Problem lösen Sie, indem Sie die IP im Router fest dem Raspi zuordnen.
Im weiteren Verlauf fragt Sie das Skript, ob es das Webinterface installieren soll. Stimmen Sie zu – es erleichtert die spätere Administration des Filters enorm. Anschließend müssen Sie entscheiden, ob Pi-hole die DNS-Anfragen der Clients loggen soll. Das Log ist eine interessante Informationsquelle, aus der man die durch die Clients angefragten Domains erfährt. Das ist insbesondere beim Verfeinern der Filterregeln eine große Hilfe. Wenn Sie das Log einschalten, müssen Sie die Zustimmung aller Mitnutzer des Netzwerks einholen.
Das Installationsskript weiß jetzt alles, was es wissen muss, und kümmert sich ums Nachladen der benötigten Komponenten sowie deren Konfiguration. Kurze Zeit später sollte das Skript die erfolgreiche Installation vermelden und alle relevanten Daten wie die IPv4- und die IPv6-Adresse, die URL des Web-Interface und das zufällig generierte Admin-Passwort anzeigen. Notieren Sie sich diese Daten oder machen Sie einen Screenshot. Ist die Installation geglückt, können Sie über http://raspberrypi/admin auf das Webinterface von Pi-hole zugreifen. Die vom Installer genannte Adresse http://pi.hole/admin funktioniert noch nicht, da die Clients noch nicht konfiguriert sind.
Clients konfigurieren
Damit die Clients ihre DNS-Anfragen fortan an Pi-hole stellen, müssen Sie dessen IP4v- und IPv6-Adresse noch als DNS-Server einstellen. Möchten Sie den Datenverkehr aller Clients filtern, dann reicht eine Einstellung im Router: Dieser teilt seinen Clients über DHCP unter anderem mit, an welche Adresse sie ihre DNS-Anfragen richten sollen. Bei der Fritzbox etwa finden Sie die entsprechende Einstellungsmöglichkeit unter „Heimnetz/Netzwerk/Netzwerkeinstellungen/IPv4-Adressen (unter IP-Adressen)/Lokaler DNS-Server“. Tragen Sie dort die IPv4-Adresse des Raspberry ein und wiederholen Sie diesen Schritt anschließend für IPv6 unter „IPv6-Adressen“.
Wollen Sie lediglich den Netzwerkverkehr einzelner Clients filtern, stellen Sie die IP-Adressen des Raspi dort einfach in den Netzwerkeinstellungen ein – unter Windows 10 etwa finden Sie die entsprechende Einstellung über eine Startmenüsuche nach „Netzwerkstatus“ und „Adapteroptionen ändern“. Klicken Sie mit rechts auf die gewünschte Netzwerkverbindung und „Eigenschaften“. Danach öffnen Sie die Eigenschaften des Eintrags „Internetprotokoll, Version 4 (TCP/IPv4)“ und tragen die Pi-hole-Adresse unter „Folgende DNS-Serveradressen verwenden/Bevorzugter DNS-Server“ ein. Das wiederholen Sie anschließend noch mit IPv6. Damit die Clients den neu eingestellten DNS-Server übernehmen, kann es notwendig sein, die Netzwerkverbindung kurzzeitig zu trennen. Dass alles korrekt eingerichtet ist, erkennen Sie daran, dass Sie das Webinterface der Pi-hole-Installation jetzt auch über die Adresse http://pi.hole/admin erreichen.
Damit der Pi zuverlässig über IPv6 im lokalen Netz ansprechbar ist, sollten Sie Ihren Router auffordern, in jedem Fall lokale v6-Adressen (Unique Local Addresses, ULA) zu vergeben. Bei der Fritzbox finden Sie diese Einstellungen unter „Heimnetz/Netzwerk/Netzwerkeinstellungen/IPv6-Adressen/Unique Local Addresses“. Aktivieren Sie hier die Option „Unique Local Addresses (ULA) immer zuweisen“.
Tour durch das Webinterface
Bei einem DNS-Server laufen interessante Daten auf, die Einblicke in die Netzwerknutzung der Clients erlauben. Pi-hole bereitet diese Daten auf seinem Webinterface anschaulich auf und präsentiert auf der Dashboard-Ansicht etwa die Gesamtzahl der bisher abgewickelten DNS-Anfragen und wie viele davon blockiert wurden. Zudem erfährt man, welche Domains am häufigsten angefragt, welche am häufigsten blockiert wurden und welche Clients am aktivsten sind. Die Ansicht aktualisiert sich selbstständig und sieht dank des responsiven Designs auch auf dem Smartphone gut aus. Das „Query Log“ liefert einen detaillierten Einblick in die letzten DNS-Anfragen. Hier erfahren Sie, welche Clients wann welche Domains angefragt haben und ob eine Anfrage blockiert („Pi-holed“) wurde. Zudem können Sie angefragte Domains per Mausklick auf die Black- oder Whitelist setzen – letzteres ist vor allem dann wichtig, wenn eine Webseite oder ein Programm nicht mehr wie gewohnt funktioniert, weil Pi-hole eine notwendige Verbindung blockiert hat.
In der Spalte „DNSSEC“ erfahren Sie, ob Pi-hole die DNS-Antwort von seiner Quelle kryptografisch verifizieren konnte (siehe ct.de/y16v). Über den Menüpunkt „Disable“ können Sie das Filtern für einen bestimmten Zeitraum abschalten – etwa, wenn Sie eine Webseite besuchen möchten, die mit aktivem Adblocker ihre Nutzung verweigert. Diese Funktion betrifft allerdings alle Clients. Nach Ablauf des eingestellten Zeitraums fährt Pi-hole die Schilde wieder hoch. Im Menü unter „Tools“ aktualisieren Sie die Blockierlisten („Update Lists“) und mit „Query adlists“ überprüfen Sie, ob und auf welchen Filterlisten eine bestimmte Domain steht. „Tail pihole.log“ gibt in Echtzeit die aktuelle Log-Datei aus. Damit können Sie dnsmasq bei der Arbeit über die Schulter schauen.
Einige grundlegende Admin-Aufgaben wie einen Neustart des Systems oder das Löschen der Logs können Sie über die „Settings“ durchführen. Im dortigen Untermenü „Block Lists“ stellen Sie ein, welche Blacklists zum Einsatz kommen sollen. Grundsätzlich ist Pi-hole zwar als Werbeblocker ausgelegt, muss aber nicht als solcher genutzt werden: Auf zwei der Listen stehen ausschließlich Domains, die in Verbindung mit Malware stehen, also entweder durch die Verbreitung von Schadsoftware aufgefallen sind oder als Teil der Infrastruktur (Command-and-Control-Server). Wer mit den vorgegebenen Listen nicht zufrieden ist, kann über das Eingabefeld unterhalb der Auflistung leicht eigene Blacklists hinzufügen. Die Nocoin-Liste (siehe ct.de/y16v) etwa deckt etliche Domains ab, die in Zusammenhang mit dem Mining von Krypto-Währungen im Browser aufgefallen sind. Wenn Online-Werbung nicht stört und Sie lediglich Browser-Mining verhindern wollen, dann können Sie die Nocoin-Liste als alleinige Filterliste einsetzen.
Weitere Tricks
Sie kennen jetzt alle grundlegenden Funktionen, um Pi-hole an den Start zu bringen und zu administrieren. Das Filtersystem hat noch mehr drauf: Im FAQ-Bereich des Projekts (siehe ct.de/y16v) finden Sie eine vollständige Dokumentation. So etwa kann man Pi-hole auch über SSH und Terminal steuern. Der Befehl pihole -c zum Beispiel startet eine textbasierte Live-Statistik namens Chronometer, die deutlich mehr Nerd-Appeal als das schmucke Webinterface hat. Mit pihole -up bringen Sie die Pi-hole-Installation auf den aktuellen Stand, der Parameter -r ruft den Konfigurations-Assistenten erneut auf, den Sie bereits von der Ersteinrichtung kennen. Letzteres hilft, wenn Pi-hole in ein anderes Netz umgezogen ist.
Unsere Erfahrungen mit Pi-hole sind weitgehend positiv: Das Filtersystem machte schon in der Standardkonfiguration einen guten Job und filterte fast alle Werbeeinblendungen zuverlässig heraus. Pi-hole blockierte 30 bis 50 Prozent aller DNS-Anfragen, ohne dass es zu sichtbaren Einschränkungen bei der Internetnutzung kam. Auch am Smartphone machte sich der Filter positiv bemerkbar, da er auch Werbung in Apps und Verbindungsversuche zu Analysefirmen wie Mixpanel blockierte.
Nur in einem Fall mussten wir Elemente einer Webseite auf die Whitelist setzen, da wir sie aufgrund einer Adblocker-Erkennung ansonsten nicht hätten nutzen können. Ob man Online-Werbung durch Pi-hole oder Browser-Erweiterungen blockieren lässt, bleibt jedoch eine Gewissensfrage: Werbung ist für Website-Betreiber eine wichtige – und oft die einzige – Einnahmequelle. (rei@ct.de)
Tools und weitere Infos:ct.de/y16v