UDM Pro Upgrade von 1.2.37 auf 3.2.7
Die Unifi OS Version meiner UDM Pro ist immer noch auf Version 1.2.38, obwohl mittlerweile schon zwei Major Releases veröffentlicht wurden. In diesem Artikel fasse ich meine Erfahrungen mit dem Update zusammen, vor allem, ob es mir gelungen ist meine individuellen Anpassungen (onboot-Scripte, Netzwerksegmentierung etc.) mit migrieren konnte...
01| Backup
Falls beim Upgrade etwas schief läuft sollten zunächst alle Einstellungen gesichert werden.
01.1| Backup über die GUI
Über die Web-Oberfläche der UDM Pro sollte zunächst die Unifi OS Konfiguration gesichert werden:
Danach sollten die Einstellungen der jeweiligen Anwendungen gesichert werden. Da ich nur Unifi Network und Unifi Protect nutze exportiere ich die beiden Konfigurationen.
Wenn Du auch noch andere Unifi Anwendungen nutzt, wäre jetzt ein guter Zeitpunkt diese Einstellungen ebenfalls zu speichern.
01.2| Backup der individuellen Einstellungen per SSH (optional)
Diese Schritte sind nur erforderlich, wenn die Konfiguration der UDM Pro im Verzeichnis /mnt/data
angepasst wurde (z.B. per onboot-Script).
01.1.1| Anpassungen in /mnt/data
Damit ich beim Sichern keine Anpassungen vergesse, packe ich zunächst das ganze Verzeichnis /mnt/data
in ein tar-Archiv:
cd /mnt
tar cvfz data_ext/20231219-udmpro-data-backup.tgz data
01.1.2| Backup der Firewall-Regeln
Für den Fall, dass die Firewall-Regeln verloren gehen, erstelle ich auch noch einen Dump der IPv4- und IPv6-Regeln und der zugehörigen ipsets in jeweils zwei unterschiedlichen Formaten:
# IPv4 Regeln exportieren
xtables-multi save4 > /mnt/data_ext/20231219-udmp-iptables-save.txt
iptables -L -v > /mnt/data_ext/20231219-udmp-iptables-Lv.txt
# IPv6 Regeln exportieren
xtables-multi save6 > /mnt/data_ext/20231219-udmp-ip6tables-save.txt
ip6tables -L -v > /mnt/data_ext/20231219-udmp-ip6tables-Lv.txt
# ipsets exportieren
ipset -o save list > /mnt/data_ext/20231219-udmp-ipset-save.txt
ipset list > /mnt/data_ext/20231219-udmp-ipset.txt
Die erstellten Backups müssen jetzt nur noch per SSH gezogen und sicher verwahrt werden:
scp root@<IP-der-UDMP>:/mnt/data_ext/20231219* .
02| Upgrade auf die neuste Version 3.x
Nachdem alle Einstellungen gesichert sind, kann nun der eigentliche Update-Vorgang starten. Dazu muss in der Oberfläche solange das System aktualisiert werden, bis keine Updates mehr angezeigt werden. Bei mir waren dazu mehrere Updates nötig:
- Update von 1.2.37 auf 2.0.47
- Update von 2.0.47 auf die aktuellste 2.5.17
- Update von 2.5.17 auf die Version 3.0.20
- Update von 3.0.20 auf 3.1.16
- Update von 3.1.16 auf 3.2.7
Danach habe ich noch die Version der Network App auf die aktuellste Version (8.0.26) gebracht.
03| Vorbereitung
Laut unifios-utilities werden die Daten im Verzeichnis /data
bei einem Firmware-Update nicht überschrieben. Daher wird zunächst ein Verzeichnis angelegt in dem in den folgenden Schritten die einzelnen Konfigurationsdateien gespeichert werden:
mkdir /data/custom
04| Anpassungen am Firewall Regelwerk
Ich habe die Firewall-Konfiguration meiner UDM-Pro mit Hilfe des on-boot-script der unifios-utilities angepasst. Beim Systemstart und danach alle 90 Sekunden werden folgende Anpassungen vorgenommen (siehe auch UDM Pro 3: Netzerktrennung - Teil 1):
- Einfügen von Default-Deny-Regeln für die Kommunikation zwischen den konfigurierten VLANs (in der Standardkonfiguration wird Datenverkehr zwischen den Netzwerksegementen zugelassen - Default Allow)
- Deaktivierung von NAT (in der GUI immer noch nicht möglich)
- Erlauben von Datenverkehr der zu bereits aufgebauten Verbindungen gehört (allow established/related), um die Administration von Firewall-Regeln zu vereinfachen
04.1| Installation von udm-firewall
Diese Regel-Anpassungen habe ich in udm-firewall zusammengefasst und auf GitHub bereitgestellt, dass in unifiOS einfach installiert werden kann:
mkdir -p /data/custom
dpkg -l git || apt install git
git clone https://github.com/nerdiges/udm-firewall.git /data/custom/firewall
chmod +x /data/custom/wireguard/udm-firewall.sh
04.2| Anpassung der Konfiguration
Bei Bedarf kann das Script noch angepasst werden. Dazu können die entsprechenden Konfigurationsvariablen direkt am Anfang des Scripts udm-firewall.sh
angepasst werden. Allerdings werden die Änderungen beim nächsten Update des Scripts wieder überschrieben. Muss bzw. soll die Konfiguration angepasst werden, sollten die Änderungen in der Datei /data/custom/firewall/udm-firewall.conf
gespeichert werden. Folgende Parameter können aktuell über die Umgebungsvariablen angepasst werden:
######################################################################################
#
# Configuration
#
# Add rules to separate LAN interfaces
separate_lan=true
# Add rules to separate Guest interfaces
separate_guest=true
# interfaces listed in exclude will not be separted and can still access
# the other VLANs. Multiple interfaces are to be separated by spaces.
exclude="br20"
# Add rules to avoid packet leakage from LAN to Guest
# (to create rules $separate_lan must also be true!)
fix_leakage=true
# Add rule to allow established and related network traffic coming in to LAN interface
allow_related_lan=true
# Add rule to allow established and related network traffic coming in to guest interface
allow_related_guest=true
# Remove predefined NAT rules
disable_nat=true
# List of commands that should be executed before firewall rules are adopted (e.g. setup
# wireguard interfaces, before adopting ruleset to ensure wireguard interfaces are
# considerd when separating VLANs).
# It is recommended to use absolute paths for the commands.
commands_before=(
"[ -x /data/custom/wireguard/udm-wireguard.sh ] && /data/custom/wireguard/udm-wireguard.sh"
""
)
# List of commands that should be executed after firewall rules are adopted.
# It is recommended to use absolute paths for the commands.
commands_after=(
"[ -x /data/custom/ipv6/udm-ipv6.sh ] && /data/custom/ipv6/udm-ipv6.sh"
""
)
#
# No further changes should be necessary beyond this line.
#
######################################################################################
Hinweis: Mit Ausführung des Skriptes werden die VLANs voneinander getrennt. Daher sollten die Verbindungen, die zwischen den Systemen unterschiedlicher VLANs möglich sein sollen, am besten vorher in den Firewall-Einstellungen der UDM-Pro eingerichtet werden werden.
Nach der Konfiguration kann durch Aufrufen des Skriptes /data/custom/wireguard/udm-firewall.sh
das Regelwerk bereits manuell angepasst werden. Dabei sollten keine Fehlermeldungen erscheinen. Ist die Option zur Trennung der LAN-Segmente aktiv (separate_lan=true
) und sind mehr als ein LAN-Netzwerk in der Netzwerk App, dann sollten mit dem Kommando iptables -L lan_separation -v
entsprechende Regeln ausgegeben werden:
root@unifi:~# iptables -L lan_separation -v
Chain lan_separation (1 references)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- br0 br11 anywhere anywhere reject-with icmp-port-unreachable
0 0 REJECT all -- br0 br12 anywhere anywhere reject-with icmp-port-unreachable
[...]
04.3| systemd-Service einrichten
Nachdem das Skript grundsätzlich funktioniert, muss nur noch sichergestellt werden, dass es beim Systemstart auch automatisch geladen wird.Da mit unifiOS 3.x systemd eingeführt wurde, kann dabei auf das on-boot-script der unifios-utilities verzichtet werden. Stattdessen habe ich einen systemd-Service für udm-firewall zusammen mit einem systemd Timer eingerichtet. Über den Timer wird sichergestellt, dass das Script nicht nur beim Systemstart, sondern zusätzlich auch alle 90 Sekunden ausgeführt wird. Werden die Firewall-Anpassungen von der Network App gelöscht, so sind sie spätestens nach 90 Sekunden wieder aktiv. Systemd Timer und Service werden folgendermaßen eingerichtet:
# Install udm-firewall.service und timer definition file in /etc/systemd/system via:
ln -s /data/custom/firewall/udm-firewall.service /etc/systemd/system/udm-firewall.service
ln -s /data/custom/firewall/udm-firewall.timer /etc/systemd/system/udm-firewall.timer
# Reload systemd, enable and start the service and timer:
systemctl daemon-reload
systemctl enable udm-firewall.service
systemctl start udm-firewall.service
systemctl enable udm-firewall.timer
systemctl start udm-firewall.timer
# check status of service and timer
systemctl status udm-firewall.timer udm-firewall.service
04.4| Firewall-Regel zur zusätzlichen Absicherung
Das Script funktioniert nur wenn sich an der Firewall-Struktur, wie Beispielsweise an den iptables-Chains, nichts grundlegend ändert. Eine solche Änderung kann mit jedem UnifiOS-Update eingeführt werden. Jedes Update kann also dazu führen, dass die vom Script generierten Regeln nicht mehr funktionieren.
Alternativ kann die Netzwerktrennung auch durch Firewall-Regeln in der GUI umgesetzt werden. Für IPv4-Verbindungen kann das mit nur einer IP Group und jeweils einer Firewall-Regel für LAN In
und Guest In
umgesetzt werden:
Mit der Regel werden alle IPv4-Pakete, die von einem der konfigurierten LAN-Netzwerk an eine lokale (RFC 1918) IPv4-Adresse geschickt werden verworfen. Alle Pakete, die an öffentliche Adressen gerichtet sind, werden dank der Default Allow-Regeln durchgelassen. Verbindungen zum Internet sind somit weiterhin möglich.
Leider funktioniert dieser Ansatz bei IPv6 nicht so einfach, da bei IPv6 alle Systeme nicht nur interne sondern auch öffentliche IP-Adressen zugewiesen bekommen. Daher kann keine vergleichbare RFC-1918 IP Gruppe für die IPv6-Adressen erstellt werden. Zwar könnte man hier auf die ULA-Adressen filtern, aber dann bleiben die Systeme über ihre öffentlichen IPv6-Adressen weiter erreichbar. Für eine vollständige Filterung können daher nur die Inboudnd/Outbound-Interfaces verwendet werden. Die können bei den IPv6-Firewall-Regeln in der GUI aber nicht ausgewählt werden. Bleibt also nur noch die Regeln über ein Script einzufügen.
05| IPv6 Workarounds
Leider wird IPv6 auch in anderen Bereichen der aktuellen Network App Version nicht oder nur rudimentär unterstützt (siehe auch UDM Pro 1.x: IPv6 hinter einer FRITZ!Box einrichten oder UDM Pro 1.x: Workaround für dynamische IPv6 Prefixe).
Die gute Nachricht: An der grundsätzlichen IPv6-Konfiguration musste ich nach dem Update nichts anpassen. Die in UDM Pro 1.x: IPv6 hinter einer FRITZ!Box einrichten vorgenommenen Einstellungen wurden fehlerfrei übernommen.
Aber eine Unique Local Address (ULA) kann immer noch nichtin der Network App vergeben werden. Auch wenn es nicht unbedingt als Best-Practice gilt ULAs zu verwenden, hilft es vor allem bei dynamischen IPv6-Präfixen den Datenverkehr im internen Netzwerk zu filtern.
Außerdem konnte die UDM-Pro in der Vergangenheit generell nicht mit den dynamischen IPv6-Präfixen umgehen. Jedes mal, wenn der Provider ein neues Präfix zugeordnet hat, ging die IPv6-Verbindung verloren (siehe auch UDM Pro 1.x: Workaround für dynamische IPv6 Prefixe). Da mein Provider aktuell scheinbar die IPv6-Addresse nicht mehr so häufig aktualisiert, konnte ich noch nicht herausfinden ob UnifiOS 3.2.7 damit immer noch ein Problem hat. Sicherheitshalber will ich den bisher implementierten Workaround aber mit übernehmen.
05.1| Installation von udm-ipv6
Auch dazu wird einfach ein Script (udm-ipv6) aus meinem GitHub-Repository installiert:
mkdir -p /data/custom
dpkg -l git || apt install git
git clone https://github.com/nerdiges/udm-ipv6.git /data/custom/ipv6
chmod +x /data/custom/ipv6/udm-ipv6.sh
05.2| Anpassung der Konfiguration
Bei Bedarf kann das Script noch angepasst werden. Dazu können die entsprechenden Konfigurationsvariablen direkt am Anfang des Scripts udm-ipv6.sh
angepasst werden. Allerdings werden die Änderungen beim nächsten Update des Scripts wieder überschrieben. Muss bzw. soll die Konfiguration angepasst werden, sollten die Änderungen daher besser in der Datei /data/custom/ipv6/udm-ipv6.conf
gespeichert werden. Folgende Parameter können aktuell über die Umgebungsvariablen angepasst werden:
######################################################################################
#
# Configuration
#
# check and try to restore IPv6 connection
check_v6=true
# WAN-Interface to be checked
wan_if="eth8 eth9"
# IPv6 hosts used to test IPv6 connection
host1="facebook.de"
host2="google.de"
host3="apple.com"
host4="microsoft.com"
# set ULA on lan interfaces?
lan_ula=true
# set ULA on guest interfaces?
guest_ula=false
# ULA prefix to be used
ula_prefix="fd00:2:0:"
# interfaces listed in exclude will not be assigned any IPv6 ULAs
# Multiple interfaces are to be separated by spaces.
exclude="br0"
#
# No further changes should be necessary beyond this line.
#
######################################################################################
05.4| Autostart durch udm_firewall
In der Standardkonfiguration des udm-firewall Skriptes wird über den Parameter $commands_after
(siehe oben) automatisch mit der nächsten Aufruf des Scripts udm-firewall ausgeführt; also spätestens 90 Sekunden nach der Installation. Der systemd Service und Timer muss daher nicht mehr eingerichtet werden.
06| Wireguard einrichten
In der aktuellen GUI der UDM Pro können grundsätzlich wireguard VPNs eingerichtet weden. Allerdings sind hier eher Standardkonfigurationen möglich. Komplexere Site2Site-Setups mit speziellen Paramtern konnte ich über die GUI nicht einrichten. Stattdessen habe ich mit udm-wireguard die VPN-Verbindungen direkt an der Kommandozeile eingerichtet.
06.1| Installation von udm-wireguard
Auch dazu wird einfach ein Script (udm-wireguard) aus meinem GitHub-Repository installiert:
mkdir -p /data/custom
dpkg -l git || apt install git
git clone https://github.com/nerdiges/udm-wireguard.git /data/custom/wireguard
chmod +x /data/custom/wireguard/udm-wireguard.sh
06.2| Anpassung der Konfiguration
Bei Bedarf kann das Script noch angepasst werden. Dazu können die entsprechenden Konfigurationsvariablen direkt am Anfang des Scripts udm-wireguard.sh
angepasst werden. Allerdings werden die Änderungen beim nächsten Update des Scripts wieder überschrieben. Muss bzw. soll die Konfiguration angepasst werden, sollten die Änderungen daher besser in der Datei /data/custom/wireguard/udm-wireguard.conf
gespeichert werden. Folgende Parameter können aktuell über die Umgebungsvariablen angepasst werden:
##############################################################################################
#
# Configuration
#
# directory with wireguard config files. All *.conf files in
# the directory will be considered as valid wireguard configs
conf_dir="/data/custom/wireguard/"
#
# No further changes should be necessary beyond this line.
#
######################################################################################
06.3| wireguard Konfigurationsdateien anlegen
Damit wireguard Interfaces angelegt werden, müssen die entsprechenden wireguard Config-Files erstellt und im Verzeichnis $conf_dir
(siehe oben Punkt 2) abgelegt werden.
Der Dateiname der Konfigurationsdateien ist dabei entscheidend für den Interface-Namen. Alles vor dem Suffix .conf
wird als Interfacename genutzt. Die Datei wg0.conf
erzeugt somit beispielsweise das Interface wg0
.
Hinweis: Der DNS-Parameter in wireguard Config-Files führt zu einer Fehlermeldung, da das Paket openresolv im UnifiOS per Default nicht installiert ist.
06.4| Autostart durch udm_firewall
In der Standardkonfiguration des udm-firewall Skriptes wird über den Parameter $commands_before
(siehe oben) automatisch mit der nächsten Aufruf des Scripts udm-firewall ausgeführt; also spätestens 90 Sekunden nach der Installation. Der systemd Service und Timer muss daher nicht mehr eingerichtet werden.
07| SSH Keys
Damit man sich ohne Passwort an der UDM-Pro anmelden kann, muss ein Public-SSH-Key hinterlegt werden:
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cat [YOUR-SSH-PUBKEY-HERE] > ~/.ssh/authorized_keys
Hinweis: Sollte der SSH-Key auch regelmäßig überschrieben werden, so muss hier ggf. auch per cron oder systemd regelmäßig überprüft werden, ob der SSH-Key noch vorhanden ist.
Kommentare