Skip to main content

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.

Voraussetzungen
  • Debian‑Debian-/Ubuntu‑Ubuntu-System mit zwei NICs (eth0 = uplink/NAT‑NAT-Seite, eth1 = Switch‑Switch-Port).
  • UniFi Controller bereitsist aus dem Uplink-Netz unter 172.19.10.0.1540.1 erreichbar.
  • Root‑ oder sudo‑Root-Zugriff auf den Debian‑Host.Debian-Host (oder du wechselst per su - 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.19.2.0.0.0/24), damit der Switch weiß,sofort erkennt, dass 172.19.10.0.1540.1 außerhalb seines Netzes liegt und das Gateway nutzt.
  • NAT NAT / Masquerade auf dem Debian‑Debian-Host erlaubt dem Switch, den Controller über eth0 zu 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;
}
IP → Hex‑Hex-Konvertierung

Jedes Oktett der Controller‑Controller-IP in Hex schreiben:

  • 17210 = ac
  • 19 = 130a
  • 0 = 00
  • 1540 = 9a00
  • 1 = 01
01:04:ac:13:0a:00:9a00:01
sudo 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 Controller‑Controller-GUI/API

Achte darauf, dass diese Ports von 172.19.2.0.0.0/24 über NAT zu 172.19.10.0.1540.1 passieren dürfen.

5 · Switch anschließen & adoptieren

  1. Switch auf Werkseinstellungen zurücksetzen (Reset‑Reset-Taster > 5  5 s).
  2. An eth1 des Debian‑Debian-Hosts stecken.
  3. Mit tcpdump überprüfen, dass Option 43 im DHCPACK auftaucht:
    sudo tcpdump -ni eth1 port 67 or port 68 | grep -i "Vendor specific"
  4. Controller‑Controller-UI öffnen https://<Controller‑FQDN>:10.0.0.1:8443 ➜ Devices » Pending Adoption.
    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
Gerät taucht nicht auf?
  • 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
17210 17210 / 16 = 100 Rest 121010 0 = a0, 12 10 = ca ac
1919 / 16 = 1 Rest 3 → 1 = 1, 3 = 3130a
0 0 = 0  0  00 00
1540 1540 = 0 → 0000
11 / 16 = 90 Rest 1019 = 9, 10 = a01 9a01

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)
  • ac:13:0a:00:9a00:01 = die vier Hex‑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.