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‑Switch (z. B. USW‑Flex‑Mini), der kein SSH bietet, mit einem Controller koppelst, der sich hinter einer NAT‑Firewall befindet.
Der Trick: Wir geben dem Switch die Controller‑IP direkt via DHCP Option 43.

Voraussetzungen
  • Debian‑/Ubuntu‑System mit zwei NICs (eth0 = uplink/NAT‑Seite, eth1 = Switch‑Port).
  • UniFi Controller bereits unter 172.19.0.154 erreichbar.
  • Root‑ oder sudo‑Zugriff auf den Debian‑Host.

1 · Netzdesign / Topologie

# uplink‑LAN (z. B. 172.20.1.0/23)
Internet/Router ──> eth0 (172.20.1.102/23) [Debian]  \
                                                       \ NAT
                                 eth1 (172.19.2.1/24)  [Debian] ──> UniFi‑Switch 172.19.2.10
# Controller liegt im Uplink‑LAN: 172.19.0.154
  • eth1 bekommt ein separates /24 (hier 172.19.2.0/24), damit der Switch weiß, dass 172.19.0.154 außerhalb seines Netzes liegt und das Gateway nutzt.
  • NAT / Masquerade auf dem Debian‑Host erlaubt dem Switch, den Controller über eth0 zu erreichen.

2 · Interface‑ und System‑Basis

# /etc/network/interfaces – Ausschnitt
auto eth1
iface eth1 inet static
    address 172.19.2.1
    netmask 255.255.255.0
# IP‑Forwarding permanent einschalten
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/24
sudo iptables -t nat -A POSTROUTING -s 172.19.2.0/24 -o eth0 -j MASQUERADE
# Regeln persistent speichern – z. B. via iptables-persistent

3 · ISC‑DHCP‑Server installieren & konfigurieren

sudo apt-get update
sudo apt-get install isc-dhcp-server

3.1 Server‑Interface festlegen

# /etc/default/isc-dhcp-server
INTERFACESv4="eth1"

3.2 /etc/dhcp/dhcpd.conf

subnet 172.19.2.0 netmask 255.255.255.0 {
  range 172.19.2.10 172.19.2.50;
  option routers 172.19.2.1;
  option broadcast-address 172.19.2.255;

  # *** UniFi‑Magie: DHCP Option 43 ***
  # 01  -> Sub‑Option 1  (Controller‑IP)
  # 04  -> Länge in Bytes (4)
  # ac 13 00 9a -> 172.19.0.154 in Hex
  option vendor-encapsulated-options 01:04:ac:13:00:9a;

  # optional – DNS "unifi" » Controller‑IP
  option domain-name-servers 172.19.0.154;
}
IP → Hex‑Konvertierung

Jedes Oktett der Controller‑IP in Hex schreiben:

  • 172 = ac
  • 19 = 13
  • 0 = 00
  • 154 = 9a
01:04:ac:13:00:9a
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‑GUI/API

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

5 · Switch anschließen & adoptieren

  1. Switch auf Werkseinstellungen zurücksetzen (Reset‑Taster > 5 s).
  2. An eth1 des 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‑UI öffnen https://<Controller‑FQDN>:8443 ➜ Devices » Pending Adoption.
    Gerät erscheint? → Adopt.

Debugging‑Checks

# Kommt der Switch raus?
ping -c3 172.19.0.154

# Siehst du Inform‑Traffic?
sudo tcpdump -ni eth1 host 172.19.0.154 and port 8080

# Controller‑Logs
tail -f /usr/lib/unifi/logs/server.log
Gerät taucht nicht auf?
  • Option 43 fehlt ➜ DHCP checken.
  • NAT/Firewall blockt Port 8080 ➜ iptables‑Regeln prüfen.
  • Falsche Subnetzmaske ➜ Switch glaubt, Controller sei lokal.

Anhang A · IP‑Adresse in Hexadezimal umrechnen – Schritt für Schritt

Warum überhaupt Hex?
DHCP‑Option 43 braucht die Controller‑IP als rohe Bytefolge. Bytes schreibt man in der Netzwerktechnik üblich in Hexadezimal (“Hex”). Ein Byte kann Werte von 00 bis ff (= 0 – 255 dezimal) annehmen.

1 · Vier Oktette der IP aufschreiben

Beispiel‑IP unseres Controllers:

172 . 19 . 0 . 154

2 · Jedes Oktett einzeln nach Hex konvertieren

Dezimal Rechenweg Hexadezimal
172 172 / 16 = 10 Rest 12 → 10 = a, 12 = c ac
19 19 / 16 = 1 Rest 3 → 1 = 1, 3 = 3 13
0 0 = 0 → 00 00
154 154 / 16 = 9 Rest 10 → 9 = 9, 10 = a 9a

Merksatz: Wenn das Ergebnis nur ein 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 13 00 9a

4 · In DHCP‑Option 43 einbauen

Die Struktur lautet: 01 : 04 : <IP‑Hex‑Byte1> : <IP‑Hex‑Byte2> : <IP‑Hex‑Byte3> : <IP‑Hex‑Byte4>

  • 01 = Sub‑Option 1 (Controller‑IP)
  • 04 = Länge (4 Byte)
  • ac:13:00:9a = die vier Hex‑Bytes von oben
option vendor-encapsulated-options 01:04:ac:13:00:9a;

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; \
print(":".join(f"{b:02x}" for b in ipaddress.IPv4Address(sys.argv[1]).packed))' \
172.19.0.154

Ausgabe: ac:13:00:9a – genau wie von Hand.

Spickzettel 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 43 korrekt setzen.