Der Deny-by-default arbeitete korrekt — es gab nie eine vlan10->vlan30-Zeile. Offen waren nur MAIN->MEDIA, MAIN->INFRA, MAIN->MGMT; IOT fehlte als einziges Paar. Neue Regel voll einbahnig ohne Portfilter (User-Entscheid): MAIN steht zu INFRA/MEDIA/MGMT ohnehin ungefiltert offen, und dort liegen NAS/Proxmox/Nautobot. IOT->MAIN bleibt bewusst zu — dort sitzt der Wert der Segmentierung. Merkregel aus dem Drop-Log: der Drucker faellt mit udp/161 auf, nicht mit 631. macOS fragt zuerst den SNMP-Status ab und bricht ab, bevor es zu IPP kommt — eine Whitelist auf 631 haette nichts repariert. Abnahme von 10.40.10.82 (der Quelle aus dem Log): .30.5 ICMP 0% Loss, snmpget sysName.0 -> P750W, tcp/631+9100+80 offen; Shellys .30.202/.203/.221 HTTP 200. Compliance 92/92, 0 Drifts. Seit dem Deploy keine neue vlan10->vlan30-Zeile im Kollektor. Nebenbei: gc-manual-plan.py --assert URL-encodet die Query jetzt. Ein Kommentar mit Leerzeichen warf InvalidURL erst NACH dem erfolgreichen Deploy — man steht mit einem Traceback da und weiss nicht, ob der Change gewirkt hat. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Nautobot-Tooling
ingest-baseline.py
Idempotenter Basisdaten-Ingest (Locations, Rollen, Device-Types, Devices, VLANs/Prefixes, ap1-Interfaces + IPs, WLAN-Modelle). Bildet den Ist-Zustand ab, nicht den Zielzustand.
export NAUTOBOT_TOKEN=... # aus docs/nas-vlan20/stacks/210-nautobot.yml (gitignored)
python3 nautobot/ingest-baseline.py # Dry-Run
python3 nautobot/ingest-baseline.py --apply # schreiben
API-Fallen (teuer gelernt)
tagged_vlansliest sich per REST alsnull, obwohl korrekt gespeichert. Verifikation nur über GraphQL:POST /api/graphql/mit{interfaces(device:"ap1"){name mode untagged_vlan{vid} tagged_vlans{vid}}}.- Relationen kommen ohne
?depth=1ohnedisplay→ ein voll gepflegtes Device sieht leer aus. LocationType.content_typesmussipam.vlangroup/ipam.vlan/ipam.prefix/dcim.controllerenthalten, sonst 400 beim Anlegen.parent_interfacenur für virtuelle Interfaces — WLAN-VAPs können ihren Master nicht als Parent tragen.WirelessNetworkhat kein VLAN-Feld; die VLAN-Bindung hängt anwireless/controller-managed-device-group-wireless-network-assignmentsund braucht zwingend einenController(bei uns logisch,controller_deviceleer — kein CAPsMAN).RadioProfile.channel_widthwill Integer ([20,40,80]), nicht"20mhz".- IP↔Interface läuft über
/ipam/ip-address-to-interface/.