UniFi‑Switch ohne SSH hinter NAT‑Firewall adoptieren per DHCP‑Option 43
Diese Anleitung beschreibt Schritt für Schritt, wie du einen UniFi‑UniFi-Switch (z. B. USW‑Flex‑USW-Flex-Mini), der kein SSH bietet, mit einem Controller koppelst, der sich hinter einer NAT‑NAT-Firewall befindet.
Der Trick: Wir geben dem Switch die Controller‑Controller-IP direkt via DHCP Option 43.
Debian‑Debian-/Ubuntu‑Ubuntu-System mit zwei NICs (eth0= uplink/NAT‑NAT-Seite,eth1=Switch‑Switch-Port).- UniFi Controller
bereitsist aus dem Uplink-Netz untererreichbar.172.19.10.0.1540.1 Root‑ oder sudo‑Root-Zugriff auf denDebian‑Host.Debian-Host (oder du wechselst persu -auf root).
1 · Netzdesign / Topologie
# uplink‑uplink-LAN (z. B. 172.20.1.10.0.0.0/23)24)
Internet/Router ──> eth0 (172.20.1.102/23)10.0.0.2/24) [Debian] \
\ NAT (Masquerade)
eth1 (172.19.2.0.0.1/24) [Debian] ──> UniFi‑UniFi-Switch (DHCP, z. B. 172.19.2.100.0.10)
# Controller liegt im Uplink‑Uplink-LAN: 172.19.10.0.1540.1
- eth1 bekommt ein separates /24 (hier
172.), damit der Switch19.2.0.0.0/24weiß,sofort erkennt, dassaußerhalb seines Netzes liegt und das Gateway nutzt.172.19.10.0.1540.1 NATNAT /Masquerade auf demDebian‑Debian-Host erlaubt dem Switch, den Controller übereth0zu erreichen.
2 · Interface‑Interface- und System‑System-Basis
# /etc/network/interfaces – Ausschnitt
auto eth1
iface eth1 inet static
address 172.19.2.0.0.1
netmask 255.255.255.0
# IP‑IP-Forwarding permanent einschalten (als root)
echo "net.ipv4.ip_forward = 1" | sudo tee> /etc/sysctl.d/99-nat.conf
sudo
sysctl -p /etc/sysctl.d/99-nat.conf
# Einfaches Masquerading für das Subnetz 172.19.2.0.0.0/24 sudo(als root)
iptables -t nat -A POSTROUTING -s 172.19.2.0.0.0/24 -o eth0 -j MASQUERADE
# Regeln persistent speichern – z. B. via iptables-persistent
3 · ISC‑DHCP‑ISC-DHCP-Server installieren & konfigurieren
sudo# als root
apt-get update
sudo
apt-get install isc-dhcp-server
3.1 Server‑Server-Interface festlegen
# /etc/default/isc-dhcp-server
INTERFACESv4="eth1"
3.2 /etc/dhcp/dhcpd.conf
subnet 172.19.2.0.0.0 netmask 255.255.255.0 {
range 172.19.2.0.0.10 172.19.2.0.0.50;
option routers 172.19.2.0.0.1;
option broadcast-address 172.19.2.0.0.255;
# *** UniFi‑UniFi-Magie: DHCP Option 43 ***
# 01 -> Sub‑Sub-Option 1 (Controller‑Controller-IP)
# 04 -> Länge in Bytes (4)
# ac 130a 00 9a00 01 -> 172.19.10.0.1540.1 in Hex
option vendor-encapsulated-options 01:04:ac:13:0a:00:9a;00:01;
# optional – nur sinnvoll, wenn du hier wirklich DNS "unifi"anbieten »willst
Controller‑IP# (ansonsten weglassen oder auf deinen echten DNS zeigen)
option domain-name-servers 172.19.10.0.154;0.1;
}
Jedes Oktett der Controller‑Controller-IP in Hex schreiben:
17210 =ac19 =130a- 0 =
00 1540 =9a00- 1 =
01
01:04:ac:13:0a:00:9a00:01sudo systemctl enable --now isc-dhcp-server
sudo
systemctl status isc-dhcp-server
4 · Firewall / Ports
| Port | Protokoll | Zweck |
|---|---|---|
| 8080 | TCP | Inform & Adoption |
| 3478 | UDP | STUN |
| 10001 | UDP | Discovery (alt) |
| 8443 | TCP |
Achte darauf, dass diese Ports von 172. über NAT zu 19.2.0.0.0/24 passieren dürfen.172.19.10.0.1540.1
5 · Switch anschließen & adoptieren
- Switch auf Werkseinstellungen zurücksetzen (
Reset‑Reset-Taster >55 s). - An
eth1desDebian‑Debian-Hosts stecken. - Mit
tcpdumpüberprüfen, dass Option 43 imDHCPACKauftaucht:
sudotcpdump -ni eth1 port 67 or port 68 | grep -i "Vendor specific" Controller‑Controller-UI öffnenhttps://➜ Devices » Pending Adoption.<Controller‑FQDN>:10.0.0.1:8443
Gerät erscheint? → Adopt.
Debugging‑Debugging-Checks
# Kommt der Switch raus?
ping -c3 172.19.10.0.1540.1
# Siehst du Inform‑Inform-Traffic?
sudo
tcpdump -ni eth1 host 172.19.10.0.1540.1 and port 8080
# Controller‑Controller-Logs (Pfad je nach Installation/Container ggf. anders)
tail -f /usr/lib/unifi/logs/server.log
- Option 43 fehlt ➜ DHCP checken.
- NAT/Firewall blockt Port 8080 ➜
iptables‑iptables-Regeln prüfen. - Falsche Subnetzmaske ➜ Switch glaubt, Controller sei lokal.
Anhang A · IP‑IP-Adresse in Hexadezimal umrechnen – Schritt für Schritt
Warum überhaupt Hex?DHCP‑Option DHCP-Option 43 braucht die Controller‑Controller-IP als rohe Bytefolge. Bytes schreibt man in der Netzwerktechnik üblich in Hexadezimal (“Hex”). Ein Byte kann Werte von 00 bis ff (= 0 0 – 255 255 dezimal) annehmen.
1 · Vier Oktette der IP aufschreiben
Beispiel‑Beispiel-IP unseres Controllers:
172 . 1910 . 0 . 1540 . 1
2 · Jedes Oktett einzeln nach Hex konvertieren
| Dezimal | Rechenweg | Hexadezimal |
|---|---|---|
, |
| |
| |
|
| 0 | 0 =00 |
00 |
00 |
00 |
|
| 1 | 1 / 16 = |
|
Merksatz: Wenn das Ergebnis nur ein Hex‑Hex-Zeichen hat (z. B. a), wird immer eine führende Null ergänzt → 0a. So entstehen exakt vier Byte.
3 · Bytes zusammenfügen
ac 130a 00 9a00 01
4 · In DHCP‑Option DHCP-Option 43 einbauen
Die Struktur lautet: 01 : 04 : <IP‑Hex‑IP-Hex-Byte1> : <IP‑Hex‑IP-Hex-Byte2> : <IP‑Hex‑IP-Hex-Byte3> : <IP‑Hex‑IP-Hex-Byte4>
01=Sub‑Sub-Option 1 (Controller‑Controller-IP)04= Länge (4 Byte)= die vierac:13:0a:00:9a00:01Hex‑Hex-Bytes von oben
option vendor-encapsulated-options 01:04:ac:13:0a:00:9a;00:01;
Schnell‑Schnell-Check mit Python
Für größere Netze lohnt es sich, nicht zu rechnen, sondern einen Einzeiler zu nutzen:
python3 -c 'import sys,ipaddress,struct;ipaddress; \
print(":".join(f"{b:02x}" for b in ipaddress.IPv4Address(sys.argv[1]).packed))' \
172.19.10.0.1540.1
Ausgabe: –ac:13:0a:00:9a00:01 genau wie von Hand.
Spickzettel 0 0 – 255 → Hex
| Dez | Hex | Dez | Hex | Dez | Hex | Dez | Hex |
|---|---|---|---|---|---|---|---|
| 0 | 00 | 16 | 10 | 128 | 80 | 240 | f0 |
| 1 | 01 | 32 | 20 | 144 | 90 | 241 | f1 |
| 2 | 02 | 64 | 40 | 160 | a0 | 250 | fa |
| 3 | 03 | 100 | 64 | 176 | b0 | 255 | ff |
Damit können auch Azubis ohne Vorwissen eine IP schnell in Hex umbrechen und die Option Option 43 korrekt setzen.