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