Pi-hole Raspberry Pi mit Docker

Pi-hole Raspberry Pi mit Docker

IoT / IT, IoT / Smart Tech, Raspberry Pi, Software
29 April 2022

  1. Docker auf dem Raspberry Pi Basics
  2. Pi-hole Raspberry Pi mit Docker

Genug von Werbung und Trackern? In diesem umfassenden Guide erklären wir dir, wie du Pi-hole auf dem Raspberry Pi mittels Docker installieren und konfigurieren kannst.

Im ersten Teil dieser Serie habe ich dir Docker und Portainer nähergebracht und genau erläutert, worum es sich bei dieser Technik handelt. Gleichzeitig habe ich dir Heimdall als erstes laufendes Projekt vorgestellt. Nun will ich dir den Vorteil von Docker zeigen, indem wir einen zweiten Container mit einem Webserver laufen lassen werden. Anders als zuvor soll der Container nun in unserem Netzwerk etwas tun und uns beim Surfen durchs Internet von Werbung befreien. Die Rede ist von Pi-hole, was ich dir in den Grundzügen auch noch erklären werde. Keine Angst, auch dieses Mal werde ich dich durch die Konfiguration vom Container führen und danach durch die Einstellung von Pi-hole.

Die Hardware für diesem Blog

Vom Prinzip kannst du jeden Raspberry Pi nehmen. Solltest du noch keinen Raspberry Pi besitzen, dann melde dich in unserem kostenlosen BerryBase Maker Club an, wo wir aktuell exklusiv für Mitglieder Boards zur Verfügung haben. Es sollte aber zumindest ein Raspberry Pi 3, besser noch ein 4er mit mindestens 4GB RAM sein.

Jetzt beim kostenlosen BerryBase Maker Club anmelden!

Die Software für diesem Blog

Damit du diesen Abschnitt vom Blogbeitrag mit durcharbeiten kannst, brauchst du Docker und Portainer auf deinem Raspberry Pi. Wie das geht, erkläre ich im ersten Teil dieser Serie, wobei du die Installation von Heimdall nicht durchführen musst. Pi-hole funktioniert auch ohne Heimdall, was ja auch der Sinn von Docker ist.

Was ist bzw. wie funktioniert Pi-hole

Bevor ich dir erkläre, wie du Pi-hole auf deinem Raspberry Pi als Docker-Container einrichtest, sollte vielleicht vorab geklärt werden, was Pi-hole genau macht. Pi-hole ist ein sogenannter Tracking- und Werbeblocker und kann auch als DHCP-Server eingesetzt werden. Wie der Name schon verrät, ist Pi-hole für unseren Kleinstcomputer, dem Raspberry Pi, entwickelt worden. Vom Prinzip kann Pi-hole über die Konsole bedient werden, aber durch eine grafische Oberfläche, die über einen Webserver bereitgestellt wird, ist die Bedienung einfacher.

Aber wie genau filtert Pi-hole nun Werbung und unterbindet Tracking? Vom Prinzip steckt hinter Pi-hole eine Datenbank, die Abfragen von unserem Computer bzw. Geräte die Pi-hole als DNS-Server verwenden, abgleicht und im Zweifelsfall unterbindet. Ich will nicht zu tief ins Detail gehen, da ich hier keinen Exkurs über Netzwerk-Technik anfangen möchte, dennoch will ich versuchen es einfach zu erklären.

Wenn du mit deinem PC einen Webadresse in die Adresszeile eintippst und Enter drückst, passiert eine ganze Menge. Zunächst wird deine Anfrage über den Router an einen DNS-Server weitergegeben. Diese Abfrage muss gestellt werden, damit im späteren die IP-Adresse der angeforderten Webadresse unserem Computer bekannt ist. Den hinter jeder Webadresse steht im Grunde nur eine eindeutige IP-Adresse zu einem Server. Ähnlich wie bei einem Telefonbuch erhalten wir vom DNS-Server eine Adresse zurück und landen von dort auf unserer gewünschten Website.

Jetzt kommt Pi-hole ins Spiel. Wenn du Pi-hole als lokalen DNS-Server einbindest, werden deine Anfragen zwischen Router und deinem Computer „abgefangen“ und analysiert. D.h. die Anfragen über eine Website laufen zunächst über den Pi-hole und wenn eine geblockte Adresse dabei ist, wird die Anfrage zu der Seite direkt blockiert. Das ist aber erst der erste Teil, den Pi-hole durchführt. Wenn eine Website in deinem Browser geladen wird, dann wird auch meist Zusatzinhalt, wie Werbebanner oder ähnliches nachgeladen. Werbung oder Tracker sind, gerade in der heutigen Zeit, die Einnahmequelle, daher übertreiben es viele Webseiten mit zugeschalteter Werbung oder Trackern. Auch hier greift Pi-hole wieder ein. Wenn sich in dem nachgeladenen Inhalt eine Adresse befindet, die eine geblockte Werbung oder einen Tracker enthält, wird diese Anfrage ebenfalls geblockt. All das passiert über die schon erwähnte Datenbank im Hintergrund.

Aber wie wird diese Datenbank zur Filterung genau befüllt?

Hier bietet verschiedene Dienstleister oder Privatpersonen sogenannte AdLists an, die eine Vielzahl von ungewollten Webadressen enthalten. Eine solche Liste kannst du dir vom GitHub-Verzeichnis von StevenBlack mal ansehen. Die hier bereitgestellte Liste umfasst über 10.000 Einträge. Eine solche AdList wird heruntergeladen und direkt danach in die Datenbank eingetragen. Je mehr Einträge also vorhanden sind, umso mehr Werbung oder Tracker werden geblockt.

So schön sich das im ersten Moment anhört, gibt es auch einen Nachteil. Durch die vielen geblockten Webadressen kann es auch passieren, dass harmlose Webseiten oder LogIn-Seiten geblockt werden. In meinem Fall hatte Pi-hole zur Folge, dass ich mich mit Autodesk Fusion 360 nicht mehr anmelden konnte oder Nvidia-Logins nicht mehr verfügbar waren. Das ist ärgerlich, aber hier gibt es mit sogenannten WhiteLists, also geduldeten Adressen, eine Möglichkeit diese wieder zu erlauben. Egal ob über eine feste Adresse oder eine sogenannte Wildcard, beides ist zur Freischaltung möglich. Eine Liste aller Anfragen und ob diese geblockt oder freigegeben sind, kann man in einem Log einsehen. Dazu werde ich dir aber im späteren Verlauf dieses Blogartikels mehr erklären.

Pi-hole als Docker-Container auf dem Raspberry Pi einrichten

Wie schon im ersten Blogbeitrag, wird über Portainer ein Docker-Container von Pi-hole erstellt. Das geschieht wieder in zwei Phasen. Als erstes wird das Image heruntergeladen und im Anschluss werden wir aus dem Docker-Image ein Docker-Container erstellen. Damit du das alles nachmachen kannst, musst du dich über die Weboberfläche von Portainer anmelden. Nutze dazu die Login-Daten, die du im ersten Teil der Blogserie extra für Portainer erzeugt hast.

Das Image von Pi-hole herunterladen

Zunächst wird das Docker-Image von Pi-hole benötigt. Dieses finden wir, wie auch schon im ersten Beitrag, bei docker hub. Wenn du in der Suche pihole einträgst, gelangst du schon im ersten Suchergebnis auf das offizielle Docker Image der Pi-hole-Macher, siehe Abbildung 1.

Pi-hole auf Dockerhub für die Installation auf dem Raspberry Pi
Abbildung 1: Sucheergebnis zu pihole bei docker hub

Da es sich, wie schon oben erwähnt, um das offizielle Image von pi-hole.net handelt, sollte auch genau das heruntergeladen werden. Dazu öffnest du die docker hub – Seite von pihole und kopierst dir aus dem Docker Pull Command den entsprechenden Pfad, siehe Abbildung 2.

Abbildung 2: Den Pfad für Pi-hole aus dem Docker Pull Command kopieren

Lass am besten die Seite gleich offen, wir werden Sie gleich noch brauchen, wenn es zu der Konfiguration des Pi-hole Docker Container auf dem Raspberry Pi kommt. Zunächst loggst du dich bei Portainer ein und Wechsel zu Menü Images, siehe Abbildung 3.

Pi-hole Image in Portainer auf dem Raspberry Pi pullen
Abbildung 3: Image von Pi-hole in der neusten Version runterladen

Auch in diesem Fall wollen wir die neuste Version von Pi-hole haben, daher geben wir am Ende von pihole/pihole das Tag :latest an. Direkt danach laden wir das Image über den Button Pull the image herunter. Das Image ist knapp 250MB groß, daher kann es je nach Internetleitung einen Moment dauern, am Ende sollte aber das Image mit dem Flag Unused in der Imageliste erscheinen, siehe Abbildung 4.

Abbildung 4: Das Docker-Image von Pi-hole in der Image-Liste

Das Image ist damit schon einmal auf unserem Raspberry Pi verfügbar und es kann ein Docker-Container daraus erzeugt werden.

Den Pi-hole Docker Container auf dem Raspberry Pi erzeugen

Damit aus dem Docker-Image ein Docker-Container wird, musst du nun in den Menüpunkt Containers und drücken auf den Button Add container, siehe Abbildung 5.

Docker Portainer Container auf dem Raspbery Pi erzeugen
Abbildung 5: Den Pi-hole-Container erstellen

Damit du später den Docker-Container auf dem Raspberry Pi wiederfindest, braucht dieser erst einmal einen eindeutigen Namen und das Image muss angegeben werden. Dies passiert, wie du schon sicher weißt, am Anfang der Konfiguration, siehe Abbildung 6.

Abbildung 6: Container einem Namen geben und Image auswählen

Bevor es nun weitergeht, sollten wir einen Blick in die Dokumentation werfen. Hier erhalten wird interessante Informationen über den Container, wie z.B. die Ports oder die Environments. Ersteres ist dabei für unseren Tracker- und Werbungsfilter vom besonderen Interesse, da wir einen alternativen DNS-Server dafür verwenden, siehe Abbildung 7.

Abbildung 7: Information zum Pi-hole-Container

Der Grund dafür ist, dass die Ports für DNS und dem Bootstrap Protocol standardisiert sind und auch welche Art von Protokoll. In den meisten Fällen kommt das sogenannte Transmission Control Protocol, kurz TCP, zum Einsatz. In manchen Fällen aber auch das User Datagram Protocol, kurz UDP. Die Unterschiede möchte ich hier nicht erläutern, wichtig ist an dieser Stelle erst einmal, dass die Ports für unseren alternativen DNS-Server korrekt gesetzt werden, dies sind die Ports 53 und 67. Beim Port 80 handelt es sich um den Standardport vom Webserver, bei Pi-hole kommt der lighttp zum Einsatz, der die grafische Oberfläche von Pi-hole bereitstellt. Also erzeugst du erst einmal neue Netzwerkports und stellst diese korrekt ein, siehe Abbildung 8.

Abbildung 8: Netzwerkports für Pi-hole

Achte darauf, dass du TCP und UDP korrekt hinter den Ports einstellst, da andernfalls Pi-hole nicht funktionieren könnte. Solltest du Heimdalll aus dem ersten Teil verwenden, so musst du dir einen anderen Port für den Webserver aussuchen. Typisch ist, dass man Port 8080 als http-Alternative verwendet. Es geht in der Theorie aber jeder andere Port, der nicht schon vom Host belegt ist.

Im nächsten Schritt stellst du zunächst im Tab Command and logging bei Console den Wert auf Interactive && TTY.

Abbildung 9: Interactive Konsole & TTY nutzen

Warum, werde ich dir im Bezug auf das Updaten der Filterdatenbank näher erklären. Daher an dieser Stelle erst einmal nur setzen. Nun soll dem Container ein Volumen bzw. ein Bind zugeordnet werden, auch hier hilft die Doku der Docker Hub – Seite. In meinem Fall nutze ich die Bind-Methode, siehe Abbildung 10, damit man später relativ einfach auf die Daten vom Container zugreifen kann.

Abbildung 10: Bind für den Pi-hole-Container

Mit den Environments legst du zum einen die Zeitzone fest und kannst auch ein von dir gewünschtes Webadmin-Passwort definieren, siehe Abbildung 11. Beides musst du im Tab ENV vornehmen.

Abbildung 11: Einstellung der Enviroment

Die Zeitzone, als Name TZ, braucht als Variablenwert Europe/Berlin. Vergibst du der Variable WEBPASSWORD kein Value oder legst diese nicht an, wird ein zufälliges Passwort generiert. Im Tab Restart policy setzt du die Neustart-Regelung auf Always, siehe Abbildung 12.

Abbildung 12: Die Neustart-Regelung setzen

Bevor du nun den Pi-hole Docker Container auf dem Raspberry Pi ausführst, muss das Kernel-Modul NET_ADMIN unter dem Tab Capabilities aktiviert werden, siehe Abbildung 13.

Abbildung 13: Das Modul NET_ADMIN aktivieren und Container starten

Hast du bis hier hin alles genau befolgt, sollte der Container von Pi-hole nun ohne Fehlermeldung gestartet worden sein und nach einer kurzen Zeit in deiner Containers-Liste mit dem Status running oder sogar schon healthy zu finden sein, siehe Abbildung 14.

Abbildung 14: Pi-hole-Container gestartet

Abbildung 14: Pi-hole-Container gestartet

Healthy ist ein Status bei Docker, was durch ein internes Skript geprüft wird. Genauere Infos dazu findest du bei Docker direkt in der Manual-Seite.

Pi-hole administrieren und benutzen

Der Docker-Container ist gestartet und Pi-hole ist nun einsatzbereit. Jetzt muss Pi-hole noch angepasst werden und am Ende sollte der Pi-hole auch zwischen PC und Router als alternativer DNS-Server eingebunden werden.

Gestatten Pi-hole

Eine komplette Übersicht von Pi-hole kann ich in diesem Blog nicht geben, jedoch ist die Hilfe-Seite von Pi-hole dir einmal näher ansehen. Ich zeige dir hier, wie du weitere AdLists einträgst, Whitelists erzeugst und was es noch für interessante Einstellungen gibt. Zunächst musst du aber erst einmal die Weboberfläche von Pi-hole über deinen Browser aufrufen. Wenn du bis hierhin den Blog genau befolgt hast, ist die Adresse IP-Deines-Pi:8080/webadmin. Gibst du nur die IP mit dem Port an, landest du auf einer Seite, die dich automatisch zur Webadmin-Seite von Pi-hole weiterleitet, siehe Abbildung 15.

Pi-hole Web Interface
Abbildung 15: Weiterleitung zu Pi-hole Webadmin-Oberfläche

Dort angekommen, siehst du schon im nicht eingeloggten Zustand wichtige Informationen. Das Dashboard ist für die Statistik der perfekte Ort, siehe Abbildung 16.

Abbildung 16: Dashboard von Pi-hole

Neue Blacklists in Pi-hole auf dem Raspberry Pi hinzufügen

Aktuell wirst du nicht viel sehen, da der Pi-hole nicht zum Filtern verwendet wird. Interessant ist aber, dass Pi-hole schon über 100.000 Domains in der Blocklist hat. Das wollen wir nun etwas erweitern, wofür du über die Login-Seite dich mit deinem Passwort einloggst. Wechsel danach in der linken Menüleiste zu Group Management -> AddLists, siehe Abbildung 17.

Abbildung 17: Zu AdLists wechseln

Jetzt trägst du in dem Feld Address eine gültige Adresse ein. In unserem Fall ist das zu Demozwecken die Adresse https://easylist.to/easylist/easylist.txt und bestätigen mit Add, siehe Abbildung 18.

Abbildung 18: Eine Adresse hinzufügen

Damit ist zwar die Liste nun eingetragen, die Informationen in der Liste sind aber noch nicht in unserer Datenbank hinterlegt. Daher folgt nun der Schritt, dass Pi-hole sich aus den angegebenen Adressen die Informationen zieht. Dabei bietet Pi-hole zwei Varianten an:

  1. Über ein Untermenü in der Weboberfläche
  2. Mittels einem Terminal-Command

An dieser Stelle, auch weil ich in der Vergangenheit ein paar Mal Probleme hatte, nutze ich lieber das Terminal-Command. Der zweite Grund ist, dass du nun auch erfährst, warum in den Container-Einstellungen in Portainer immer bei den Command & logging -Einstellungen, die Console auf Interactive & TTY steht, siehe dazu Abbildung 9. Du wechselst nun wieder zu Portainer in den Reiter Containers und wählst das Symbol Exec Console, Abbildung 19.

Pi-hole Container konfigurieren
Abbildung 19: Die Konsole des Pi-hole-Containers via Portainer öffnen

Im darauffolgenden Menü kannst du alle Einstellungen so belassen und direkt auf Connect drücken, siehe Abbildung 20.

Pi-hole auf dem Raspberry Pi mit Docker
Abbildung 20: Mit Pi-hole-Konsole verbinden

Jetzt bist du in der Konsole vom Pi-hole-Container mit dem Account root, siehe Abbildung 21.

root check Rasperry Pi Docker Pi-hole
Abbildung 21: Als Benutzer root auf der Pi-hole-Konsle angemeldet

Nun soll der Befehl für das Herunterladen und Aktualisieren der Blacklists erfolgen. Dazu nutzt du das Command aus Code 1.

pihole -g

Code 1: Pi-hole Blacklist aktualisieren

Je nach Anzahl von Adressen, kann der Vorgang ein bisschen dauern, da hier aber nur eine weitere Liste hinzugekommen ist, wirst du schnell eine Erfolgsmeldung sehen, siehe Abbildung 22.

Portainer Console auf dem Raspberry Pi
Abbildung 22: Blacklists aktualisiert

Eine Liste macht noch nicht viel aus, daher soll nun noch ein bisschen erweitert werden. Hilfe zu nützlichen URLs mit Blacklists finden wir bei firebog.net. Keine Angst, du musst nun nicht jede einzelne Adresse eingeben, hier hat Pi-hole eine nette Funktion eingebaut. Mehrere URLs können Leerzeichengetrennt in die Address-Zeile eingetragen werden. Du kopierst also von firebog.net ein paar URLs und fügst diese dann in die Adresszeile ein, siehe Abbildung 23.

Abbildung 23: Mehere Listen hinzufügen

Wieder zu Portainer in der Konsole, führst du das Command aus Code 1 aus. Das wird diesmal ein bisschen länger dauern, da knapp 60.000 neue Einträge hinzukommen. So kannst du bequem die Liste erweitern. Je nachdem wie viele URLs du einträgst, können bis zu 1 Millionen Einträge hinzukommen.

Den Pi-hole nun auf einem Arbeitsrechner einbinden

Aktuell wird der Pi-hole unerwünschten Traffic noch nicht blocken, da Pi-hole in Netzwerk noch gar nicht verwendet wird. Das Stichwort für euer Betriebssystem heißt hier Bevorzugter DNS-Server, der je nach Betriebssystem an einer anderen Stelle eingetragen werden muss. Im Fall von Windows geht man in die Netzwerkeinstellungen und wählt den passenden Netzwerkadapter aus. Mit einem Doppelklick auf Internetprotokoll, Version 4 (TCP/IPv4) kannst du im nachfolgenden die IP-Adresse von deinem Pi-hole eintragen, siehe Abbildung 24.

Abbildung 24: Bevorzugte IP für DNS-Server eintragen

Es gibt aber auch die Möglichkeit, direkt Pi-hole auf dem Router laufen zu lassen. Diese Art möchte ich dir aber hier nicht vorstellen, kann aber einfach im Internet nachgelesen werden. Auch behandle ich nur den alten Standard TCP/IPv4 und nicht das immer mehr kommende TCP/IPv6.

Zusammenfassung

Ich habe dir mit diesem Blogbeitrag den DNS-Filter Pi-hole vorgestellt und wie dieser als Docker-Container mit Portainer eingerichtet wird. Auch habe ich dir gezeigt, wie du mittels Portainer auf die Konsole deiner Container zugreifen kannst. Pi-hole ist aber so viel mehr, als das was ich in diesem Beitrag zeigen konnte! Mit Whitelists, Wildcards und diversen Einstellungen, kann Pi-hole noch deutlich mehr! Wenn dir also Pi-hole gefällt oder du dein Wissen vertiefen willst, dann kann ich dir das Forum von Pi-hole nur empfehlen. Hier findest du eine große Wissensdatenbank, viele helfende Leute und auch Anleitungen und Ankündigungen rund um den Pi-hole.

Gerade im Bezug auf das Thema Sicherheit, kann ich die Integration von Pi-hole ins Netzwerk nur empfehlen.

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten!

Durchschnittliche Bewertung 4.2 / 5. Anzahl Bewertungen: 6

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

Über Jörn Weise

Freier Blogger, Dipl.-Ing. (FH) Mechatronik und Hobbymaker seit 10 Jahren

Kommentare

Hinterlasse ein Kommentar

XHTML: Sie können diese Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>