PiHole mit Docker

PiHole mit Docker

Werbung hat mich schon immer gestört. Deshalb habe ich bereits früher mal ein PiHole auf einem Raspery Pi aufgesetzt. Damals ist mir aber Ziemlich schnell verleidet weil plötzlich viele dinge nicht mehr funktioniert haben. Zum Beispiel der Google Play Store, wahrscheinlich war damals der Fehler, dass ich eine Block Liste hinzugefügt habe, welche Einträge enthalten hat, die ich gebraucht hätte. Damals habe ich PiHole direkt auf dem Raspberry Pi. Mein Ziel ist es PiHole auf Docker zum laufen zu bringen, da ich das Thema Docker spannend fand und ich allgemein mein wissen im bereich Linux ein bisschen verbessern will.

Inhaltsverzeichnis

Inhaltsverzeichnis 2

Vorbereitung 3

Netzwerk 3

Docker Speicherort ändern 4

Festplatte hinzufĂĽgen 4

Docker ordner verschieben 6

PiHole Container erstellen 7

Docker-Compose installieren 8

Docker-Compose File erstellen 9

PiHole konfigurieren 10

Domains Blockieren 10

Entblocken 12

Probleme 13

IP Adresse 13

Passwort Webgui 13

DNS Port 53 14

Fazit 15

Quellen 16

Vorbereitung

Bevor ich Anfangen mit dem eigentlichen Projekt anfangen konnte musst ich noch einige Dinge vorbereiten. Ich habe dazu das Betriebssystem Ubuntu verwendet.

Netzwerk

Um eine statische IP zu bekommen, muss das File “01-network-manager-all.yaml” bearbeitet werden..

Es ist gut möglich, dass File nicht genau gleich heisst, doch es sollte in diesem Verzeichnis sein.

nano /etc/netplan/01-network-manager-all.yaml

Mein konfiguriertes File

# Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager ethernets: ens160: dhcp4: no addresses: - 172.20.0.33/24 gateway4: 172.20.0.1 nameservers: addresses: [8.8.8.8]

Docker Speicherort ändern

Dieses Kapitel kann übersprungen werden wenn man alles beim Standard belassen möchte.

Ich habe hier noch eine Zusätzliche Festplatte hinzugefügt und die gesamten Daten von Docker auf diese Festplatte verschoben.

Festplatte hinzufĂĽgen

Ich wollte alle Dateien von Docker auf einer anderen Festplatte Speichern. Deshalb musste ich noch eine zweite Physische Festplatte hinzufĂĽgen und diese partitionieren.

Zuerst muss man schauen wie die neue Disk ĂĽberhaupt heisst.

lshw -C disk

Die Ausgabe sieht bei mir folgendermassen aus. Die wichtigste Angabe ist “Logischer Name”. Ich finde bei diesem Command noch nützlich, dass gerade noch weitere Infos angezeigt werden wie Hersteller und Grösse. Damit kann man die richtige Disk leicht identifizieren.

*-disk:1 Beschreibung: SCSI Disk Produkt: Virtual disk Hersteller: VMware Physische ID: 0.1.0 Bus-Informationen: scsi@32:0.1.0 Logischer Name: /dev/sdb Version: 2.0 Größe: 50GiB (53GB) Fähigkeiten: 7200rpm partitioned partitioned:dos Konfiguration: ansiversion=6 logicalsectorsize=512 sectorsize=512 signature=7724235b

Typischerweise wenn man dies die zweite Festplatte ist hat sie den Namen “sdb”

Typischerweise ist die erste Festplatte die man Hinzufügt “sda” und die zweite “sdb.”

Ich verwende hier die Disk “sdb”, wenn die bei euch eine andere Bezeichnung trägt müsst ihr diese anpassen.

Anders wie bei Windows weisst man den Laufwerken keinen Laufwerksbuchstaben zu sondern mountet sie in einen Ordner. DafĂĽr muss man einen Ordner erstellen, ich habe meinen "data" genannt.

mkdir /media/data

Als nächstes muss man die Disk Partitionieren mit dem Befehl fdisk. Als nächstes hat man verschiedene Möglichkeiten, da ich eine neue Partition erstellen will wähle ich die Option -n. Die weiteren Optionen habe ich alle auf Standard belassen. Was noch wichtig zu beachten sein könnte, ist die Option ob man eine Primary oder Extended Partition erstellen will, denn Primary kann man nur 4 erstellen. Am schluss muss man noch “w” eingeben und Bestätigen zum die Konfiguration zu speichern und beenden.

fdisk /dev/sdb

Als nächstes müssen wir eine Partition anlegen und ein Filesystem definieren. Ich habe meine Partition wie standartmässig “sdb1” bennent und habe mich für das Filesystem ext4 entschieden. Da dies das gängigste ist und ich keine spezielle Features verwenden werde.

mkfs.ext4 /dev/sdb1

Bei diesem Schritt Mounten wird die erstellte Partition in den zuvor erstellten Ordner.

mount /dev/sdb1 /media/data

Damit die Disk auch nach einem Neustart direkt gemountet wird muss ein Eintrag im File /etc/fstab gemacht werden. Die letzten Zwei Zahlen stehen fĂĽr dump, wenn man Backups ĂĽber dump macht kann man gleich hier sagen, dass Sicherungen von dieser Partition gemacht werden. Der Standardwert ist 0 kein Backup. Die Zweite Zahl steht fĂĽr pass, hier kann man definieren in welcher Reihenfolge die Partitionen nach dem Start ĂĽberprĂĽft werden sollen. 1 kann fĂĽr die Bootpartition verwendet werden, diese wird zuerst ĂĽberprĂĽft alle anderen kann man auf 2 fĂĽr weniger priorisiert und 0 fĂĽr gar nicht.

Docker ordner verschieben

Mein Ziel war es ja die Installation von Docker und alle dazugehörigen Files auf einer zweiten Festplatte zu speichern.

Um die Verschiebung zu vereinfachen, löschen wir zuerst alle Container und danach alle Volumes.

Wenn noch keine Container installiert wurden ist dieser Schritt nicht notwendig.

docker rm -f $(docker ps -a -q) docker volume rm $(docker volume ls -q)

Den Docker Dienst stoppen.

service docker stop

Bevor wir nun die Dateien machen wir noch ein Backup falls etwas schief geht.

Der erste Pfad ist die Quelle und der zweite das Ziel.

tar -zcC /var/lib docker > /media/data1hdd/backup

Dieser Befehl verschiebt nun den ganzen Inhalt an den neuen Ort.

mv /var/lib/docker /media/data1hdd/docker

Jetzt muss noch eine Art verknĂĽpfung erstellt werden.

ln -s /media/data1hdd/docker /var/lib/docker

Nun kann der Docker service wieder gestartet werden.

service docker start

PiHole Container erstellen

Ich habe hier auf einer Vorlage[1] aufgebaut. Dabei erstellt man ein Docker-Compose File und kann dort verschiedene Parameter angeben. Der Vorteil liegt darin, dass man alles bequem in einem Editor seiner wahl bearbeiten kann und nicht einen langen Command im Terminal ausführen muss. Das Docker-Compose File muss man in der markup language“YAML” schreiben, dabei ist wichtig zu beachten die richtige Anzahl von Leerzeichen zu verwenden. An meinem Beispiel unten kann man erkennen, dass vor “services” kein Leerzeichen ist, vor “pihole” zwei und vor “container_name” drei. Diese Struktur muss man strikte einhalten.

version: "3"

# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/ services: pihole: container_name: pihole image: pihole/pihole:latest ports: - "53:53/tcp" - "53:53/udp" - "67:67/udp" - "2000:80/tcp" environment: TZ: 'Europe/Berlin' WEBPASSWORD: 'passwd' # Volumes store your data between container upgrades volumes: - '/media/data1hdd/docker/pihole/pihole/:/etc/pihole/' - '/media/data1hdd/docker/pihole/etc-dnsmasq.d/:/etc/dnsmasq.d/' # Recommended but not required (DHCP needs NET_ADMIN) # https://github.com/pi-hole/docker-pi-hole#note-on-capabilities cap_add: - NET_ADMIN restart: unless-stopped

Docker-Compose installieren

Um Docker-Compose zu installieren verwenden wir “curl”. Dies ist standartmässig auch noch nicht installiert.

Um zu überprüfen ob curl bereits installiert ist kann man den Befehl “curl” im Terminal eintippen. Wenn als Rückgabe etwas wie “curl: try 'curl --help' or 'curl --manual' for more information” ist es bereits installiert und dieser Schritt kann übersprungen werden.

apt install curl

als nächstes können wir Docker-Compose mit curl herunterladen.

curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Danach muss man noch das Attribut zum ausfĂĽhren hinzufĂĽgen.

chmod +x /usr/local/bin/docker-compose

Docker-Compose File erstellen

Als nächstes können wir bereits das Docker-Compose File anlegen. Das File muss “docker-compose.yaml” heissen. Deshalb ist der vorherige Schritt wichtig, denn es ist nicht möglich in einem Ordner zwei gleiche Dateien zu erstellen. Man könnte auch das File an einem anderen Ort erstellen. wenn man dies macht ist es aber wichtig, dass man im Docker-Compose File bei Pfad angaben nicht “./” dies bedeutet es wird als source das aktuelle verzeichnis wo man gerade ist ausgegangen wird.

nano /media/data/docker/pihole/docker-compose.yaml

Hier kann man jetzt das gewĂĽnschte Konfiguration Vornehmen. Eine Vorlage ist am Anfang von diesem Kapitel.

Um das File zu Speichern muss man “ctrl”+”o” drücken und zum schliessen danach noch “ctrl+”x”.

Bevor man jetzt aber den Container startet sollte man noch deaktivieren, dass der Host auf Port 53 hört. Siehe Kapitel DNS Port 53

Nun muss man in das verzeichnis navigieren wo man das Docker-Compose File erstellt hat.

Dort kann man den untenstehenden Befehl ausfĂĽhren und der Container sollte starten.

docker-compose up -d

Nun kann man kontrollieren ob der Container schon gestartet ist.

docker container ls

PiHole konfigurieren

Nun kann man den Browser öffnen und die Adresse 127.0.0.1:2000 eingeben. Damit sollte man jetzt auf den PiHole kommen. Damit man wirklich Einstellungen vornehmen kann, muss man auf den Tab login klicken. Das Passwort welches ich bei meinen Docker-Compose File definiert habe ist:passwd. Doch Falls dies nicht funktioniert bei Kapitel Passwort Webgui nachschauen.

Domains Blockieren

Jetzt haben wir einen funktionierenden DNS Server es sind jedoch noch keine Domains auf der Blockliste.

Jetzt gibt es zwei verschiedene Vorgehensweisen. Bei der ersten Blockiert man Anfang nichts und schaut, dann auf welchen Webseiten es Werbung hat und probiert mithilfe des logs des PiHole die Domains die Werbung schalten zu blockieren. Bei der zweiten Blockiert man mit Blocklist gerade am Anfang schon relativ viele Domains muss aber eventuell wieder ein paar entblocken, da vielleicht gewisse Dienste oder Webseiten nicht mehr richtig funktionieren.

Ich habe mich für die zweite Vorgehensweise entschieden und gleich von Anfang an ziemlich viele Domains blockiert. Dazu habe ich die Webseite firebog.net verwendet. Hier sind die Blocklists in Kategorie eingeteilt, vor jeder Blocklist ist ein Symbol. Der Hacken bedeutet diese Blocklist stören kaum beim normalen gebrauch. Ein Kreuz bedeutet es sind viele falsche Domains enthalten beziehungsweise Domains die gar keine Werbung schalten. Es wird abgeraten diese zu verwenden.

Unter Adlists kann man jetzt die einzelnen Blocklisten einfĂĽgen.

Wenn man alle gewĂĽnschten Blocklists hinzugefĂĽgt hat muss man im Terminal vom Host folgen Befehl ausfĂĽhren.

docker exec -it pihole pihole -g

Entblocken

Falls jetzt gewisse Webseiten nicht mehr richtig funktioniert kann man unter Query Log nachschauen welche Domains von welchen client aufgerufen worden sind und diese mit dem Button Whitelist wieder entblocken.

DNS Upstream

Für Domains die der PiHole nicht kennt fragt er Standardmässig den Google DNS Server möchte man dies ändern kann man dies unter Setting im Tab DNS. Viele schwören auf den 1.1.1.1 von Cloudflare diser kann zum beispiel auch ausgewählt werden.

Probleme

IP Adresse

Zuerst habe ich die IP-Adresse der Ubuntu Maschine mit dem Befehl ifconfig konfiguriert.

Dies hat folgendermassen ausgesehen.

ifconfig ens160 172.20.0.30 netmask 255.255.255.0

Das problem dabei war, dass nach einem Reboot keine IP Adresse mehr vorhanden war. Die Lösung dafür war das File “01-network-manager-all.yaml” zu öffnen und dort die Statische IP Adresse zu setzen.

Es ist gut möglich, dass File nicht genau gleich heisst, doch es sollte in diesem Verzeichnis sein.

nano /etc/netplan/01-network-manager-all.yaml

Konfiguration dieses File

# Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager ethernets: ens160: dhcp4: no addresses: - 172.20.0.33/24 gateway4: 172.20.0.1 nameservers: addresses: [8.8.8.8]

Passwort Webgui

Ich hatte das Problem, dass das Passwort welches ich im Docker-Compose File definiert habe nicht funktioniert hat. Um das Passwort zurĂĽckzusetzen muss man mit Exec in den Container hinein und den Befehl zum Passwort zurĂĽcksetzen senden.

Wenn ihr den Container anders benannt habt müsst ihr das erste pihole durch, den durch euch gesetzen Container Namen ändern.

docker exec -it pihole pihole -a -p

DNS Port 53

Der Host selber hört Standardmäßig auf dem Port 53 ob etwas hineinkommt[2]. Dieser Service muss abegestellt werden, denn nun muss auf der Adresse des Hosts PiHole hören auf Port 53.

nano /etc/systemd/resolved.conf

Dort muss bei der Letzter Linie der Wert auf “no” gesetzt werden.

Damit man jetzt aber dennoch DNS auflösungen machen kann muss bei folgendem File noch die IP Adresse für den DNS Server geändert werden. Zum beispiel auf 127.0.0.1 Damit gerade der PiHole als DNS Server für den Host funktioniert.

nano /etc/resolv.conf

Fazit

Ich habe dies auf einer Virtuellen Maschine mit Ubuntu gemacht doch dies könnte man auch auf einem Raspberry pi machen. Denn auch auf einem Raspberry pi könnte man Ubuntu installieren und man könnte genau gleich vorgehen.

Mein Ziel war es Linux besser zu verstehen und dies habe ich eindeutig erreicht. Doch ich denke fĂĽr mich macht es nicht wirklich sinn den PiHole zu Containerisieren. Erstens hat nicht alles funktioniert was ich machen wollte. UrsprĂĽnglich sollte der PiHole auch noch als DHCP Server funktionieren dies konnte ich aber noch nicht umsetzen, da Docker ein eigens Netz aufbaut. Man mĂĽsste ein DHCP Relay installieren welcher die DHCP anfragen vom einten Netz in das andere Transportiert. Zweitens DNS ist sehr wichtig und wenn der mal auch nur fĂĽr ein paar Minuten nicht funktioniert ist weniger gut. Ich will mit meinem Docker Host aber auch noch andere Container nutzen und vielleicht mal etwas ausprobieren. So bin ich auf den Schluss gekommen, dass ich einen Raspberry pi alleine fĂĽr PiHole verwende. Dies ist in meinen augen ausfallsicher als ein Docker Host wo man mit verschiedene Dinge ausprobiert. Zudem hat man den Vorteil, dass man ohne grossen aufwand den PiHole auch noch als DHCP Server verwenden kann.

Quellen

Da ich noch ein ziemlicher neuling im Bereich Linux musste ich sehr viel nachschauen. Daher nenne ich hier noch die Quellen welche ich am meisten verwendet habe.

  1. https://hub.docker.com/r/pihole/pihole ↑

  2. https://www.freedesktop.org/software/systemd/man/resolved.conf.html ↑

Last updated

Was this helpful?