Pi-Hole als DNS-Server für das LAN einrichten
Da in meinem Netzwerk nach und nach immer mehr Systeme genutzt werden, muss ein DNS-Server ins Netzwerk. Bei der Gelegenheit soll der Server gleichzeitig auch die Werbung aus dem Netzwerk filtern. Für diese Aufgabe bietet sich ein Raspberry Pi mit Pi-hole an.
01| RaspberryOS installieren
Zunächst muss auf dem Raspberry Pi ein Betriebssystem installiert werden. Hierzu gibt es zahlreiche Anleitungen (siehe z.B. [02]). Da Pi-hole einige Log-Dateien schreibt, habe ich mich dafür entschieden das Betriebssystem auf einen USB-Stick zu installieren. Da ich einen älteren Raspberry Pi 2 verwende, nutze ich den speziellen bootcode.bin-only Modus des Raspberry Pi, um das Betriebssystem vom USB-Stick zu starten. Dazu muss die SD-Karte lediglich mit FAT32 formatiert und anschließend die aktuelle Version der Datei bootcode.bin darauf gespeichert werden.
Hinweis: Die bootcode.bin-only Methode hat den Vorteil, dass sie mit jedem Raspberry Pi funktionieren sollte. Auf der anderen Seite benötigt man hierzu sowohl eine SD-Karte als auch einen USB-Stick. Mit neueren Raspberry Pi Versionen kann man sich die SD-Karte ggf. auch sparen (siehe [03]).
Das eigentliche Betriebssystem wird auf einen USB-Stick geschrieben. Am einfachsten funktioniert das mit dem Raspberry Pi Imager. Bei der Installation kann im Raspberry Pi Imager unter Betriebssystem > Raspberry Pi OS (other)
das Betriebssystem Raspberry Pi OS Lite
ausgewählt werden.
Nachdem das Betriebssystem auf den USB-Stick geschrieben wurde, Wird der Stick an den Raspberry angeschlossen und die die Bootcode-SD-Karte in den SD-Slot eingelegt. Danach sollte das Betriebssystem vom USB-gestartet werden.
Hinweis: Scheinbar kann der Raspberry Pi nicht auf alle US-Sticks gleich schnell zugreifen. Bei mir lag die Schreibgeschwindigkeit bei einigen Sticks bei lediglich 3,3 MB/s, was dazu führ dass der Raspberry sehr träge wird. Wer also mehrere USB-Sticks hat, sollte am besten durchprobieren, ob einer besonders schnell ist. Wird ein älterer Raspberry verwendet, so ist die Schreib/Lesegeschwindigkeit jedoch sowieso begrenzt,da USB 2.0 nicht mehr als ca. 30 -35 MB/s ermöglicht.
Wenn der Raspberry Pi erfolgreich von USB-Startet, kann das Betriebssystem nach belieben eingerichtet werden. Mindestens sollte jedoch das Default-Passwort des Standardbenutzers pi
abgeändert und der SSH-Zugang aktiviert werden. Außerdem sollten das Betriebssystem wie üblich initial aktualisiert werden (apt update && apt full-upgrade
). Zu guter letzt sollte bei Bedarf auch noch der Hostname angepasst werden. der gewünschte Name muss dazu lediglich in die Datei /etc/hostname
hinterlegt werden. Mit dem nächsten Reboot wird dann der neue Name gesetzt.
02| Pi-hole installieren
Die Installation von Pi-Hole ist denkbar einfach. Wer mutig ist, und dem Setup-Script blind vertraut, der muss lediglich das Kommando curl -sSL https://install.pi-hole.net | bash
eingeben und den Anweisungen im Setup-Script folgen.
Weitere Informationen zur Installation findet man auch auf der GitHub-Seite des Pi-hole-Projekts (siehe [5]).
03| Passwort für die Web-Oberfläche ändern
Bei der Installation wird ein zufälliges Passwort für den Zugriff auf die Pi-hole Oberfläche vergeben. Wer sich das Passwort nicht gemerkt hat, kann über die Kommandozeile mit dem Befehl pihole -a -p
auch noch nachträglich ändern.
04| IP Adressen nachträglich anpassen
Die IP-Adresse des Raspberry Pis wird bei der Installation von Pi-hole auf eine statische Konfiguration abgeändert. Da die Netzwerkkonfiguration in Raspberry OS über dhcpcd
verwaltet wird, wurde dazu bei der Installation von Pi-hole die Datei /etc/dhcpcd.conf
automatisch angepasst. Soll die IP-Adresse nachträglich angepasst werden oder beispielsweise eine statische IPv6 ULA-Adresse hinzugefügt werden, so kann die /etc/dhcpcd.conf
entsprechend angepasst werden
Zusätzlich sollte anschließend in der Web-Oberfläche unter Settings > System > Network Information die IP-Adressen
überprüft werden, ob hier nach der Änderung die korrekten Adressen angezeigt werden. Ist dies nicht der Fall, so kann dies in der Datei /etc/pihole/local.list
geändert werden. Zusätzlich sollte die neuen Adressen auch noch in der Datei /etc/pihole/setupVars.conf
eingetragen werden.
05| Lokale Namensauflösung einrichten
In der Standardkonfiguration können bei Pi-hole lokale DNS-Namen an zwei Stellen gepflegt werden: In der Datei /etc/hosts
und unter dem Menüpunkt Local DNS > DNS Records
. Wo die internen Domain-NAmen gepflegt werden ist dabei zunächst scheinbar egal. Es ist jedoch zu beachten, dass über die Web-Oberfläche immer nur eine IPv4- und eine IPv6-Adresse pro DNS-Name gepflegt werden:
Für die meisten Fälle sollte das reichen, aber in speziellen Situationen kann es erforderlich sein, dass für einen Server mehrere Adressen gepflegt werden müssen. In diesem Fall kann der Server dann in der /etc/hosts
eingetragen werden. Dabei können die Einträge in der /etc/hosts
und in der Web-GUI auch parallel genutzt werden. Soll also der DNS-Name egon
aus dem Screenshot nicht nur unter 192.168.178.5
erreichbar sein, so kann eine zweite Adresse (z.B. 192.168.178.6
) mit folgendem Eintrag in der /etc/hosts
verfügbar gemacht werden:
192.168.178.6 egon
Danach werden alle drei IP-Adressen korrekt aufgelöst:
05.1| dnsmasq expand-hosts
Mit drei zusätzlichen Zeilen, kann Pi-hole des weiteren so konfiguriert werden, dass neben den eigentlichen Servernamen auch Full Qualified Domain Names (FQDN) der Server auflösen kann. Sollen ein Server beispielsweise nicht nur unter egon
sondern auch unter egon.your.local.domain
erreichbar sein, so wird die Datei /etc/dnsmasq.d/40-local.conf
mit folgendem Inhalt angelegt:
# gibt an , das der DNSmasq direkt auf diese Domänen antwortet
local=/your.local.domain/
# hängt automatisch den Domänenname an den Rechnername
# Rechnernamen stehen in der hosts Datei z.B.
# 192.168.178.5 egon
# dann wird es automatisch in egon.your.local.domain umgewandelt
expand-hosts
# gibt den Domänennamen an , muss mit dem in “local” übereinstimmen
domain=your.local.domain
05.2| Domain-Search für Pi-Hole
Damit auch der Pi-hole selber auch das richtige Domänen-Suffix für die Namenssuche verwendet, werden in der Datei /etc/dhcpcd.conf
im Abschnitt interface eth0
folgende Einträge ergänzt:
static domain_name=<your domain suffix>
static domain_search=<your domain suffix1> <your domain suffix2> ...
Nach einem Reboot sollten in der Datei /etc/resolv.conf
die Einträge domain
und und search
mit entsprechende Werten auftauchen.
06| SSL für Admin-Oberfläche einrichten
Zu guter Letzt soll die Admin-Oberfläche für den Pi-Hole noch per TLS abgesichert werden. Hierzu müssen zunächst das TLS-Zertifikat samt Schlüssel, sowie die Zertifikat-Kette der ausstellenden CAs abgelegt werden. Mit mkdir /etc/lighttpd/tls
wird ein Verzeichnis für die Zertifikate erzeugt und anschließend eine Datei combined.pem
angelegt. In diese Datei wird zunächst der Schlüssel und direkt danach das zugehörige Zertifikat im PEM-Format eingefügt. Die Datei sollte also ungefähr so aussehen:
-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
Die Berechtigungen auf diese Datei sollten danach noch angepasst werden:
chown www-data:www-data /etc/lighttpd/tls/combined.pem
chmod 600 /etc/lighttpd/tls/combined.pem
In der einer zweiten Datei fullchain.pem
werden die Zertifikate der ausstellenden CAs hinterlegt. Wird eine zwischen CA genutzt, so muss die Datei sowohl das Zertifikat der Zwischen-CA als auch der Root-CA enthalten.
Mit der folgenden Konfiguration in der Datei /etc/lighttpd/external.conf
wird die TLS-Konfiguration aktiviert:
$HTTP["host"] =~ "(^pi-hole|^pi-hole.your.local.domain|^192\.168\.178\.10$|^fd00::3$)" {
# Ensure the Pi-hole Block Page knows that this is not a blocked domain
setenv.add-environment = ("fqdn" => "true")
# Enable the SSL engine with, only for this specific host
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/tls/combined.pem"
ssl.ca-file = "/etc/lighttpd/tls/fullchain.pem"
ssl.honor-cipher-order = "enable"
ssl.openssl.ssl-conf-cmd = ("Protocol" => "-ALL, TLSv1.2, TLSv1.3")
ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
# ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES128+EECDH:AES128+EDH"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.use-compression = "disable"
ssl.ec-curve = "secp384r1"
}
# Redirect HTTP to HTTPS
$HTTP["scheme"] == "http" {
$HTTP["host"] =~ ".*" {
url.redirect = (".*" => "https://%0$0")
}
}
}
Die Domain-Part your.local.domain
, sowie die IPv4 und IPv6 Adresse in der ersten Zeile müssen natürlich noch entsprechend der eigenen Konfiguration angepasst werden.
Nachdemd er Dienst per systemctl restart lighttpd.service
neu gestartet wurde, sollte das Admin-Interface per HTTPS-erreichbar sein.
07| Quellen
[01] Pi-hole® Network-wide Ad Blocking
[02] https://www.raspberrypi.org/documentation/installation/installing-images/
[03] USB mass storage boot
[04] Raspberry Pi boot modes
[05] https://github.com/pi-hole/pi-hole/#one-step-automated-install
[06] https://discourse.pi-hole.net/t/locale-namensauflosung/16212
Kommentare