UDM Pro 3: pihole im Container installieren - Teil 1

Mit UnifiOS Version 3.x können nspawn-Container auf der UDM Pro eingerichtet werden. Das ist ideal um auf der UDM Pro ein Pi-hole Server zu installieren, damit Werbung im internen Netzwerk keine Chance hat. Mit folgenden Schritten habe ich auf UnifiOS 3.2.7 Pi-hole im Container zum laufen bekommen (siehe auch unifios-utilities - nspawn-container):

01| nspawn installieren und Container vorbereiten

Hinweis: Auf unifi-utilities gibt es das Script interactive_setup.sh mit dem der nspawn-Container teilautomatisiert eingerichtet werden kann. Da ich aber einige kleinere Anpassungen vornehmen wollte, hab ich die Einrichtung manuell vorgenommen.

Per SSH auf der UDM Pro anmelden und folgende Kommandos ausführen:

# 1. systemd-container und debootstrap installieren
apt -y install systemd-container debootstrap

# 2. Verzeichnis für den pi-hole Container anlegen und ein Basis Debian  System installieren
mkdir -p /data/custom/machines
cd /data/custom/machines
debootstrap --include=systemd,dbus unstable pihole

# 3. Shell im Debian Container starten
systemd-nspawn -M pihole -D /data/custom/machines/pihole

Mit dem letzten Kommando wollte eine Shell im Container gestartet werden. Die Shell wird genutzt um das System grundlegend einzurichten:

# 1. root-Passwort wechseln
passwd root

# 2. systemd-network aktivieren
systemctl enable systemd-networkd

# 3. resolv.conf einrichten
echo "search local" > /etc/resolv.conf
echo "nameserver 1.1.1.1" >> /etc/resolv.conf

# 4. hostname festlegen
echo "pihole" > /etc/hostname

# 5. Shell verlassen
exit

02| Script herunterladen

Auf Basis der Anleitung unter unifios-utilities - nspawn-container habe ich auf GitHub das Projekt erstellt, um die Einrichtung der Container und die Startup-Scripte an meine Bedürfnisse anzupassen. Die Scripte können auf der UDM-Pro einfach installiert werden:

mkdir -p /data/custom
dpkg -l git || apt install git
git clone https://github.com/nerdiges/udm-nspawn.git /data/custom/nspawn
chmod +x /data/custom/nspawn/udm-nspawn.sh

03| Scripte anpassen

Jetzt muss eigentlich nur noch die Konfiguration der Scripte angepasst werden. 

03.1| Isolated MacVLAN für Container einrichten

In diesem Beispiel soll der Container im VLAN 5 der UDM Pro laufen. Dazu muss in der GUI der Unifi Network App  natürlich vorher ein  Netzwerk mit diesem VLAN eingerichtet werden. Ist das erfolgreich passiert, so sollte nun das Netzwerkinterface br5 existieren:

ifconfig | grep br5

br5: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 9216

Hinweis: Soll ein anderes VLAN verwendet werden, so müssen die folgenden Kommandos/Konfigurationsdateien entsprechend angepasst werden.

03.1.1| Gateway Bridge konfigurieren

Im UnifiOS muss nun eine Gateway-Bridge br5.mac für den Container angelegt werden:

#  Script zum Einrichten von br5.mac erstellen:
cp /data/custom/nspawn/brmac/brXmac.sh.sample /data/custom/nspawn/brmac/br5mac.sh
chmod +x /data/custom/nspawn/brmac/br5mac.sh

In der Datei br5mac.sh kann die Konfiguration wie z.B. die IPv4 und IPv6-Adressen angepasst werden. Das erfolgt über die Umgebungsvariablen, die am Anfang des Scripts definiert werden:

## CONFIGURATION VARIABLES

# VLAN ID network container will be on. This VLAN has to first be configured as a 
# network in Unifi Network settings with a unique IP/subnet. Do not use the same 
# IP in the unifi network settings as you will use below for IPV4_IP or IPV4_GW.
VLAN=5

# IP addresses of container.
IPV4_IP="10.0.5.3"
# Gateway IP address of macvlan interface. IP above should be in this subnet.
IPV4_GW="10.0.5.1/24"

# IPv6 container and gateway addresses. These can be empty if not using IPv6.
# Preferably generate your own ULA instead of using the default one below.
# A public IPv6 prefix based on your ISP's prefix can be used too, but any 
# prefix changes for dynamic IPv6 prefixes have to be modified manually. 
IPV6_IP="fd62:89a2:fda9:e23::3"
IPV6_GW="fd62:89a2:fda9:e23::1/64"

# Set this to the interface(s) on which you want DNS TCP/UDP port 53 traffic
# re-routed through this container. Separate interfaces with spaces.
# This is useful when runinng a DNS service, like Adguard Home
# e.g. "br0" or "br0 br1" etc.
FORCED_INTFC=""

## END OF CONFIGURATION

Wird das Script br5mac.sh nun probehalber ausgeführt, sollte anschließend die Bridge br5.mac verfügbar sein:

/data/custom/nspawn/brmac/br5mac.sh
ifconfig | grep br5

br5: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 9216
br5.mac: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 9216

03.1.2| Netzwerk-Einstellungen im Container konfigurieren

Die IP-Konfiguration aus der Datei br5mac.sh muss jetzt auch noch im Container hinterlegt werden:

cat << EOF > /data/custom/machines/pihole/etc/systemd/network/mv-br5.network
[Match]
Name=mv-br5

[Network]
IPForward=yes
Address=10.0.5.3/24
Gateway=10.0.5.1
Address=fd62:89a2:fda9:e23::3/64
Gateway=fd62:89a2:fda9:e23::1
EOF

04| Container einrichten

Damit der Container zukünftig korrekt startet und auch bequem administriert werden kann müssen das unifiOS noch etwas angepasst werden.

04.1| nspawn Datei erzeugen

Die Parameter für den Container werden in der Datei /etc/systemd/nspawn/pihole.nspawn wie folgt festgelegt (siehe auch systemd.nspawn man-Page):

mkdir -p /etc/systemd/nspawn
cat <<EOF > /etc/systemd/nspawn/pihole.nspawn
[Exec]
Boot=on
ResolvConf=off

[Network]
MACVLAN=br5
EOF

04.2| machinectl aktivieren

Damit auf den Container mit dem Kommandos machinectl zugegriffen werden kann muss der Container im Verzeichnis /var/lib/machines verlinkt sein:

mkdir -p /var/lib/machines
ln -s /data/custom/machines/pihole /var/lib/machines/

05| Container und Netzwerk testen

Wenn der Container korrekt konfiguriert wurde kann er nun gestartet werden:

machinectl start pihole
machinectl enable pihole

In einer Container-Shell kann nun die Netzwerkkonfiguration überprüft werden:

# 1. Container-Shell starten
machinectl shell pihole

# 2. Netzwerkkonnektivität prüfen
ip addr show
ping -c4 1.1.1.1
exit

06| Persistenz bei Firmware-Updates herstellen

Grundsätzlich sollte der Container nun fertig eingerichtet sein. Allerdings werden die Daten in den Verzeichnissen /usr und /var bei einem UnifiOS-Update  ggf. überschrieben. Dadurch gehen auch die Installierten Debian-Pakete verloren die wir für nspawn installiert haben. Außerdem gehen auch die Links in /var/lib/machines verloren. Damit der Container nach einem UnifiOS-Update weiter funktioniert, müssen diese Daten mithilfe des Systemd-services udm-nspawn.service wiederhergestellt werden:

# 1. Die benötigten Debian Pakete werden als Backup vorgehalten, damit sie auch 
#    installiert werden können, wenn keine Internet-Verbindung besteht.
cd /data/custom/nspawn/dpkg
apt download systemd-container libnss-mymachines debootstrap arch-test git

# 2. systemd Service  aktivieren
ln -s /data/custom/nspawn/udm-nspawn.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable udm-nspawn.service 

Der Container sollte nun soweit vorbereitet sein, dass im nächsten Schritt der pihole-Dienst installiert werden kann.

08| 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