Die Ubiquiti UniFi Dream Machine Pro (UDM-PRO) bietet ein gutes Preis-Leistungs-Verhältnis, weshalb sie oft im Privatgebrauch oder in kleinen Firmen zum Einsatz kommt. Idealerweise wird das Gerät direkt oder über ein Modem mit dem Internet verbunden. Hierfür stehen an der UDM-PRO die beiden WAN-Ports 9 (RJ45) und 10 (SFP) zur Verfügung. Auf beiden Ports ist die Network Address Translation (NAT) standardmäßig aktiviert. Innerhalb der Konfigurationsoberfläche besteht keine Möglichkeit NAT zu deaktivieren.
Falls die UDM-PRO unter bestimmten Voraussetzungen hinter einem Router, z.B. einer FRITZ!Box betrieben werden muss, dann hat man zwangsweise den Nachteil von doppeltem NAT. In vielen Fällen kann dieses Setup ohne weitere Einschränkungen genutzt werden. Doppeltes NAT führt aber oftmals bei Onlinespielen, Xbox, PlayStation und Co zu Problemen. Diese Probleme können jedoch behoben werden, indem die UDM-PRO in der FRITZ!Box als “Exposed Host” konfiguriert wird. Das doppelte NAT ist dann aber trotzdem noch vorhanden.
Lange Rede kurzer Sinn: In diesem Artikel möchte ich euch zeigen, wie ihr NAT auf den WAN-Ports der UDM-PRO deaktivieren könnt.
SSH aktivieren und verbinden
Zunächst müsst ihr den SSH-Zugang aktivieren und ein Passwort setzen. Dies erfolgt über die Einstellungen der UDM-PRO unter dem Punkt “Console Settings”. Bei älteren Versionen von UniFi OS sieht die Weboberfläche ein wenig anders aus.
UDM SSH aktivieren
Anschließend könnt ihr euch z.B. mit PuTTY via SSH auf die UDM-PRO verbinden. Der Username ist “root”.
Mit folgendem Befehl können wir die aktuelle NAT-Konfiguration einsehen:
ab UniFi OS 3.x:
xtables-multi iptables -t nat -L UBIOS_POSTROUTING_USER_HOOK -v --line-number
UniFi OS 2.x und älter:
xtables-legacy-multi iptables -t nat -L UBIOS_POSTROUTING_USER_HOOK -v --line-number
Standardmäßig sieht die NAT-Konfiguration folgendermaßen aus:
Chain UBIOS_POSTROUTING_USER_HOOK (1 references)
num pkts bytes target prot opt in out source destination
1 481K 66M MASQUERADE all -- any eth8 anywhere anywhere
2 0 0 MASQUERADE all -- any eth9 anywhere anywhere
Hier ist ersichtlich, dass auf Port 9 (eth8) und Port 10 (eth9) NAT aktiviert ist.
“UDM / UDMPro Boot Script” installieren
Voraussetzung für das Deaktivieren von NAT ist das “UDM / UDMPro Boot Script“, welches auch nach einem Neustart oder Firmwareupdate bestehen bleibt.
Für die Installation wird das Boot Script heruntergeladen und installiert. Je nach Version von UniFi OS kann noch die alte Version des Skripts verwendet werden, welche bis UniFi OS 2.4.x funktionieren sollte.
curl -fsL "https://raw.githubusercontent.com/unifi-utilities/unifios-utilities/HEAD/on-boot-script/remote_install.sh" | /bin/sh
Alternativ ab UniFi OS 2.5.x und höher dann folgende Variante. Hier ist etwas mehr manuelle Handarbeit zu erledigen:
# Download package
curl -L https://github.com/unifi-utilities/unifios-utilities/raw/main/on-boot-script-2.x/packages/udm-boot-2x_1.0.1_all.deb -o /tmp/udm-boot-2x_1.0.1_all.deb
# Install it
dpkg -i /tmp/udm-boot-2x_1.0.1_all.deb
# Patches for 'udm-boot-2x_1.0.1_all.deb' package
sed -i 's/Description=Run On Startup UDM 2.x/Description=Run On Startup UDM 3.x/g' /lib/systemd/system/udm-boot.service
sed -i '/Restart=on-failure/d' /lib/systemd/system/udm-boot.service
sed -i '/RestartSec=5s/d' /lib/systemd/system/udm-boot.service
# Enable reload and start
systemctl enable udm-boot
systemctl daemon-reload
systemctl start udm-boot
Zum Schluss sollte geprüft werden, ob das Skript auch läuft:
systemctl status udm-boot.service
Sofern “Run On Startup UDM 3.x” angezeigt wird, passt alles.
NAT deaktivieren
Jetzt könnt ihr eigene Shell Scripte in “/data/on_boot.d” hinterlegen, die bei jedem UDM-PRO Start bzw. Reboot ausgeführt werden.
cd /data/on_boot.d
Dort erstellt ihr euer Skript zur Deaktivierung von NAT:
touch /data/on_boot.d/delete-nat.sh
Das Skript funktioniert ab UniFi OS 3.x und bekommt folgenden Inhalt:
#!/bin/bash
# Check if script runs directly after boot. If so, wait for 10 seconds.
uptimeMinutes=`cat /proc/uptime | awk '{print $1}'`
if [ ${uptimeMinutes::-3} -lt 300 ]
then
logger NAT-Script: Script zum 1. Mal nach Boot ausgefuehrt
sleep 10
else
logger NAT-Script: Script via Cron-Job ausgefuehrt
fi
# Check if default NAT rules exist
if iptables -t nat -S UBIOS_POSTROUTING_USER_HOOK | grep -e "UBIOS_POSTROUTING_USER_HOOK -o eth8 -m comment --comment 00" -e "UBIOS_POSTROUTING_USER_HOOK -o eth9 -m comment --comment 00" > /dev/null
then
xtables-legacy-multi iptables -t nat -D UBIOS_POSTROUTING_USER_HOOK 1
if iptables -t nat -S UBIOS_POSTROUTING_USER_HOOK | grep -e "UBIOS_POSTROUTING_USER_HOOK -o eth8 -m comment --comment 00" -e "UBIOS_POSTROUTING_USER_HOOK -o eth9 -m comment --comment 00" > /dev/null
then
xtables-legacy-multi iptables -t nat -D UBIOS_POSTROUTING_USER_HOOK 1
if iptables -t nat -S UBIOS_POSTROUTING_USER_HOOK | grep -e "UBIOS_POSTROUTING_USER_HOOK -o eth8 -m comment --comment 00" -e "UBIOS_POSTROUTING_USER_HOOK -o eth9 -m comment --comment 00" > /dev/null
then
logger NAT-Script: NAT-Regel gefunden, Loeschen nicht erfolgreich \(Fehler!\)
else
logger NAT-Script: NAT-Regel gefunden und geloescht
fi
else
logger NAT-Script: NAT-Regel gefunden und geloescht
fi
else
logger NAT-Script: Keine NAT-Regel vorhanden
fi
# Check if cron job exists
if ls /etc/cron.d/delete-nat > /dev/null 2>&1
then
logger NAT-Script: Cron-Job vorhanden
else
echo "*/15 * * * * /data/on_boot.d/delete-nat.sh" > /etc/cron.d/delete-nat
logger NAT-Script: Cron-Job nicht vorhanden und erstellt
/etc/init.d/cron restart
fi
Das Skript ist eine leicht optimierte Version der ursprünglichen Variante aus dem
Kommentar von other_tobi.
Es überprüft, ob die standardmäßig gesetzten NAT-Regeln vorhanden sind und entfernt diese. Außerdem wird ein rudimentäres Logging geboten.
Bei jeder Änderung im Routing oder in den Firewall-Regeln der UDM-PRO werden die beiden NAT-Policies wiederhergestellt. Aus diesem Grund wird ein Cronjob erstellt, welcher dafür sorgt, dass das Skript alle 15 Minuten ausgeführt wird. Somit wird sichergestellt, dass die Standard-NAT-Regeln wieder entfernt werden, sofern diese automatisch generiert werden.
Das Skript muss anschließend noch ausführbar gemacht werden:
chmod +x delete-nat.sh
Bei Bedarf könnt ihr das Skript direkt starten und prüfen, ob es funktioniert.
bash delete-nat.sh
Eine Überprüfung mit
xtables-legacy-multi iptables -t nat -L UBIOS_POSTROUTING_USER_HOOK -v --line-number
zeigt, dass beide NAT-Regeln entfernt wurden:
Chain UBIOS_POSTROUTING_USER_HOOK (1 references)
num pkts bytes target prot opt in out source destination
Das Logging des Skripts könnt ihr folgendermaßen einsehen:
grep NAT /var/log/messages
Statische Route in der FRITZ!Box
Standardmäßig ist das FRITZ!Box Subnetz 192.168.178.0/24 und das Netz der UDM-PRO 192.168.1.0/24.
Damit Clients aus dem UDM-PRO-Subnetz auf das Internet oder die FRITZ!Box zugreifen können, wird noch eine statische Route auf der FRITZ!Box benötigt.
Diese könnt ihr unter “Heimnetz –> Netzwerke –> Netzwerkeinstellungen” anlegen. Dazu ganz nach unten scrollen und auf den Button “IPv4-Routen” klicken (siehe Bild).
Dort erstellt ihr eine neue Route und gebt folgende Daten ein:
- Netzwerk: das Netz der UDM-PRO, standardmäßig 192.168.1.0
- Subnetzmaske: die Subnetzmaske des vorher eingetragenen Netzes, standardmäßig 255.255.255.0
- Gateway: die Adresse der UDM-PRO im FRITZ!Box Subnetz, diese kann unter “Heimnetzwerk” in Erfahrung gebracht werden
Mit Klick auf “Übernehmen” ist dieser Schritt erledigt.
Optional: Firewall-Regel in der UDM-PRO
Dieser Schritt ist nur notwendig, wenn ihr vom Subnetz der FRITZ!Box auf ein Subnetz “hinter” der UniFi Dream Machine Pro zugreifen möchtet. Anders herum funktioniert es ohne weitere Konfiguration.
Die Kommunikation wird nämlich noch durch die Firewall der UDM-PRO blockiert. Um dies zu ändern, muss eine neue Regel erstellt werden. Zunächst muss der UniFi Network Controller auf der UDM-PRO geöffnet werden. Anschließend unter “Einstellungen –> Security –> Internet Threat Management –> Firewall” auf den Button “Create new Rule” klicken.
Exemplarisch habe ich jeglichen Traffic aus dem Subnetz der FRITZ!Box freigegeben. Sofern möglich solltet ihr die Freigabe jedoch spezifischer gestalten, z.B. auf einzelne IP-Adressen einschränken und nicht ganze Subnetze freigeben.
Neueste Kommentare