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:

  1. Der Hinweis auf die Statische IP-Adresse kann mit Continue bestätigt werden.
  2. Danach kann ein beliebiger Upstream DNS-Provider ausgewählt werden. Die Auswahl ist hier nicht entscheidend und kann später jederzeit angepasst werden.
  3. Um die Standard-AdBlock-Liste zu aktivieren muss im nächsten Schritt Yesgewählt werden.
  4. Das Admin-Interface sollte in der Regel aktiviert werden (Yes). Üblicherweise kann auch der vorgeschlagene Default-Web-Server lightttpd genutzt werden (Yes).
  5. 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:

Permit all origins

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:

Firewall-Regel für den DNS-Zugriff

Außerdem sollte gleich noch eine Regel für den Zugriff auf das Admin-Interface eingerichtet werden:

Firewall-Regel für Admin-Zugriff

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:

DHCP-Einstellungen

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:

Lokale NAmensauflösung

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

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page