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 dhcpcdverwaltet 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:

Pi-hole - Local DNS Record

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:

nslookup

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

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page