Ubiquity - UniFi UniFi - Ports Erforderliche Port-Referenzen Die folgenden Angaben listen die UDP- und TCP-Ports auf, die von UniFi verwendet werden. Diese Informationen sind vor allem für Nutzer relevant, die einen selbst gehosteten UniFi Network Server betreiben oder Geräte und Firewalls von Drittanbietern verwenden. Aus diesem Grund empfehlen wir in der Regel eine vollständige UniFi-Installation für eine nahtlose Bereitstellung und optimale native Kompatibilität. Lokale Eingangsports (eingehend) Protokoll Portnummer Verwendung TCP/UDP 53 Wird für DNS verwendet. Erforderlich für die Umleitung des Gästeportals, das Herunterladen von Updates und den Fernzugriff. UDP 3478 Wird für STUN verwendet. UDP 5514 Wird für die Erfassung von Remote-Syslogs verwendet. TCP 8080 Wird für die Kommunikation von Geräten und Anwendungen verwendet. TCP 443 Wird für die GUI/API der Anwendung verwendet, wie sie in einem Webbrowser sichtbar ist. Anwendungen, die auf einer UniFi-Konsole laufen. TCP 8443 Wird für die GUI/API der Anwendung verwendet, wie sie in einem Webbrowser sichtbar ist. Anwendungen, die auf einem Windows/macOS/Linux-System laufen. TCP 8880 Wird für die HTTP-Umleitung des Portals verwendet. TCP 8843 Wird für die HTTPS-Umleitung des Portals verwendet. TCP 6789 Wird für den UniFi-Mobile-Speedtest verwendet. TCP 27117 Wird für die lokale Datenbankkommunikation verwendet. UDP 5656-5699 Wird für das Broadcasting von AP-EDU verwendet. UDP 10001 Wird für die Geräteerkennung verwendet. UDP 1900 Wird für die Option "Anwendung im L2-Netzwerk auffindbar machen" in den UniFi Network-Einstellungen verwendet. UDP 123 Wird für NTP (Datum und Uhrzeit) verwendet. Erforderlich für die sichere Kommunikation mit Remote-Zugriffsservern. Obwohl der TCP-Port 22 standardmäßig nicht von der UniFi Network Anwendung verwendet wird, ist es erwähnenswert, dass dieser Port genutzt wird, wenn über SSH auf UniFi-Geräte oder die Netzwerk-Anwendung zugegriffen wird. Erforderliche Eingangsports für L3-Verwaltung über das Internet (eingehend) Diese Ports müssen sowohl am Gateway/Firewall als auch auf der Maschine, auf der die UniFi Network-Anwendung läuft, geöffnet sein. Dies wird durch das Erstellen von Portweiterleitungen auf dem Gateway/der Firewall erreicht, auf dem die Anwendung ausgeführt wird. Protokoll Portnummer Verwendung UDP 3478 Wird für STUN verwendet. TCP 8080 Wird für die Kommunikation von Geräten und Anwendungen verwendet. TCP 443 Wird für die GUI/API der Anwendung verwendet, wie sie in einem Webbrowser sichtbar ist. Anwendungen, die auf einer UniFi-Konsole laufen. TCP 8443 Wird für die GUI/API der Anwendung verwendet, wie sie in einem Webbrowser sichtbar ist. Anwendungen, die auf einem Windows/macOS/Linux-System laufen. TCP 6789 Wird für den UniFi-Mobile-Speedtest verwendet. TCP 8880 Wird für die HTTP-Umleitung des Portals verwendet (nur erforderlich bei der Nutzung eines Gäste-Hotspots). TCP 8843 Wird für die HTTPS-Umleitung des Portals verwendet (nur erforderlich bei der Nutzung eines Gäste-Hotspots). Erforderliche Ausgangsports für UniFi Remote-Zugriff (ausgehend) In den meisten Fällen sind diese Ports standardmäßig offen und uneingeschränkt. Protokoll Portnummer Verwendung TCP/UDP 53 Wird für DNS verwendet. Erforderlich für die Umleitung des Gästeportals, das Herunterladen von Updates und den Fernzugriff. UDP 3478 Wird für STUN verwendet. TCP/UDP 443 Wird für den Remote-Zugriff verwendet. TCP 8883 Wird für den Remote-Zugriff verwendet. UDP 123 Wird für NTP (Datum und Uhrzeit) verwendet. Erforderlich für die sichere Kommunikation mit Remote-Zugriffsservern. Ändern der Standardports Das Ändern der Standardport-Zuweisungen ist nur auf selbst gehosteten UniFi Network Servern (Windows/macOS/Linux) möglich. Gehen Sie dazu wie folgt vor: Schließen Sie alle Instanzen der UniFi Network-Anwendung. Ändern Sie die Datei system.properties, die sich im Verzeichnis /data/system.properties befindet. Wenn z. B. der Port 8081 belegt ist und der Port 8089 frei ist, können Sie dies ändern, indem Sie unifi.shutdown.port=8081 in unifi.shutdown.port=8089 ändern. Starten Sie die UniFi Network-Anwendung neu. Hinweis: Achten Sie darauf, dass keine führenden oder nachfolgenden Leerzeichen, Kommentare oder andere Zeichen (z. B. #) in den benutzerdefinierten Zeilen vorhanden sind. Andernfalls ignoriert die UniFi Network-Anwendung die Anpassungen.     Quelle: https://help.ui.com/hc/en-us/articles/218506997-Required-Ports-Reference Unifi - Geräte Adopten Wenn ein UniFi Controller verwendet wird, der mehrere Sites/Standorte/IP-Kreise hat, kann es sehr gut sein, das neue, nicht programmierte AP's nicht auf dem Controller erscheinen. Warum das ganze so ist, kann mehrere Gründe haben, ein Grund wäre NAT, da bei NAT die MAC-Adressen nicht mitgegeben werden und somit die erkennung auf MAC-Adress Ebene nicht funktioniert. Um dennoch einen AP auf den Controller zu fixen, muss sich dafür auf dem AP selber eingelogt werden. Neues oder zurückgesetztes Gerät hinzufügen Das ganze funktioniert nur, wenn das Gerät noch neu ist oder zurückgesetzt wurde. Zurücksetzen tust du, indem du das Gerät an den Strom anschließt, wartest bis es hochgefahren ist und dann mit einer Büro klammer den Reset Knopf so lange drückst, bis er anfängt zu blinken oder sich die Status LED verändert. Wenn du zuerst den Reset Knopf drückst und währenddessen Strom dazu gibst, setzt du das Gerät in den Recovery Mode, das benötigen wir aber nicht. Diese Anleitung ist nur notwendig, wenn der UniFi-Controller in einem anderen Netzwerk und/oder an einem anderen Standort als das einzurichtende UniFi Gerät ist. Andernfalls sollte der UniFi-Controller das Gerät nach dem Booten sehen und auch anbieten. IP-Adresse finden Zuerst musst du die IP-Adresse herausfinden, wenn der AP noch nicht konfiguriert ist, sucht er sich per DHCP im Unttaged LAN nach einer IP-Adresse. Nutze einen IP-Scanner um die IP-Adresse des neuen AP’s zu finden. Wenn du nun die IP-Adresse des AP’s kennst, kannst, bzw. musst du dich nun per SSH auf den AP rauf schalten. Die Logindaten für die UniFi Geräte ist immer: User: ubnt Passwd: ubnt also in einer CMD, Powershell oder Terminal einfach: ssh ubnt@IP_Adresse_des_AP’s eingeben. Nach dem du den SSH Befehl eingegeben hast, fragt er, ob er dem fingerprint vertrauen willst. Da musst du “yes” eingeben, da du sonst keine Verbindung aufbauen kannst. Danach fragt er nach dem passwd, das gibst du nun ein, beachte jedoch, das er nichts zeigt, wenn du tippst. Also du gibst Buchstaben ein, aber nichts verändert sich, so wie du in dem Bild siehst, das ist völlig normal.   Sobald du drin bist, kannst du als hilfe “help” eingeben oder direkt den set-inform command. Bei dem set-inform command musst du nun die IP-Addresse deines UniFi Controllers eingeben, in dem Beispiel wird die Addresse 172.19.0.154 verwendet, das musst du entsprechend anpassen. set-inform http://172.19.0.154:8080/inform Auch wenn du deinen Controller per https und Port 8443 öffnest, musst du hier http und den Port 8080 verwenden.   Danach sollte eine Ausgabe wie diese zu sehen sein: Auf der Webseite des UniFi-Controller kannst du nun den AP sehen und hinzufügen. Achte darauf, das du auf der richtigen Site bist (in orange umkreist), der AP wird auf jeder Site angezeigt, falls nicht, aktualisiere das Browser Fenster. Wenn du dann auf der richtigen Site bist, klicke auf die UniFi-Geräte (in rot umkreist) und klicke auf “Zum Verwenden klicken” um den AP in der Site hinzuzufügen. Nun braucht er je nach Modell 3-5 Minuten. Je nachdem wie lange der schon am rumgammeln is, will der natürlich auch nen Update haben, das darfst du dann gerne auch noch hinterher jagen. Er zeigt dir auch immer so in etwa an, wie weit die AP’s sind. Das sind aber nur geschätzte Werte, da UniFi hier einfach eine bestimmte Zeit wartet und während dessen den Blauen Balken zur beruhigung des Menschen anzeigt. Wenn sie auf Aktuell stehen, haben sie alle nötigen Daten erhalten und sind nun aktiv im Einsatz.         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 ist aus dem Uplink-Netz unter 10.0.0.1 erreichbar. Root-Zugriff auf den Debian-Host (oder du wechselst per su - auf root). 1 · Netzdesign / Topologie # uplink-LAN (10.0.0.0/24) Internet/Router ──> eth0 (10.0.0.2/24) [Debian] \ \ NAT (Masquerade) eth1 (172.0.0.1/24) [Debian] ──> UniFi-Switch (DHCP, z. B. 172.0.0.10) # Controller liegt im Uplink-LAN: 10.0.0.1 eth1 bekommt ein separates /24 (hier 172.0.0.0/24), damit der Switch sofort erkennt, dass 10.0.0.1 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.0.0.1 netmask 255.255.255.0 # IP-Forwarding permanent einschalten (als root) echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-nat.conf sysctl -p /etc/sysctl.d/99-nat.conf # Einfaches Masquerading für das Subnetz 172.0.0.0/24 (als root) iptables -t nat -A POSTROUTING -s 172.0.0.0/24 -o eth0 -j MASQUERADE # Regeln persistent speichern – z. B. via iptables-persistent / netfilter-persistent 2.3 · Forwarding erlauben (falls dein Host ein “Sicherheitsbunker” ist) Einige Systeme haben die Standard-Policy der FORWARD-Chain auf DROP. Dann reicht Masquerading allein nicht: Pakete werden zwar NAT-ted, aber beim Forwarding verworfen. Prüfen: iptables -L FORWARD -n -v Wenn dort oben policy DROP steht (und die Zähler hochlaufen), erlaube Forwarding für dein Switch-Netz: # Forwarding von "Switch-Seite" (eth1) ins Uplink (eth0) erlauben iptables -I FORWARD 1 -i eth1 -o eth0 -s 172.0.0.0/24 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT # Rückverkehr (Replies) wieder zurück zur Switch-Seite erlauben iptables -I FORWARD 2 -i eth0 -o eth1 -d 172.0.0.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT Hinweis: Wenn deine Interface-Namen anders heißen (z. B. enp0s31f6 statt eth1 oder wlp0s20f3 statt eth0), ersetze sie entsprechend. Danach ggf. Regeln persistent speichern, sonst sind sie nach dem Reboot weg. 3 · ISC-DHCP-Server installieren & konfigurieren # als root apt-get update 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.0.0.0 netmask 255.255.255.0 { range 172.0.0.10 172.0.0.50; option routers 172.0.0.1; option broadcast-address 172.0.0.255; # *** UniFi-Magie: DHCP Option 43 *** # 01 -> Sub-Option 1 (Controller-IP) # 04 -> Länge in Bytes (4) # 0a 00 00 01 -> 10.0.0.1 in Hex option vendor-encapsulated-options 01:04:0a:00:00:01; # DNS für Clients (hier Cloudflare) option domain-name-servers 1.1.1.1, 1.0.0.1; } IP → Hex-Konvertierung Jedes Oktett der Controller-IP in Hex schreiben: 10 = 0a 0 = 00 0 = 00 1 = 01 01:04:0a:00:00:01 systemctl enable --now isc-dhcp-server 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.0.0.0/24 über NAT zu 10.0.0.1 passieren dürfen. 5 · Switch anschließen & adoptieren Switch auf Werkseinstellungen zurücksetzen (Reset-Taster > 5 s). An eth1 des Debian-Hosts stecken. Mit tcpdump überprüfen, dass Option 43 im DHCPACK auftaucht: tcpdump -ni eth1 port 67 or port 68 | grep -i "Vendor specific" Controller-UI öffnen https://10.0.0.1:8443 ➜ Devices » Pending Adoption. Gerät erscheint? → Adopt. Debugging-Checks # Kommt der Switch raus? ping -c3 10.0.0.1 # Siehst du Inform-Traffic? tcpdump -ni eth1 host 10.0.0.1 and port 8080 # 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-Regeln prüfen (Forwarding + NAT!). 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: 10 . 0 . 0 . 1 2 · Jedes Oktett einzeln nach Hex konvertieren Dezimal Rechenweg Hexadezimal 10 10 / 16 = 0 Rest 10 → 0 = 0, 10 = a 0a 0 0 = 0 → 00 00 0 0 = 0 → 00 00 1 1 / 16 = 0 Rest 1 → 01 01 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 0a 00 00 01 4 · In DHCP-Option 43 einbauen Die Struktur lautet: 01 : 04 : : : : 01 = Sub-Option 1 (Controller-IP) 04 = Länge (4 Byte) 0a:00:00:01 = die vier Hex-Bytes von oben option vendor-encapsulated-options 01:04:0a:00:00:01; 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; \ print(":".join(f"{b:02x}" for b in ipaddress.IPv4Address(sys.argv[1]).packed))' \ 10.0.0.1 Ausgabe: 0a:00:00:01 – 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. UniFi AP - zweiten SSH User hinterlegen UniFi AP: Lokalen SSH-User rebootfest hinterlegen Diese Anleitung legt auf einem UniFi AP einen lokalen SSH-User direkt in der Geräte-Konfiguration an. Der User überlebt einen Reboot, kann aber bei erneuter Controller-Provisionierung wieder überschrieben werden. Achtung: Ein User mit UID 0 ist root-equivalent. Nur auf eigenen Geräten nutzen und SSH nicht offen ins Internet hängen. 1. Passwort-Hash erzeugen Auf einem Linux-System mit OpenSSL einen MD5-crypt-Hash erzeugen: openssl passwd -1 Passwort eingeben und den ausgegebenen Hash kopieren. Beispiel: $1$abc12345$abcdefghijklmnopqrstuv 2. Per SSH auf den UniFi AP verbinden ssh @ Beispiel: ssh ubntadmin@192.168.1.20 3. Aktuelle Config aus dem Flash lesen cfgmtd -f /tmp/system.cfg -r Wichtig: Dieser Schritt liest die gespeicherte Konfiguration aus dem Flash nach /tmp/system.cfg. Nicht nach dem Bearbeiten ausführen, sonst überschreibt man die eigenen Änderungen wieder. Weil Firmware offenbar gern kleine Fallen stellt. 4. Config bearbeiten vi /tmp/system.cfg Einen freien User-Slot suchen oder ergänzen, zum Beispiel users.2: users.2.name= users.2.password= users.2.shell=/bin/ash users.2.status=enabled users.status=enabled Beispiel: users.2.name=localadmin users.2.password=$1$abc12345$abcdefghijklmnopqrstuv users.2.shell=/bin/ash users.2.status=enabled users.status=enabled Falls die Firmware UID/GID-Felder akzeptiert, können diese zusätzlich gesetzt werden: users.2.uid=0 users.2.gid=0 Wichtig: users.2.shell=/bin/false verhindert einen brauchbaren SSH-Login. Für SSH muss dort z. B. /bin/ash stehen. 5. Config dauerhaft in den Flash schreiben cfgmtd -f /tmp/system.cfg -w Danach den AP neu starten: reboot 6. Login testen ssh @ id Wenn der User root-equivalent ist, sollte id ungefähr so aussehen: uid=0(...) gid=0(root) Kurzablauf openssl passwd -1 ssh @ cfgmtd -f /tmp/system.cfg -r vi /tmp/system.cfg cfgmtd -f /tmp/system.cfg -w reboot Hinweise /tmp/system.cfg ist die Arbeitskopie der Geräte-Konfiguration. cfgmtd -f /tmp/system.cfg -r liest die Config aus dem Flash. cfgmtd -f /tmp/system.cfg -w schreibt die geänderte Config zurück in den Flash. save reicht hierfür nicht zuverlässig aus. Wenn der AP später wieder von einem UniFi Controller provisioniert wird, kann der Controller diese lokalen Änderungen überschreiben. Für mehrere User weitere Slots wie users.3, users.4 usw. verwenden. USW-Pro Switch - SSH Observation Commands cli cli öffnet die eigentliche Switch-CLI, also die FastPath-/Switching-Ebene. Dort arbeitest du mit Dingen wie: show vlan show running-config configure interface 0/1 switchport mode access vlan database write memory Das ist die Cisco-ähnliche Oberfläche für: VLANs Ports Trunks Layer-2/teilweise Layer-3 laufende Switch-Konfiguration Das Problem: Diese CLI verwaltet hauptsächlich den laufenden FastPath-Zustand. write memory meldet zwar Erfolg, aber die UniFi-Firmware baut FastPath beim Start wieder aus /tmp/system.cfg beziehungsweise der von ubntconf erzeugten Startup-Konfiguration auf. Deshalb verschwinden die Änderungen nach einem Reboot. mca-cli-op mca-cli-op gehört zur UniFi-Management-Ebene. Auf deinem Switch ist es nur ein Symlink: /usr/bin/mca-cli-op -> mcad Es startet also das Programm mcad in einem speziellen Betriebsmodus. mcad kümmert sich um Dinge wie: Adoption Controller-Kommunikation Inform-Nachrichten Provisionierung Managementstatus Werksreset Speichern und Laden von UniFi-Konfiguration mgmt.is_default mgmt.is_setup_completed Mit Argumenten wird es normalerweise als interner Einzelbefehl verwendet, zum Beispiel: mca-cli-op inform mca-cli-op set-inform http://controller:8080/inform mca-cli-op set-default Der Firmware-Wrapper ruft solche Befehle selbst auf. set-inform wird beispielsweise direkt an mca-cli-op weitergereicht, während set-default einen Werksreset einleitet. Ohne Argument: mca-cli-op öffnet es die interaktive Management-CLI: UniFi# Das ist keine Linux-Shell und auch nicht dieselbe CLI wie cli. Deshalb kennt sie kein echo, awk, find oder Shell-Pipes. Vereinfacht dargestellt SSH-Shell │ ├── cli │ └── FastPath-Switch-CLI │ ├── VLANs │ ├── Ports │ ├── Trunks │ └── running-config │ └── mca-cli-op / mcad └── UniFi-Management-Stack ├── Adoption ├── Provisionierung ├── Controller/Inform ├── mgmt-Konfiguration └── Default-/Setup-Status swctrl swctrl ist eine interne UniFi-Switch-Control-Utility. Auf dem getesteten USW-Pro-48-US.7.5.6 meldet sie sich als Version 0.9. Sie liest hardwarenahe Switch-Zustände aus und enthält außerdem einige direkt verändernde Funktionen. Sie ist weder die Cisco-ähnliche cli noch die UniFi-Management-CLI mca-cli-op. swctrl arbeitet näher an der laufenden Switch- und Hardware-Ebene. Änderungen sind deshalb nicht automatisch eine dauerhaft vom Controller verwaltete Konfiguration. Aufruf und Optionen swctrl FUNCTION swctrl [OPTIONS] Auf diesem Firmware-Build werden folgende globale Optionen angezeigt: -h zeigt die allgemeine Hilfe. -v aktiviert eine ausführlichere Ausgabe, sofern die aufgerufene Funktion zusätzliche Details bereitstellt. Die Unterbefehle sind nicht vollständig in der allgemeinen Hilfe aufgeführt. Bei vielen Funktionsgruppen zeigt ein Aufruf ohne weiteren Unterbefehl die jeweilige Syntax: swctrl swctrl -h swctrl mac swctrl mac block Funktionsgruppen Die Hilfe von Firmware 7.5.6 nennt diese Funktionsgruppen: port – Portstatus, Linkzustand, Geschwindigkeit, Zähler und modellabhängige Portoperationen. poe – PoE-Status und modellabhängige PoE-Steuerung. Die Funktionsgruppe kann auch auf Geräten ohne PoE im gemeinsamen Firmware-Binary vorhanden sein. env – Umgebungs- und Hardwarewerte, beispielsweise Temperatursensoren und vorhandene Lüfterinformationen. mac – gelernte MAC-/Client-Einträge sowie Block- und eine in der Hilfe genannte white-Funktionsgruppe. sfp – Status und Diagnosedaten vorhandener SFP-/SFP+-Module. led – modellabhängige LED-Funktionen. vlan – interne VLAN-bezogene Abfragen oder Operationen; die genaue Syntax muss mit swctrl vlan auf dem jeweiligen Build geprüft werden. lldp – LLDP-bezogene Status- und Nachbarinformationen. relay – eine auf diesem Build vorhandene, aber durch die allgemeine Hilfe nicht näher erklärte Funktionsgruppe. Bedeutung und Unterbefehle müssen mit swctrl relay geprüft werden. Wichtig: Eine aufgelistete Funktionsgruppe bedeutet nicht automatisch, dass die Hardware sie unterstützt oder dass jeder Unterbefehl auf jedem Switch identisch ist. swctrl ist stark firmware- und modellabhängig. Typische lesende Diagnosebefehle swctrl env show swctrl poe show swctrl sfp show swctrl port show swctrl port show counters swctrl mac show port show, port show counters und mac show eignen sich besonders für Live-Diagnose, weil sie den aktuellen Zustand anzeigen und selbst keine Konfiguration ändern. Hinweis zu poe Der getestete USW-Pro-48 ist die Variante ohne PoE. Trotzdem kann swctrl poe show vorhanden sein, weil dieselbe Utility auf mehreren Switch-Modellen verwendet wird. Eine leere Tabelle oder ein offensichtlich unsinniger Wert wie Total Power Limit(mW): -1091736708 ist kein gültiger Leistungswert und kein verlässlicher Modelltest. Solche Ausgaben müssen als nicht unterstützte, fehlerhafte oder nicht initialisierte PoE-Abfrage behandelt werden. mac swctrl mac bündelt die MAC-/Client-Funktionen der laufenden Switch-Ebene. Auf Firmware 7.5.6 zeigt die Hilfe folgende Bereiche: swctrl mac show [ id PORT_ID ] swctrl mac block swctrl mac white PORT_ID darf einzelne Ports, Bereiche und kombinierte Listen enthalten: 3 5-7 1,4,9-12 mac show swctrl mac show zeigt die vom Switch erfassten MAC-/Client-Einträge über alle Ports. Mit id lässt sich die Ausgabe auf bestimmte Ports begrenzen: swctrl mac show swctrl mac show id 52 swctrl mac show id 5-7 swctrl mac show id 1,4,9-12 Die Ausgabe enthält auf diesem Build folgende Spalten: port – Port, an dem die MAC-Adresse gelernt beziehungsweise dem Client-Eintrag zugeordnet wurde. vlan – VLAN-ID des Eintrags. mac-address – erkannte MAC-Adresse. ip-address – zugeordnete IP-Adresse, sofern sie der Management-Software bekannt ist. hostname – erkannter Hostname, sofern vorhanden. uptime – interner Laufzeitwert des Eintrags. Die Hilfe definiert seine genaue Bedeutung nicht; er sollte nicht ungeprüft als Geräte-Uptime bezeichnet werden. age – interner Alterswert, wahrscheinlich seit der letzten Aktualisierung oder Aktivität. Auch diese Einheit und Semantik wird von der Hilfe nicht erklärt. wireless-type – optionale WLAN-/Client-Klassifizierung; bei rein kabelgebunden erkannten Einträgen bleibt das Feld häufig leer. Da die Ausgabe zusätzlich IP-Adresse, Hostname und WLAN-Metadaten enthalten kann, ist sie mehr als eine rohe Hardware-FDB. Fehlende IP- oder Hostname-Werte bedeuten nicht, dass die MAC-Adresse ungültig ist; die Zusatzinformationen sind schlicht nicht bekannt. Mehrere MAC-Adressen auf demselben Port sind bei einem Uplink, einem nachgeschalteten Switch, einem Access Point, einer Bridge oder einem virtualisierten Host normal. Beim USW-Pro-48 sind neben 48 RJ45-Ports vier SFP+-Ports vorhanden. Ein Eintrag auf Port 52 passt daher zum letzten SFP+-Port; die konkrete Portzuordnung sollte trotzdem mit swctrl port show geprüft werden. mac block mac block verwaltet auf diesem Firmware-Build eine interne Blockliste. Die knappe Unterhilfe zeigt nur show an, tatsächlich wurden aber auch add und remove erfolgreich vom Parser akzeptiert. swctrl mac block show swctrl mac block add 00:87:31:73:1e:e0 swctrl mac block show swctrl mac block remove 00:87:31:73:1e:e0 swctrl mac block show show zeigt die aktuell eingetragenen MAC-Adressen und den zuletzt zugeordneten Port. add MAC fügt die angegebene MAC-Adresse zur internen Blockliste hinzu. remove MAC entfernt die MAC-Adresse wieder aus der Blockliste. lastUpdated ist ein interner Zähler beziehungsweise Zeitwert. Die Ausgabe belegt nicht, dass es sich um einen Unix-Zeitstempel oder eine bestimmte Zeiteinheit handelt. Folgende Varianten sind auf dem getesteten Build nicht gültig: swctrl mac block 00:87:31:73:1e:e0 swctrl mac block del 00:87:31:73:1e:e0 swctrl mac block delete 00:87:31:73:1e:e0 swctrl mac block drop 00:87:31:73:1e:e0 Ein Aufruf wie swctrl mac block add ohne MAC-Adresse kann ohne verständliche Fehlermeldung zurückkehren. Das darf nicht als Erfolg gewertet werden. Nach jeder Änderung sollte die Blockliste erneut mit swctrl mac block show geprüft werden. Der Eintrag in der Blockliste beweist zunächst nur, dass die MAC-Adresse in der laufenden internen Liste steht. Für eine saubere Prüfung der tatsächlichen Sperrwirkung muss der Datenverkehr des betroffenen Clients getestet werden. Ebenso sollte nach einem Reboot und nach einer Controller-Provisionierung geprüft werden, ob der Eintrag erhalten bleibt. mac white swctrl mac white wird von der Hilfe als weitere MAC-Funktionsgruppe genannt. Im vorliegenden Test wurde sie jedoch nicht weiter aufgerufen. Deshalb lässt sich aus den vorhandenen Daten weder die genaue Syntax noch sicher ableiten, ob sie als Whitelist, Ausnahme zur Blockliste oder für einen anderen internen Zweck verwendet wird. Für eine belastbare Dokumentation sollte zuerst nur die Hilfe abgefragt werden: swctrl mac white Sicherheit und Persistenz Eine MAC-Sperre ist keine starke Zugangskontrolle. MAC-Adressen können nachgeahmt werden. Für dauerhafte Sicherheitsregeln sind controllerverwaltete Switch-ACLs, Port-Isolation oder 802.1X geeigneter als eine manuell gesetzte Laufzeitliste. Direkte Änderungen über swctrl sollten grundsätzlich als firmwareabhängige Laufzeitoperationen behandelt werden. Sie können nach Reboot, Firmware-Update oder erneuter Provisionierung verschwinden oder überschrieben werden. Kurzfassung swctrl -h # Live-Diagnose swctrl env show swctrl port show swctrl port show counters swctrl sfp show swctrl mac show swctrl mac show id 52 # Laufende MAC-Blockliste swctrl mac block show swctrl mac block add 00:87:31:73:1e:e0 swctrl mac block remove 00:87:31:73:1e:e0 Damit ist swctrl vor allem ein Werkzeug für hardwarenahe Live-Diagnose. Einige Funktionsgruppen verändern auch den laufenden Zustand, sind aber nicht mit einer dauerhaft vom UniFi-Controller verwalteten Konfiguration gleichzusetzen. VLANs auf Ubiquiti-Switches per SSH konfigurieren BookStack-Anleitung · Version 1.0 · Stand: 30. Juli 2026 · Zielgruppe: Administratoren und Homelab-Betreiber Geltungsbereich Diese Anleitung gilt für Ubiquiti-Switches, die über SSH eine Cisco-artige FastPath-/EdgeSwitch-CLI mit Befehlen wie vlan database, configure, switchport mode access und switchport mode trunk bereitstellen. Sie ist keine Behauptung, dass jeder UniFi-Switch, jede Firmware oder jede Produktfamilie dieselben Befehle unterstützt. Vor Änderungen wird die verfügbare CLI-Hilfe geprüft. Wichtiger Hinweis zu UniFi Network Bei einem durch UniFi Network verwalteten Switch können manuelle SSH-Änderungen bei der nächsten Provisionierung überschrieben werden. Für dauerhaft unterstützte Konfigurationen ist dort der Port Manager beziehungsweise ein Ethernet-Portprofil der vorgesehene Weg. Die SSH-CLI eignet sich vor allem zur Diagnose, für Laborumgebungen und für Geräte, deren lokale CLI und Speichermethode ausdrücklich geprüft wurden. Inhalt 1. Grundlagen 2. VLAN-Planung 3. Vorbereitung und Sicherung 4. SSH und CLI öffnen 5. Mehrere VLANs erstellen 6. Access-Port konfigurieren 7. Trunk-Port konfigurieren 8. Typische Anschlussszenarien 9. Konfiguration prüfen 10. Änderungen speichern 11. Rückbau und Notfallplan 12. Häufige Fehler 13. Entsprechung in UniFi Network 14. Kurzreferenz 15. Quellen 1. Grundlagen Ein VLAN trennt ein physisches Ethernet-Netz logisch in mehrere Layer-2-Netze. Geräte in unterschiedlichen VLANs teilen sich zwar möglicherweise denselben Switch, befinden sich aber in getrennten Broadcast-Domänen. Kommunikation zwischen VLANs benötigt einen Router, eine Firewall oder einen Layer-3-Switch mit passenden Regeln. Begriff Bedeutung VLAN-ID / VID Numerische Kennung eines VLANs. Bei der hier beschriebenen CLI liegt der nutzbare Bereich typischerweise bei 1 bis 4093; VLAN 1 ist meist das Default-VLAN. Untagged / unmarkiert Ein Ethernet-Frame verlässt den Port ohne 802.1Q-VLAN-Tag. Normale Endgeräte erwarten üblicherweise ungetaggte Frames. Tagged / markiert Der Frame trägt ein 802.1Q-Tag mit VLAN-ID. Das Gegenüber muss VLAN-Tags verstehen. Access-Port Transportiert genau ein VLAN ungetaggt. Geeignet für PCs, Drucker, Kameras und andere nicht VLAN-fähige Endgeräte. Trunk-Port Transportiert mehrere VLANs. Ein VLAN kann als Native VLAN ungetaggt übertragen werden; weitere VLANs werden getaggt. Native VLAN / PVID VLAN, dem ungetaggte eingehende Frames zugeordnet werden. Auf einem Trunk ist es üblicherweise zugleich das ungetaggt ausgehende VLAN. Allowed VLANs Liste der VLANs, die über einen Trunk transportiert werden dürfen. Merksatz Access bedeutet: ein VLAN, ungetaggt. Trunk bedeutet: mehrere VLANs, normalerweise ein Native VLAN ungetaggt und weitere VLANs getaggt. 2. VLAN-Planung Vor der ersten Eingabe wird eine Port- und VLAN-Tabelle erstellt. Das Beispiel ist absichtlich generisch: VLAN-ID Name Beispielzweck Gateway/DHCP 10 Management Switches, Access Points, Verwaltungszugänge Auf Router/Firewall konfigurieren 110 Clients Arbeitsplätze und normale Endgeräte Auf Router/Firewall konfigurieren 120 Voice VoIP-Telefone Auf Router/Firewall konfigurieren 130 Guest Gäste oder isolierte Geräte Auf Router/Firewall konfigurieren Beispielhafter Portplan: Port Rolle Native/Untagged Tagged 0/5 Access-Port für Client VLAN 110 keine 0/12 Access-Port für Telefon oder Endgerät VLAN 120 keine 0/24 Access Point VLAN 10 VLAN 110 und 130 0/48 Uplink zu Router oder weiterem Switch VLAN 10 VLAN 110, 120 und 130 Der Switch ersetzt keinen Router Das Anlegen eines VLANs auf dem Switch erzeugt weder ein IP-Subnetz noch DHCP noch Firewallregeln. Router oder Firewall müssen für jedes benötigte VLAN eine passende Schnittstelle beziehungsweise Subinterface besitzen. 3. Vorbereitung und Sicherung 3.1 Notfallzugang vorbereiten Nicht zuerst den Port ändern, über den die aktuelle SSH-Sitzung läuft. Wenn möglich einen zweiten Verwaltungsweg, Konsolenzugang oder einen unveränderten Management-Port bereithalten. Uplink und Management-VLAN erst ändern, nachdem Access- und Trunk-Konzept auf beiden Seiten feststehen. Bei entfernten Standorten eine Rückfallmöglichkeit vor Ort einplanen. Ein falsches Native VLAN ist ein sehr effizienter Weg, sich selbst auszusperren. 3.2 Ist-Zustand dokumentieren Vor Änderungen diese Befehle ausführen und die Ausgabe lokal speichern: show version show network show vlan brief show interfaces status all show running-config Nicht jedes Modell unterstützt jede Anzeige. Ein unbekannter show-Befehl ist kein Anlass, kreativ schreibende Befehle auszuprobieren; stattdessen mit show ? die lokale Hilfe verwenden. 4. SSH und CLI öffnen 4.1 SSH-Verbindung herstellen ssh @ 4.2 Lokale Switch-CLI öffnen Auf vielen UniFi-USW-Firmwares landet man zunächst in einer Linux-Shell: cli enable Auf EdgeSwitch-Systemen kann SSH bereits direkt die Switch-CLI öffnen. Dann ist cli nicht erforderlich. 4.3 Syntax vorab prüfen ? vlan database ? configure interface ? exit Abbruchkriterium Fehlen vlan database, switchport mode access oder switchport mode trunk in der lokalen Hilfe, darf diese Befehlsfolge nicht blind auf das Gerät übertragen werden. Ubiquiti verwendet je nach Produktfamilie unterschiedliche CLIs. 5. Mehrere VLANs erstellen 5.1 VLAN-Datenbank öffnen vlan database 5.2 VLANs einzeln anlegen und benennen vlan 10 vlan name 10 Management vlan 110 vlan name 110 Clients vlan 120 vlan name 120 Voice vlan 130 vlan name 130 Guest exit Einzelne Befehle sind meist kompatibler als eine zusammengefasste VLAN-Liste. Unterstützt die lokale Hilfe Listen, kann alternativ beispielsweise vlan 10,110,120,130 verwendet werden. Namen werden anschließend separat gesetzt. 5.3 VLANs kontrollieren show vlan brief Alle angelegten VLAN-IDs sollten als statische VLANs erscheinen. 6. Access-Port konfigurieren Ein Access-Port ist für ein normales Endgerät gedacht. Eingehende ungetaggte Frames werden dem konfigurierten VLAN zugeordnet; ausgehende Frames verlassen den Port ungetaggt. 6.1 Einzelnen Port auf Access VLAN 110 setzen configure interface 0/5 switchport mode access switchport access vlan 110 exit exit 6.2 Optional eine Beschreibung setzen Wenn die lokale CLI den Befehl anbietet: configure interface 0/5 description Client-Arbeitsplatz exit exit 6.3 Mehrere Access-Ports Die sicherste universelle Methode ist, die Portkonfiguration pro Interface zu wiederholen. Manche Firmwarestände unterstützen Interface-Bereiche, deren Syntax jedoch abweicht. Vor Verwendung eines Bereichs immer interface ? prüfen. configure interface 0/5 switchport mode access switchport access vlan 110 exit interface 0/6 switchport mode access switchport access vlan 110 exit interface 0/7 switchport mode access switchport access vlan 110 exit exit Endgerätetest Ein nicht VLAN-fähiger Client an diesem Port sollte ohne eigene VLAN-Konfiguration eine Adresse aus dem Netz von VLAN 110 erhalten. Bekommt er keine Adresse, fehlen meist DHCP, Gateway-Konfiguration oder ein VLAN auf einem vorgelagerten Trunk. 7. Trunk-Port konfigurieren Ein Trunk verbindet VLAN-fähige Geräte, zum Beispiel einen Router, einen weiteren Managed Switch, einen Hypervisor oder einen Access Point. Beide Seiten des Links müssen dieselbe VLAN-Logik verwenden. 7.1 Trunk mit Native VLAN und mehreren erlaubten VLANs configure interface 0/48 switchport mode trunk switchport trunk native vlan 10 switchport trunk allowed vlan 10,110,120,130 exit exit In diesem Beispiel läuft VLAN 10 als Native VLAN ungetaggt. VLAN 110, 120 und 130 werden getaggt übertragen. Einige Implementierungen zeigen das Native VLAN zusätzlich in der Allowed-Liste, andere behandeln es getrennt. Entscheidend ist die Ausgabe der lokalen Prüfkommandos und eine identische Konfiguration am Gegenport. 7.2 VLAN zu einem bestehenden Trunk hinzufügen configure interface 0/48 switchport trunk allowed vlan add 140 exit exit 7.3 VLAN von einem Trunk entfernen configure interface 0/48 switchport trunk allowed vlan remove 140 exit exit 7.4 Allowed-Liste vollständig ersetzen configure interface 0/48 switchport trunk allowed vlan 10,110,120,130 exit exit add und vollständige Liste nicht verwechseln switchport trunk allowed vlan add ... ergänzt die vorhandene Liste. Der Befehl ohne add kann die bisherige Liste ersetzen. Vorher show interfaces switchport trunk prüfen, sonst verschwinden VLANs mit beeindruckender Effizienz. 8. Typische Anschlussszenarien 8.1 Arbeitsplatz, Drucker, Kamera oder Server Das Endgerät versteht keine VLAN-Tags und gehört genau einem VLAN: configure interface 0/5 switchport mode access switchport access vlan 110 exit exit 8.2 Access Point mit Management- und SSID-VLANs Das Management des Access Points läuft ungetaggt in VLAN 10. Zwei SSIDs verwenden VLAN 110 und VLAN 130 getaggt: configure interface 0/24 switchport mode trunk switchport trunk native vlan 10 switchport trunk allowed vlan 10,110,130 exit exit Access-Point-Falle Das VLAN einer getaggten SSID sollte am direkten AP-Uplink nicht gleichzeitig als Native VLAN konfiguriert werden. Außerdem muss jedes SSID-VLAN auf allen Trunks zwischen AP und Gateway erlaubt sein. 8.3 Uplink zu einem Router oder einer Firewall configure interface 0/48 switchport mode trunk switchport trunk native vlan 10 switchport trunk allowed vlan 10,110,120,130 exit exit Auf dem Router beziehungsweise der Firewall werden dazu passende VLAN-Interfaces benötigt, beispielsweise: VLAN Routerfunktion 10 Management-Gateway und optional DHCP 110 Client-Gateway, DHCP und Firewallregeln 120 Voice-Gateway, DHCP-Optionen und QoS nach Bedarf 130 Gast-Gateway, DHCP und restriktive Firewallregeln 8.4 Uplink zwischen zwei Switches Beide Enden müssen dieselbe Native-VLAN- und Allowed-VLAN-Konfiguration besitzen: configure interface 0/48 switchport mode trunk switchport trunk native vlan 10 switchport trunk allowed vlan 10,110,120,130 exit exit Native-VLAN-Mismatch Wenn eine Seite VLAN 10 ungetaggt erwartet und die andere Seite ungetaggte Frames einem anderen VLAN zuordnet, entstehen schwer erkennbare Verbindungs- und Sicherheitsprobleme. Native VLANs müssen an beiden Enden übereinstimmen. 8.5 Hypervisor oder VLAN-fähiger Server Ein Hypervisor kann mehrere virtuelle Netze über einen Trunk empfangen. Das Management-VLAN kann nativ oder ebenfalls getaggt sein, abhängig von der Serverkonfiguration. Die Switch- und Hostkonfiguration müssen exakt zusammenpassen. configure interface 0/20 switchport mode trunk switchport trunk native vlan 10 switchport trunk allowed vlan 10,110,120,130 exit exit 9. Konfiguration prüfen 9.1 VLAN-Inventar show vlan brief 9.2 Access-Port prüfen show interfaces switchport access 0/5 show vlan port 0/5 show running-config interface 0/5 9.3 Trunk-Port prüfen show interfaces switchport trunk 0/48 show vlan port 0/48 show running-config interface 0/48 9.4 Linkstatus kontrollieren show interfaces status all 9.5 Praktische Funktionstests Endgerät am Access-Port anschließen. Prüfen, ob es eine IP-Adresse aus dem vorgesehenen VLAN erhält. Gateway des VLANs anpingen. DNS und erforderliche Dienste testen. Bei Trunks jedes VLAN einzeln über ein geeignetes Testgerät oder eine VLAN-fähige Schnittstelle prüfen. Firewallregeln zwischen VLANs testen, nicht nur die reine Erreichbarkeit. Erfolgskriterien Der Access-Client erhält das richtige Subnetz, der Trunk transportiert nur die vorgesehenen VLANs, das Management bleibt erreichbar und unerwünschte Inter-VLAN-Kommunikation wird durch Router oder Firewall blockiert. 10. Änderungen speichern 10.1 EdgeSwitch-/UISP-CLI Wenn die lokale Hilfe den Befehl ausweist, kann die Running-Config in den Startup-Speicher geschrieben werden: write memory Alternativ auf entsprechenden EdgeSwitch-Systemen: copy system:running-config nvram:startup-config 10.2 UniFi-USW-Geräte Keine universelle SSH-Persistenz Bei UniFi-USW-Modellen ist die lokale FastPath-Konfiguration je nach Firmware möglicherweise nur laufzeitwirksam, wird bei einem Neustart verworfen oder durch UniFi Network überschrieben. Ein hersteller- und firmwareübergreifend sicherer SSH-Befehl zum dauerhaften Speichern existiert für diese Produktgruppe nicht. Darum gilt: write memory ? beziehungsweise copy ? zuerst prüfen. Keine undokumentierten Flash-, cfgmtd- oder Dateisystembefehle aus fremden Anleitungen übernehmen. Nach einem geplanten Neustart alle VLANs und Ports erneut kontrollieren. Bei controllerverwalteten UniFi-Switches die dauerhafte Konfiguration in UniFi Network nachbauen. 11. Rückbau und Notfallplan 11.1 Access-Port zurück auf VLAN 1 configure interface 0/5 switchport mode access switchport access vlan 1 exit exit 11.2 Tagged VLAN aus einem Trunk entfernen configure interface 0/48 switchport trunk allowed vlan remove 130 exit exit 11.3 Trunk-Liste auf einen bekannten Stand setzen configure interface 0/48 switchport mode trunk switchport trunk native vlan 10 switchport trunk allowed vlan 10,110,120 exit exit 11.4 Management verloren Lokalen Konsolen- oder Ersatzport verwenden. Portplan und zuletzt geänderten Uplink kontrollieren. Native VLAN beider Linkseiten vergleichen. Prüfen, ob das Management-VLAN auf jedem vorgelagerten Trunk erlaubt ist. Switch-IP, Gateway und DHCP beziehungsweise statische IP-Konfiguration kontrollieren. Erst als letzte Maßnahme einen Factory Reset erwägen. 12. Häufige Fehler Symptom Wahrscheinliche Ursache Prüfung Access-Client erhält keine IP-Adresse VLAN fehlt auf Uplink, DHCP fehlt oder Access-VLAN ist falsch show vlan brief , Access-Port und alle Trunks bis zum Gateway prüfen Ein VLAN funktioniert, andere nicht Allowed-VLAN-Liste auf einem Trunk ist unvollständig Jeden Port entlang des Pfades prüfen Switch nach Änderung nicht mehr erreichbar Management-VLAN oder Native VLAN falsch, Gateway/IP nicht passend Konsole oder unveränderten Port verwenden AP ist erreichbar, WLAN-Clients bekommen keine Adresse SSID-VLAN nicht getaggt erlaubt oder fälschlich als Native VLAN gesetzt AP-Uplink und alle vorgelagerten Trunks prüfen Änderungen verschwinden nach Neustart Running-Config nicht gespeichert oder UniFi hat neu provisioniert Startup-/Persistenzmethode des konkreten Modells prüfen Unerwartete Kommunikation zwischen VLANs Router-/Firewallregeln erlauben Inter-VLAN-Verkehr Routing- und Firewallregeln prüfen; VLAN allein ist keine Firewall Nur ungetaggter Verkehr funktioniert Gegenstelle ist nicht VLAN-fähig oder Tags stimmen nicht überein VLAN-Konfiguration auf beiden Linkseiten vergleichen Broadcast-Sturm oder instabiles Netz Switching-Schleife oder falscher redundanter Link STP/RSTP aktiv lassen und Topologie kontrollieren 13. Entsprechung in UniFi Network In aktuellen UniFi-Network-Oberflächen wird dieselbe Logik mit den Begriffen Native VLAN / Network und Tagged VLAN Management abgebildet: SSH-/Switchbegriff UniFi-Network-Einstellung Access-Port, VLAN 110 Native VLAN / Network: VLAN 110; Tagged VLAN Management: Block All Trunk mit allen VLANs Native VLAN auswählen; Tagged VLAN Management: Allow All Trunk mit ausgewählten VLANs Native VLAN auswählen; Tagged VLAN Management: Custom und gewünschte VLANs freigeben switchport trunk native vlan 10 Native VLAN / Network: VLAN 10 switchport trunk allowed vlan ... Tagged VLAN Management: Custom 14. Kurzreferenz VLANs anlegen vlan database vlan 110 vlan name 110 Clients vlan 130 vlan name 130 Guest exit Access-Port configure interface 0/5 switchport mode access switchport access vlan 110 exit exit Trunk-Port configure interface 0/48 switchport mode trunk switchport trunk native vlan 10 switchport trunk allowed vlan 10,110,120,130 exit exit VLAN ergänzen oder entfernen configure interface 0/48 switchport trunk allowed vlan add 140 switchport trunk allowed vlan remove 130 exit exit Prüfen show vlan brief show interfaces switchport access 0/5 show interfaces switchport trunk 0/48 show vlan port all show running-config Speichern, nur wenn unterstützt write memory 15. Quellen und weiterführende Dokumentation Ubiquiti Help Center: Switch Port VLAN Assignment (Trunk & Access Ports) Ubiquiti Help Center: Creating Virtual Networks (VLANs) Ubiquiti Help Center: Virtual Network (VLAN) Troubleshooting Ubiquiti Help Center: UniFi Switch Settings UISP Help Center: EdgeSwitch CLI Reference Guide Diese Anleitung beschreibt allgemeine Netzwerkkonzepte und eine CLI-Familie. Vor produktiven Änderungen immer Modell, Firmware, lokale CLI-Hilfe, Sicherungsweg und Wiederherstellungsplan prüfen. SSH - poe show USW-Pro-48-PoE-US.7.4.1# swctrl poe show Total Power Limit(mW): -1092015236 Port OpMode HpMode PwrLimit Class PoEPwr PwrGood Power(W) Voltage(V) Current(mA) (mW) ---- ------ ------------ -------- ------- ------ ------- -------- ---------- ----------- 1 Auto Dot3at -1 Class 0 On Good 8.20 53.25 154.00 2 Auto Dot3at -1 Class 0 On Good 4.00 52.63 76.00 3 Auto Dot3at -1 Class 0 On Good 6.10 53.98 113.00 4 Auto Dot3at -1 Class 0 On Good 3.90 53.42 73.00 5 Auto Dot3at -1 Class 4 On Good 4.90 53.85 91.00 6 Auto Dot3at -1 Class 4 On Good 5.00 53.76 93.00 7 Auto Dot3at -1 Class 0 On Good 2.00 52.63 38.00 8 Auto Dot3at -1 Class 0 On Good 2.10 52.50 40.00 9 Auto Dot3at -1 Class 0 On Good 1.90 52.78 36.00 10 Auto Dot3at -1 Class 0 On Good 1.80 52.94 34.00 11 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 12 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 13 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 14 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 15 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 16 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 17 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 18 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 19 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 20 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 21 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 22 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 23 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 24 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 25 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 26 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 27 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 28 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 29 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 30 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 31 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 32 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 33 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 34 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 35 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 36 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 37 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 38 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 39 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 40 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 41 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 42 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 43 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 44 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 45 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 46 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 47 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 48 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 USW-Pro-48-PoE-US.7.4.1# swctrl poe show | awk ' > { > print > if ($0 ~ /\(mW\):/) { > key=$0 > sub(/:.*/, "", key) > > value=$0 > sub(/^.*:[[:space:]]*/, "", value) > sub(/[[:space:]].*$/, "", value) > > if (value ~ /^-?[0-9]+$/) { > printf " -> %-30s %.2f W\n", key, value / 1000 > } > } > } > ' Total Power Limit(mW): -1097720964 -> Total Power Limit(mW) -1097720.96 W Port OpMode HpMode PwrLimit Class PoEPwr PwrGood Power(W) Voltage(V) Current(mA) (mW) ---- ------ ------------ -------- ------- ------ ------- -------- ---------- ----------- 1 Auto Dot3at -1 Class 0 On Good 8.20 53.25 154.00 2 Auto Dot3at -1 Class 0 On Good 4.00 52.63 76.00 3 Auto Dot3at -1 Class 0 On Good 6.10 53.98 113.00 4 Auto Dot3at -1 Class 0 On Good 3.90 53.42 73.00 5 Auto Dot3at -1 Class 4 On Good 4.90 53.85 91.00 6 Auto Dot3at -1 Class 4 On Good 5.00 53.76 93.00 7 Auto Dot3at -1 Class 0 On Good 2.00 52.63 38.00 8 Auto Dot3at -1 Class 0 On Good 2.10 52.50 40.00 9 Auto Dot3at -1 Class 0 On Good 1.90 52.78 36.00 10 Auto Dot3at -1 Class 0 On Good 1.80 52.94 34.00 11 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 12 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 13 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 14 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 15 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 16 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 17 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 18 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 19 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 20 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 21 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 22 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 23 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 24 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 25 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 26 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 27 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 28 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 29 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 30 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 31 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 32 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 33 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 34 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 35 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 36 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 37 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 38 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 39 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 40 Auto Dot3at -1 Unknown Off Bad 0.00 0.00 0.00 41 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 42 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 43 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 44 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 45 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 46 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 47 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 48 Auto Dot3bt-type3 -1 Unknown Off Bad 0.00 0.00 0.00 USW-Pro-48-PoE-US.7.4.1# SSH - Port Counter USW-Pro-48-PoE-US.7.4.1# swctrl port show counters id 1 Port: 1 -----------------------------------------------|---------------------------------------------- TX Total (Octets): 192034083002 |RX Total (Octets): 8120471529 TX 64 Octets: 57521 |RX 64 Octets: 85385 TX 65-127 Octets: 3071491 |RX 65-127 Octets: 7353855 TX 128-255 Octets: 1150313 |RX 128-255 Octets: 1833097 TX 256-511 Octets: 159020 |RX 256-511 Octets: 920988 TX 512-1023 Octets: 815981 |RX 512-1023 Octets: 238439 TX 1024-1518 Octets: 125794292 |RX 1024-1518 Octets: 4389299 TX over 1518 Octets: 0 |RX over 1518 Octets: 0 TX Pkt Successfully: 131048618 |RX Pkt Successfully: 14821063 TX Ucast Pkts: 130982906 |RX Ucast Pkts: 14755156 TX Mcast Pkts: 17865 |RX Mcast Pkts: 19921 TX Bcast Pkts: 47847 |RX Bcast Pkts: 45986 TX Pkt Discard: 0 |RX Pkt Discard: 0 TX Total Error: 0 |RX Total Error (MAC): 0 TX FCS Error: 0 |RX FCS Error: 0 TX Underrun Errors: 0 |RX Jabbers Received: 0 TX Total Collision: 0 |RX Fragments Received: 0 TX Single Collision Frames: 0 |RX Undersize Received: 0 TX Multiple Collision Pkts: 0 |RX Alignment Errors: 0 TX Excessive Collision Pkts: 0 |RX Overruns: 0 TX Pause Pkts: 0 |RX Pause Pkts: 0 TX STP BPDUs: 0 |RX STP BPDUs: 0 TX RSTP BPDUs: 4804 |RX RSTP BPDUs: 0 TX MSTP BPDUs: 0 |RX MSTP BPDUs: 0 USW-Pro-48-PoE-US.7.4.1# swctrl port show counters id 2 Port: 2 -----------------------------------------------|---------------------------------------------- TX Total (Octets): 373976202 |RX Total (Octets): 10811084 TX 64 Octets: 53389 |RX 64 Octets: 3688 TX 65-127 Octets: 16653 |RX 65-127 Octets: 14892 TX 128-255 Octets: 14480 |RX 128-255 Octets: 8046 TX 256-511 Octets: 13316 |RX 256-511 Octets: 1511 TX 512-1023 Octets: 4162 |RX 512-1023 Octets: 1118 TX 1024-1518 Octets: 269310 |RX 1024-1518 Octets: 4730 TX over 1518 Octets: 0 |RX over 1518 Octets: 0 TX Pkt Successfully: 371310 |RX Pkt Successfully: 33985 TX Ucast Pkts: 283249 |RX Ucast Pkts: 29699 TX Mcast Pkts: 32530 |RX Mcast Pkts: 2549 TX Bcast Pkts: 55531 |RX Bcast Pkts: 1737 TX Pkt Discard: 0 |RX Pkt Discard: 0 TX Total Error: 0 |RX Total Error (MAC): 0 TX FCS Error: 0 |RX FCS Error: 0 TX Underrun Errors: 0 |RX Jabbers Received: 0 TX Total Collision: 0 |RX Fragments Received: 0 TX Single Collision Frames: 0 |RX Undersize Received: 0 TX Multiple Collision Pkts: 0 |RX Alignment Errors: 0 TX Excessive Collision Pkts: 0 |RX Overruns: 0 TX Pause Pkts: 0 |RX Pause Pkts: 0 TX STP BPDUs: 0 |RX STP BPDUs: 0 TX RSTP BPDUs: 4808 |RX RSTP BPDUs: 0 TX MSTP BPDUs: 0 |RX MSTP BPDUs: 0 USW-Pro-48-PoE-US.7.4.1# Alle Interfaces: for PORT in $(seq 1 52); do swctrl port show counters id "$PORT" | awk -v port="$PORT" ' function human(bytes) { if (bytes >= 1000000000) return sprintf("%.3f GB", bytes / 1000000000) if (bytes >= 1000000) return sprintf("%.2f MB", bytes / 1000000) if (bytes >= 1000) return sprintf("%.2f KB", bytes / 1000) return sprintf("%.0f B", bytes) } BEGIN { found = 0 } { count = split($0, entries, /\|/) for (i = 1; i <= count; i++) { entry = entries[i] if (entry !~ /:/) continue key = entry sub(/:.*/, "", key) gsub(/^[[:space:]]+|[[:space:]]+$/, "", key) value = entry sub(/^[^:]*:[[:space:]]*/, "", value) sub(/[[:space:]].*$/, "", value) lower_key = tolower(key) if (lower_key ~ /(byte|octet)/ && value ~ /^[0-9]+$/) { if (!found) { printf "\nInterface 0/%s\n", port found = 1 } printf " %-30s %s\n", key, human(value) } } } ' done USW-Pro-48-PoE-US.7.4.1# for PORT in $(seq 1 52); do > swctrl port show counters id "$PORT" | awk -v port="$PORT" ' > function human(bytes) { > if (bytes >= 1000000000) > return sprintf("%.3f GB", bytes / 1000000000) > if (bytes >= 1000000) > return sprintf("%.2f MB", bytes / 1000000) > if (bytes >= 1000) > return sprintf("%.2f KB", bytes / 1000) > return sprintf("%.0f B", bytes) > } > > BEGIN { > found = 0 > } > > { > count = split($0, entries, /\|/) > > for (i = 1; i <= count; i++) { > entry = entries[i] > > if (entry !~ /:/) > continue > > key = entry > sub(/:.*/, "", key) > gsub(/^[[:space:]]+|[[:space:]]+$/, "", key) > > value = entry > sub(/^[^:]*:[[:space:]]*/, "", value) > sub(/[[:space:]].*$/, "", value) > > lower_key = tolower(key) > > if (lower_key ~ /(byte|octet)/ && value ~ /^[0-9]+$/) { > if (!found) { > printf "\nInterface 0/%s\n", port > found = 1 > } > > printf " %-30s %s\n", key, human(value) > } > } > } > ' > done Interface 0/1 TX Total (Octets) 193.627 GB RX Total (Octets) 8.132 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.003 GB RX 65-127 Octets 0.007 GB TX 128-255 Octets 0.001 GB RX 128-255 Octets 0.002 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.001 GB TX 512-1023 Octets 0.001 GB RX 512-1023 Octets 0.000 GB TX 1024-1518 Octets 0.127 GB RX 1024-1518 Octets 0.004 GB TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/2 TX Total (Octets) 0.374 GB RX Total (Octets) 0.011 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0.000 GB TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0.000 GB TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/3 TX Total (Octets) 0.011 GB RX Total (Octets) 0.004 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0.000 GB TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0.000 GB TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/4 TX Total (Octets) 0.057 GB RX Total (Octets) 0.006 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0.000 GB TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0.000 GB TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/5 TX Total (Octets) 0.010 GB RX Total (Octets) 0.000 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 1 B TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0 B TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/6 TX Total (Octets) 0.011 GB RX Total (Octets) 0.002 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0.000 GB TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0.000 GB TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/7 TX Total (Octets) 0.010 GB RX Total (Octets) 0.001 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0 B TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/8 TX Total (Octets) 0.010 GB RX Total (Octets) 0.001 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0 B TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/9 TX Total (Octets) 0.010 GB RX Total (Octets) 0.001 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0 B TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/10 TX Total (Octets) 0.010 GB RX Total (Octets) 0.001 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.000 GB RX 65-127 Octets 0.000 GB TX 128-255 Octets 0.000 GB RX 128-255 Octets 0.000 GB TX 256-511 Octets 0.000 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0 B TX 1024-1518 Octets 0.000 GB RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/11 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/12 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/13 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/14 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/15 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/16 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/17 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/18 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/19 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/20 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/21 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/22 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/23 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B c Interface 0/24 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/25 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/26 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/27 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/28 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/29 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/30 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/31 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/32 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/33 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/34 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/35 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/36 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/37 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/38 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/39 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/40 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/41 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/42 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/43 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/44 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/45 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/46 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/47 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/48 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/49 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/50 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/51 TX Total (Octets) 0 B RX Total (Octets) 0 B TX 64 Octets 0 B RX 64 Octets 0 B TX 65-127 Octets 0 B RX 65-127 Octets 0 B TX 128-255 Octets 0 B RX 128-255 Octets 0 B TX 256-511 Octets 0 B RX 256-511 Octets 0 B TX 512-1023 Octets 0 B RX 512-1023 Octets 0 B TX 1024-1518 Octets 0 B RX 1024-1518 Octets 0 B TX over 1518 Octets 0 B RX over 1518 Octets 0 B Interface 0/52 TX Total (Octets) 8.151 GB RX Total (Octets) 194.560 GB TX 64 Octets 0.000 GB RX 64 Octets 0.000 GB TX 65-127 Octets 0.007 GB RX 65-127 Octets 0.003 GB TX 128-255 Octets 0.002 GB RX 128-255 Octets 0.001 GB TX 256-511 Octets 0.001 GB RX 256-511 Octets 0.000 GB TX 512-1023 Octets 0.000 GB RX 512-1023 Octets 0.001 GB TX 1024-1518 Octets 0.004 GB RX 1024-1518 Octets 0.127 GB TX over 1518 Octets 0.004 GB RX over 1518 Octets 0 B USW-Pro-48-PoE-US.7.4.1# UDM - Firewall Ubiquity UDM - Geräte sperren Client-Quarantäne auf dem UniFi Gateway Die Client-Quarantäne dient dazu, einen verdächtigen oder kompromittierten Netzwerk-Client im Ernstfall innerhalb weniger Sekunden über SSH zu sperren. Der Client wird anhand seiner MAC-Adresse identifiziert, sodass ein Wechsel der IPv4-Adresse die Sperre nicht umgeht. Der Hauptgrund für diese Lösung ist, dass unsere Client-Netzwerke teilweise Zugriff auf viele andere Netzwerkzonen besitzen. Im Sicherheitsvorfall wäre es zu langsam und fehleranfällig, für jede einzelne Zone manuell eine Firewallregel anzulegen. Stattdessen wird die Quarantäne direkt vor den regulären UniFi-Firewallregeln eingehängt. Dabei werden IPv4, IPv6 und über das Gateway laufender Netzwerkverkehr des betroffenen Clients blockiert. Bestehende Verbindungen werden zusätzlich aus Conntrack entfernt. Wichtig: Verkehr zwischen zwei Geräten innerhalb desselben VLANs kann unter Umständen direkt über einen Switch oder Access Point laufen und das Gateway gar nicht erreichen. Bei einem besonders kritischen Sicherheitsvorfall sollte daher zusätzlich der Switch-Port deaktiviert oder der WLAN-Client isoliert werden. Hinweis: Die hier verwendeten Regeln werden direkt per SSH verwaltet und liegen außerhalb der normalen UniFi-Konfiguration. Nach Firmware-Updates, Neustarts oder einer Neu-Provisionierung sollte der Status der Quarantäne geprüft und gegebenenfalls mit quarantine-client apply erneut angewendet werden. Installation Installation Die Installation erfolgt als root direkt per SSH auf dem UniFi Gateway. Das Skript und seine Konfiguration werden unter /persistent/client-quarantine gespeichert. Der folgende Block installiert das komplette Quarantäne-Werkzeug: install -d -m 700 -o root -g root /persistent/client-quarantine cat > /persistent/client-quarantine/quarantine-client <<'QUARANTINE_SCRIPT' #!/bin/bash set -Eeuo pipefail PATH='/usr/sbin:/usr/bin:/sbin:/bin' umask 077 readonly BASE_DIR='/persistent/client-quarantine' readonly STATE_FILE="${BASE_DIR}/blocked-macs" readonly LOCK_FILE="${BASE_DIR}/lock" readonly IPT4_CHAIN='QRTN_MAC_V4' readonly IPT6_CHAIN='QRTN_MAC_V6' readonly EBT_BR_CHAIN='QRTN_MAC_BR' readonly EBT_IN_CHAIN='QRTN_MAC_IN' readonly EBT_FWD_CHAIN='QRTN_MAC_FWD' readonly EBT_OUT_CHAIN='QRTN_MAC_OUT' die() { printf 'Fehler: %s\n' "$*" >&2 exit 1 } log_message() { logger -t client-quarantine -- "$*" 2>/dev/null || true printf '%s\n' "$*" } require_root() { [ "${EUID}" -eq 0 ] || die 'Dieses Werkzeug muss als root ausgeführt werden.' } require_commands() { local command_name for command_name in \ awk sort mktemp install ip \ iptables ip6tables ebtables \ conntrack logger flock do command -v "${command_name}" >/dev/null 2>&1 || die "Benötigter Befehl fehlt: ${command_name}" done } prepare_storage() { install -d -m 700 -o root -g root "${BASE_DIR}" touch "${STATE_FILE}" "${LOCK_FILE}" chown root:root "${STATE_FILE}" "${LOCK_FILE}" chmod 600 "${STATE_FILE}" "${LOCK_FILE}" } normalize_mac() { local mac="${1,,}" [[ "${mac}" =~ ^([0-9a-f]{2}:){5}[0-9a-f]{2}$ ]] || die 'Ungültige MAC-Adresse. Erwartet wird aa:bb:cc:dd:ee:ff.' [ "${mac}" != '00:00:00:00:00:00' ] || die 'Die Null-MAC ist nicht zulässig.' [ "${mac}" != 'ff:ff:ff:ff:ff:ff' ] || die 'Die Broadcast-MAC ist nicht zulässig.' local first_octet="${mac%%:*}" (( (16#${first_octet} & 1) == 0 )) || die 'Multicast-MAC-Adressen sind nicht zulässig.' printf '%s\n' "${mac}" } reject_gateway_mac() { local target="$1" local address_file local local_mac for address_file in /sys/class/net/*/address; do [ -r "${address_file}" ] || continue IFS= read -r local_mac < "${address_file}" || true local_mac="${local_mac,,}" [ "${target}" != "${local_mac}" ] || die "Abbruch: ${target} gehört zu einer Gateway-Schnittstelle." done } get_ssh_peer_mac() { [ -n "${SSH_CONNECTION:-}" ] || return 0 local peer_ip="${SSH_CONNECTION%% *}" ip neigh show to "${peer_ip}" 2>/dev/null | awk ' { for (i = 1; i <= NF; i++) { if ($i == "lladdr") { print tolower($(i + 1)) exit } } } ' } reject_current_ssh_peer() { local target="$1" local peer_mac peer_mac="$(get_ssh_peer_mac || true)" if [ -n "${peer_mac}" ] && [ "${target}" = "${peer_mac}" ]; then die 'Diese MAC gehört zum aktuellen SSH-Gegenüber. Verwende add --force nur bei bewusstem Verbindungsabbruch.' fi } read_macs() { awk ' /^[[:space:]]*$/ { next } { print tolower($1) } ' "${STATE_FILE}" | sort -u } add_to_state() { local mac="$1" local temporary_file temporary_file="$(mktemp "${BASE_DIR}/blocked-macs.XXXXXX")" { read_macs printf '%s\n' "${mac}" } | sort -u > "${temporary_file}" chown root:root "${temporary_file}" chmod 600 "${temporary_file}" mv -f "${temporary_file}" "${STATE_FILE}" } remove_from_state() { local mac="$1" local temporary_file temporary_file="$(mktemp "${BASE_DIR}/blocked-macs.XXXXXX")" awk -v remove_mac="${mac}" ' NF && tolower($1) != remove_mac { print tolower($1) } ' "${STATE_FILE}" | sort -u > "${temporary_file}" chown root:root "${temporary_file}" chmod 600 "${temporary_file}" mv -f "${temporary_file}" "${STATE_FILE}" } prepare_iptables_chain() { local binary="$1" local custom_chain="$2" "${binary}" -w 5 -t mangle -N "${custom_chain}" 2>/dev/null || true "${binary}" -w 5 -t mangle -F "${custom_chain}" while "${binary}" \ -w 5 \ -t mangle \ -C PREROUTING \ -j "${custom_chain}" \ 2>/dev/null do "${binary}" \ -w 5 \ -t mangle \ -D PREROUTING \ -j "${custom_chain}" done "${binary}" \ -w 5 \ -t mangle \ -I PREROUTING 1 \ -j "${custom_chain}" } prepare_ebtables_chain() { local table="$1" local builtin_chain="$2" local custom_chain="$3" ebtables \ -t "${table}" \ -N "${custom_chain}" \ 2>/dev/null || true ebtables \ -t "${table}" \ -F "${custom_chain}" while ebtables \ -t "${table}" \ -D "${builtin_chain}" \ -j "${custom_chain}" \ 2>/dev/null do : done ebtables \ -t "${table}" \ -I "${builtin_chain}" 1 \ -j "${custom_chain}" } apply_rules() { local mac prepare_iptables_chain iptables "${IPT4_CHAIN}" prepare_iptables_chain ip6tables "${IPT6_CHAIN}" prepare_ebtables_chain \ broute \ BROUTING \ "${EBT_BR_CHAIN}" prepare_ebtables_chain \ filter \ INPUT \ "${EBT_IN_CHAIN}" prepare_ebtables_chain \ filter \ FORWARD \ "${EBT_FWD_CHAIN}" prepare_ebtables_chain \ filter \ OUTPUT \ "${EBT_OUT_CHAIN}" while IFS= read -r mac; do [ -n "${mac}" ] || continue iptables \ -w 5 \ -t mangle \ -A "${IPT4_CHAIN}" \ -m mac \ --mac-source "${mac}" \ -j DROP ip6tables \ -w 5 \ -t mangle \ -A "${IPT6_CHAIN}" \ -m mac \ --mac-source "${mac}" \ -j DROP ebtables \ -t broute \ -A "${EBT_BR_CHAIN}" \ -s "${mac}" \ -j RETURN ebtables \ -t filter \ -A "${EBT_IN_CHAIN}" \ -s "${mac}" \ -j DROP ebtables \ -t filter \ -A "${EBT_FWD_CHAIN}" \ -s "${mac}" \ -j DROP ebtables \ -t filter \ -A "${EBT_FWD_CHAIN}" \ -d "${mac}" \ -j DROP ebtables \ -t filter \ -A "${EBT_OUT_CHAIN}" \ -d "${mac}" \ -j DROP done < <(read_macs) } known_addresses_for_mac() { local family="$1" local mac="$2" ip "-${family}" -o neigh show 2>/dev/null | awk -v mac="${mac}" ' { for (i = 1; i <= NF; i++) { if ($i == "lladdr" && tolower($(i + 1)) == mac) { print $1 break } } } ' | sort -u } clear_conntrack_for_mac() { local mac="$1" local address while IFS= read -r address; do [ -n "${address}" ] || continue conntrack \ -D \ -f ipv4 \ -s "${address}" \ >/dev/null 2>&1 || true conntrack \ -D \ -f ipv4 \ -d "${address}" \ >/dev/null 2>&1 || true done < <(known_addresses_for_mac 4 "${mac}") while IFS= read -r address; do [ -n "${address}" ] || continue conntrack \ -D \ -f ipv6 \ -s "${address}" \ >/dev/null 2>&1 || true conntrack \ -D \ -f ipv6 \ -d "${address}" \ >/dev/null 2>&1 || true done < <(known_addresses_for_mac 6 "${mac}") } command_add() { local force=0 local mac if [ "${1:-}" = '--force' ]; then force=1 shift fi [ "$#" -eq 1 ] || die 'Verwendung: quarantine-client add [--force] MAC' mac="$(normalize_mac "$1")" reject_gateway_mac "${mac}" if [ "${force}" -eq 0 ]; then reject_current_ssh_peer "${mac}" fi add_to_state "${mac}" apply_rules clear_conntrack_for_mac "${mac}" log_message "Client ${mac} wurde quarantänisiert." } command_remove() { local mac [ "$#" -eq 1 ] || die 'Verwendung: quarantine-client remove MAC' mac="$(normalize_mac "$1")" remove_from_state "${mac}" apply_rules log_message "Quarantäne für ${mac} wurde aufgehoben." } command_apply() { [ "$#" -eq 0 ] || die 'Verwendung: quarantine-client apply' apply_rules log_message 'Gespeicherte Quarantäne-Regeln wurden angewendet.' } command_list() { [ "$#" -eq 0 ] || die 'Verwendung: quarantine-client list' if [ ! -s "${STATE_FILE}" ]; then printf 'Keine Clients in Quarantäne.\n' return fi read_macs } command_status() { [ "$#" -eq 0 ] || die 'Verwendung: quarantine-client status' printf 'Gespeicherte MAC-Adressen:\n' command_list printf '\nIPv4-Hook:\n' iptables -w 5 -t mangle -S PREROUTING | awk -v chain="${IPT4_CHAIN}" '$0 ~ chain' printf '\nIPv6-Hook:\n' ip6tables -w 5 -t mangle -S PREROUTING | awk -v chain="${IPT6_CHAIN}" '$0 ~ chain' printf '\nBridge-Hooks:\n' ebtables -t broute -L BROUTING 2>/dev/null | awk -v chain="${EBT_BR_CHAIN}" '$0 ~ chain' ebtables -t filter -L INPUT 2>/dev/null | awk -v chain="${EBT_IN_CHAIN}" '$0 ~ chain' ebtables -t filter -L FORWARD 2>/dev/null | awk -v chain="${EBT_FWD_CHAIN}" '$0 ~ chain' ebtables -t filter -L OUTPUT 2>/dev/null | awk -v chain="${EBT_OUT_CHAIN}" '$0 ~ chain' } command_self_test() { [ "$#" -eq 0 ] || die 'Verwendung: quarantine-client self-test' normalize_mac '02:00:00:00:00:01' >/dev/null printf 'Selbsttest erfolgreich. Es wurde kein Client gesperrt.\n' } show_usage() { cat <<'USAGE' Verwendung: quarantine-client add [--force] MAC quarantine-client remove MAC quarantine-client list quarantine-client apply quarantine-client status quarantine-client self-test USAGE } main() { require_root require_commands prepare_storage exec 9>"${LOCK_FILE}" flock -x 9 local action="${1:-}" if [ "$#" -gt 0 ]; then shift fi case "${action}" in add) command_add "$@" ;; remove) command_remove "$@" ;; apply) command_apply "$@" ;; list) command_list "$@" ;; status) command_status "$@" ;; self-test) command_self_test "$@" ;; help|-h|--help|'') show_usage ;; *) die "Unbekannte Aktion: ${action}" ;; esac } main "$@" QUARANTINE_SCRIPT chown root:root /persistent/client-quarantine/quarantine-client chmod 700 /persistent/client-quarantine/quarantine-client ln -sfn \ /persistent/client-quarantine/quarantine-client \ /usr/local/sbin/quarantine-client Syntax prüfen bash -n /persistent/client-quarantine/quarantine-client && echo "Syntax OK" Erwartete Ausgabe: Syntax OK Selbsttest durchführen quarantine-client self-test quarantine-client list Erwartete Ausgabe: Selbsttest erfolgreich. Es wurde kein Client gesperrt. Keine Clients in Quarantäne. Damit ist die Installation abgeschlossen. Der Selbsttest selbst legt keine Firewall-Sperre für einen Client an. Nutzung Nutzung MAC-Adresse anhand einer IP-Adresse ermitteln Wenn die aktuelle IP-Adresse des verdächtigen Clients bekannt ist, kann die dazugehörige MAC-Adresse über die Neighbor-Tabelle ermittelt werden: ip neigh show to 10.15.37.80 Beispielausgabe: 10.15.37.80 dev br40 lladdr bc:24:11:34:bb:e1 REACHABLE In diesem Beispiel lautet die MAC-Adresse des Clients: bc:24:11:34:bb:e1 Client sofort quarantänisieren quarantine-client add bc:24:11:34:bb:e1 Erwartete Ausgabe: Client bc:24:11:34:bb:e1 wurde quarantänisiert. Die MAC-Adresse wird dabei dauerhaft in der Quarantäne-Liste gespeichert. Die Firewallregeln werden unmittelbar neu aufgebaut und bekannte bestehende IPv4- und IPv6-Verbindungen des Clients werden aus Conntrack gelöscht. Schutz vor versehentlichem Aussperren Das Skript versucht zu erkennen, ob die angegebene MAC-Adresse zum Rechner gehört, über den die aktuelle SSH-Verbindung aufgebaut wurde. In diesem Fall wird die Sperre standardmäßig abgebrochen. Beispiel: Fehler: Diese MAC gehört zum aktuellen SSH-Gegenüber. Verwende add --force nur bei bewusstem Verbindungsabbruch. Soll der aktuell verwendete SSH-Client tatsächlich absichtlich gesperrt werden, kann die Schutzfunktion mit --force übergangen werden: quarantine-client add --force bc:24:11:34:bb:e1 Achtung: Ist dies tatsächlich der aktuelle Administrationsrechner, kann dadurch die SSH-Verbindung sofort abbrechen. Quarantänisierte Clients anzeigen quarantine-client list Beispielausgabe: bc:24:11:34:bb:e1 Wenn kein Client quarantänisiert ist: Keine Clients in Quarantäne. Status der Firewall-Hooks anzeigen quarantine-client status Der Befehl zeigt die gespeicherten MAC-Adressen sowie die aktuell installierten IPv4-, IPv6- und Bridge-Hooks an. Gespeicherte Quarantäne erneut anwenden Wenn UniFi die Firewall neu aufgebaut hat oder das Gateway neu gestartet wurde, können alle gespeicherten Quarantäne-Einträge erneut in die laufende Firewall übernommen werden: quarantine-client apply Erwartete Ausgabe: Gespeicherte Quarantäne-Regeln wurden angewendet. Quarantäne eines Clients aufheben quarantine-client remove bc:24:11:34:bb:e1 Erwartete Ausgabe: Quarantäne für bc:24:11:34:bb:e1 wurde aufgehoben. Danach kontrollieren quarantine-client list Wenn die MAC-Adresse nicht mehr in der Ausgabe vorhanden ist, wurde die Quarantäne aufgehoben. Kurzreferenz für den Ernstfall MAC zu einer bekannten IP ermitteln: ip neigh show to IP-ADRESSE Client sperren: quarantine-client add MAC-ADRESSE Gesperrte Clients anzeigen: quarantine-client list Client wieder freigeben: quarantine-client remove MAC-ADRESSE Quarantäne-System vollständig entfernen Vollständige Deinstallation Bei der Deinstallation sollten zuerst alle gespeicherten Clients aus der Quarantäne entfernt werden. Aktuelle Quarantäne-Liste anzeigen quarantine-client list Jede dort aufgeführte MAC-Adresse mit folgendem Befehl entfernen: quarantine-client remove bc:24:11:34:bb:e1 Danach sollte die Liste leer sein: Keine Clients in Quarantäne. Firewall-Hooks und Quarantäne-Ketten entfernen Mit folgendem Block werden die von diesem Werkzeug angelegten IPv4-, IPv6- und Bridge-Firewallketten vollständig aus der laufenden Firewall entfernt: for spec in \ "iptables QRTN_MAC_V4" \ "ip6tables QRTN_MAC_V6" do set -- $spec binary="$1" chain="$2" while "$binary" \ -w 5 \ -t mangle \ -C PREROUTING \ -j "$chain" \ 2>/dev/null do "$binary" \ -w 5 \ -t mangle \ -D PREROUTING \ -j "$chain" done "$binary" \ -w 5 \ -t mangle \ -F "$chain" \ 2>/dev/null || true "$binary" \ -w 5 \ -t mangle \ -X "$chain" \ 2>/dev/null || true done for spec in \ "broute BROUTING QRTN_MAC_BR" \ "filter INPUT QRTN_MAC_IN" \ "filter FORWARD QRTN_MAC_FWD" \ "filter OUTPUT QRTN_MAC_OUT" do set -- $spec table="$1" builtin_chain="$2" custom_chain="$3" while ebtables \ -t "$table" \ -D "$builtin_chain" \ -j "$custom_chain" \ 2>/dev/null do : done ebtables \ -t "$table" \ -F "$custom_chain" \ 2>/dev/null || true ebtables \ -t "$table" \ -X "$custom_chain" \ 2>/dev/null || true done Programmdateien entfernen rm -f /usr/local/sbin/quarantine-client rm -rf /persistent/client-quarantine Kontrolle Der folgende Befehl sollte anschließend keine Quarantäne-Ketten mehr anzeigen: { iptables -t mangle -S 2>/dev/null ip6tables -t mangle -S 2>/dev/null ebtables -t broute -L 2>/dev/null ebtables -t filter -L 2>/dev/null } | awk '/QRTN_MAC_/ { print }' Wenn keine Ausgabe erscheint, sind die Quarantäne-Firewallregeln vollständig entfernt. Zusätzlich sollte der Befehl nicht mehr vorhanden sein: command -v quarantine-client || echo "quarantine-client wurde entfernt." Erwartete Ausgabe: quarantine-client wurde entfernt. Wichtige Grenzen der Quarantäne Die Quarantäne greift auf dem UniFi Gateway und kann damit insbesondere Verkehr zur Firewall selbst, zwischen gerouteten Netzwerken und zum Internet unterbinden. Befinden sich zwei Geräte jedoch im selben VLAN und wird deren Verkehr direkt über einen externen Switch oder Access Point vermittelt, muss dieser Datenverkehr das Gateway möglicherweise überhaupt nicht passieren. Eine Gateway-Firewall kann solchen Verkehr folglich nicht zuverlässig stoppen. Bei einem bestätigten Angriff oder einer akuten Kompromittierung sollte deshalb zusätzlich eine physische beziehungsweise Layer-2-Isolation erfolgen, beispielsweise durch das Deaktivieren des betreffenden Switch-Ports oder das Trennen des WLAN-Clients. Notfall-Zusammenfassung 1. MAC-Adresse feststellen: ip neigh show to IP-ADRESSE 2. Client sofort sperren: quarantine-client add MAC-ADRESSE 3. Sperre kontrollieren: quarantine-client list quarantine-client status 4. Client wieder freigeben: quarantine-client remove MAC-ADRESSE