UDM Pro 3: pihole im Container installieren - Teil 2
Damit die hier beschriebene Pi-hole Installation gelingt, muss vorher ein entsprechender nspawn-Container eingerichtet werden. Eine Anleitung dafür findet sich im ersten Teil dieser Serie.
Ist man per SSH mit der UDM Pro verbunden, wird zunächst eine Shell im Container geöffnet:
machinectl shell pihole
01| Pi-hole installieren
Die Installation im Container unterscheidet sich kaum von einer normalen Pi-hole Installation allerdings muss ab und zu die Umgebungsvariable PIHOLE_SKIP_OS_CHECK=true
genutzt werden, damit Pi-hole in der im Container genutzten Debian-Version installiert werden kann. Der automatische Pi-hole installer wird also folgendermaßen gestartet:
apt -y install curl
curl -sSL https://install.pi-hole.net | PIHOLE_SKIP_OS_CHECK=true bash
Bei der Installation werden einige Fragen gestellt, die normalerweise wie folgt beantwortet werden sollten:
- Der Hinweis auf die Statische IP-Adresse kann mit
Continue
bestätigt werden. - Danach kann ein beliebiger Upstream DNS-Provider ausgewählt werden. Die Auswahl ist hier nicht entscheidend und kann später jederzeit angepasst werden.
- Um die Standard-AdBlock-Liste zu aktivieren muss im nächsten Schritt
Yes
gewählt werden. - Das Admin-Interface sollte in der Regel aktiviert werden (
Yes
). Üblicherweise kann auch der vorgeschlagene Default-Web-Serverlightttpd
genutzt werden (Yes
). - Das Logging für DNS-Anfragen (Query Logging) habe ich aktiviert. Dabei protokolliere ich zu Debug-Zwecken die Anfragen auch ungekürzt (
Show Everything
).
Bei Abschluss der Installation wird das Passwort für die Admin-Oberfläche angezeigt. Dieses sollte man sich notieren oder aber mit dem Befehl pihole -a -p
ein eigenes Passwort vergeben.
Mit dem Passwort sollte nun eine Anmeldung unter http://10.0.5.3/admin möglich sein, sofern die IP-Adressen aus Teil 1 nicht angepasst wurden und der Zugriff durch die UDM Pro Firewall nicht unterbunden wird.
In der Admin-Oberfläche muss noch die Option Permit all origins
unter Settigs > DNS
gesetzt werden, damit auch Anfragen aus anderen VLANs beantwortet werden:
02| Firewall-Regel
Wurde auf der UDM-Pro der VLAN-übergreifende Netzwerkverkehr eingeschränkt (z.B. mit udm-firewall), dann muss noch eine Firewall-Regel für den Zugriff auf den DNS-Port eingerichtet werden:
Außerdem sollte gleich noch eine Regel für den Zugriff auf das Admin-Interface eingerichtet werden:
Hinweis: Falls der Pi-hole auch über IPv6 erreichbar sein soll, müssen natürlich auch entsprechende Regeln auch für LAN v6 eingerichtet werden.
Wenn alles funktioniert, so sollte mit dem Kommando dig @10.0.5.3 google.com
von einem Client im Netzwerk die IP-Adresse von google.com aufgelöst werden können.
Wenn das funktioniert kann die IP-Adresse des Pihole schon über den DHCP-Server der UDM-Pro an die Clients ausgeliefert werden:
03| 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 sollten alle drei Adressen korrekt aufgelöst werden.
03.1| dnsmasq expand-hosts
Mit drei zusätzlichen Zeilen, kann Pi-hole 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
03.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.
04| TLS für Admin-Oberfläche
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/conf-available/20-pihole-ssl.conf
wird die TLS-Konfiguration angelegt:
# Load openssl
server.modules += ( "mod_openssl" )
$HTTP["host"] =~ "(^pi-hole|^pi-hole.your.local.domain)" {
# 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"] == "0.0.0.0: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.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"
}
$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.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 entsprechend der eigenen Konfiguration angepasst werden.
Die Konfiguration muss nun noch aktiviert werden:
ln -s /etc/lighttpd/conf-available/20-pihole-ssl.conf /etc/lighttpd/conf-enabled/
Nachdem der Dienst per systemctl restart lighttpd.service
neu gestartet wurde, sollte das Admin-Interface nun HTTPS-erreichbar sein.
05| Neukonfiguration
Für den Fall das Pi-hole neu konfiguriert werden muss, so kann im Container folgendes Kommando ausgeführt werden:
PIHOLE_SKIP_OS_CHECK=true pihole -up
06| Pi-hole Updates
Soll der Pi-hole aktualisiert werden, so kann im Container folgendes Kommando ausgeführt werden:
PIHOLE_SKIP_OS_CHECK=true pihole -up
Im nächsten Teil wird unbound
als Local DNS-Resolver eingerichtet.
07| Links
[01] unifios-utilities - How to Create a Custom Container on UnifiOS 3.x+
[02] unifios-utilities - How to Install Pi-Hole in Container
[03] Pi-hole
Kommentare