Nimmt die 4 Live-Geräte (crs326-core/-branch, ap1, ap2) real unter Golden
Config: Backup -> Compliance -> intended -> kontrollierter Push. Damit greift
der Governance-Entscheid "Config exklusiv über Nautobot" operativ.
Secret-Leak geschlossen (Anlass, ungeplant gefunden)
Es gab keine ConfigReplace-Regeln, deshalb hatte der Backup-Job den
ap1-/export ungefiltert nach Gitea geschrieben: der live genutzte
WG-Hub-private-key und 6 WLAN-PSKs lagen dort im Klartext.
- nautobot/ingest-gc-scrubbing.py: 5 ConfigReplace-Regeln, Maske
"<<REDACTED>>". RouterOS quotet nur bei Bedarf (4 von 6 PSKs standen
unquotiert), daher Alternation mit der quotierten Variante zuerst --
\S+ ist greedy und würde bei einem PSK mit Leerzeichen den Rest
exponieren. Regex-Selbsttest läuft bei jedem Aufruf.
- Gitea-Repo neu angelegt (History-Rewrite verworfen: Gitea hält
unerreichbare Blobs bis zum server-seitigen gc). Verifiziert: 0
unmaskierte Secrets über alle 4 Geräte. User-Entscheid: nicht rotieren.
- push-gc-template.py: Pre-Push-Secret-Guard, --dry-run, -m, sha optional.
Template
- AP-Zweig (role == "Wireless AP"), datengetrieben aus ConfigContext
ap-common + local_config_context_data; ap1/ap2 differieren nur in 4
Werten. RadioProfile verworfen (hängt an einem Controller, den es seit
der CAPsMAN-Abschaffung nicht gibt).
- crs326-core-Zweig von Slash- auf /export-Form (Space-Form, Attribute
alphabetisch), stale disabled=yes aus der Cutover-Ära entfernt.
- Switch-Zweig für crs326-branch.
- Mgmt-Nummernplan korrigiert: ap2 und branch waren in den DNS-Statics
vertauscht, ap1 zeigte auf ein nicht existierendes .99.3.
Verbindlich: core .99.1 | branch .99.2 | ap1 .99.11 | ap2 .99.12.
Ergebnis: ap1 intended == Geräte-Ist (0 Drift), core 68/69 Zeilen
byte-identisch. 14 ComplianceRules, 51/56 compliant -- die 5 Restdrifts
sind echte Altlasten (Rettungspfade, Aufräumen gehört zu TP19).
Deploy (nautobot_config.py, Image gc9)
enable_plan/enable_deploy an. napalm-ros ist READ-ONLY: der Default-
Dispatcher wählt NAPALM (Platform trägt napalm: ros), Backup geht,
merge_config scheitert grundsätzlich mit leerer Fehlermeldung. Fix =
custom_dispatcher auf NetmikoMikrotikRouteros, in den Golden-Config-
Settings (nicht den Nornir-Settings). Pilot-Deploy: DNS-Statics auf dem
Core korrigiert, per Purge-vor-Add, weil plan_type=missing nur add
erzeugt und sonst Duplikate entstanden wären.
Governance-Regeln in docs/teilprojekte.md festgeschrieben: Pläne nur
feature-scoped (ein Voll-Push schriebe die Maske als PSK auf die APs),
AP-Template nie zeilenweise auf ein laufendes Gerät (vlan-filtering=no
reisst den Mgmt-Pfad ab).
CLAUDE.md: Power-Save-Fehldiagnose korrigiert
Der P750W war nicht im Power-Save, sondern schlicht ausgeschaltet; das
Ping-Symptom kam vom lokal mitlaufenden WARP-Client (cloudflared =
QUIC-Proxy, kein ICMP). Die Merkregel "DHCP-geht-aber-Ping-nicht =
ARP/Power-Save" ist damit widerlegt und entfernt; strukturell schliesst
TP16.1 diese ICMP-Lücke.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
hAP ax² Setup — CAPsMAN + VLAN (Design & Plan, REVIEW vor Apply)
Stand: beide auf RouterOS 7.23.1 + RouterBOOT 7.23.1. Namen/IPs gesetzt: ap1 = 10.40.41.1 (künftiges Gateway/Router) · ap2 = 10.40.41.2 (CAP). Default-Bridge (ether2–5+wifi, vlan-filtering aus).
⚠️ Status: NUR PLAN. An den Geräten bisher nur: Firmware 7.23.1, Identity ap1/ap2, Stray-IP weg, Mgmt-IP→.1/.2. Exakte 7.23-Syntax (wifi/capsman/provisioning/scheduler) wird vor Apply gegen das Gerät validiert.
Hardware-Realität
- WiFi 6 (ax), dual-band 2,4+5 GHz. MLO ist NICHT verfügbar (MLO = WiFi 7/802.11be → bräuchte hAP be³). „MLO wenn möglich" entfällt.
Rollen
- ap1 = CAPsMAN-Manager + AP (später zusätzlich Router — L3/DHCP/DNS/NAT/CAKE = separater Cutover, NICHT hier).
- ap2 = CAP (zieht Wireless-Config von ap1 @ 10.40.41.1).
⚠️ Topologie / Verkabelung (Klärungsbedarf)
- ap1 → Core-Switch Port 2 (direkt). ✓ Guter Trunk-Kandidat.
- ap2 → hinter TP-Link TL-SG108E → Core-Switch Port 8. Damit ap2 die VLANs getaggt bekommt, müsste auch der TP-Link trunken (kann 802.1Q, aber fummelige UI). Empfehlung: ap2 im Wartungsfenster direkt an einen freien Core-Port (z.B. Port 3) → sauberer Trunk, keine TP-Link-VLAN-Config.
- ether1 = WAN — Achtung: Für ap1 (Router) ist ether1 = WAN zur FB (Internet); der LAN-Trunk zum Core bleibt ether2 → ap1 braucht 2 Kabel. Für ap2 (reiner AP) gibt es kein WAN; ein Uplink (Trunk) genügt. → Den LAN-Trunk auf ether1 zu legen wäre für den Router falsch. Finale Verkabelung bitte bestätigen.
Bridge-VLAN-Layout (beide APs)
- Uplink ether2 = Trunk: tagged
10,20,30,40,90,99,100+ native/untagged vlan1 (= aktuelles Mgmt-Netz, .1/.2). - Mgmt bleibt erreichbar (untagged vlan1), solange der Switch-Port native vlan1 untagged bleibt.
vlan-filtering=yeszuletzt — mit Auto-Rollback (5 min) gegen Lockout.
WLAN (SSID → VLAN via CAPsMAN-Datapath)
| SSID | VLAN | Security |
|---|---|---|
BF-Main |
10 (MAIN) | WPA3-only |
BF-IoT |
30 (IOT) | WPA2/WPA3-PSK |
BF-Guest |
90 (GUEST) | WPA2/WPA3-PSK |
Beide Bänder (2,4+5 GHz ax). Temp-Passphrase (Platzhalter BFtest-2026-tmp) — User setzt echte in Ruhe. |
VLAN-SSIDs bekommen erst nach dem Router-Cutover DHCP/Gateway. Sofort-Test optional via Temp-SSID auf native vlan1 (FB-DHCP).
Apply-Reihenfolge (wenn freigegeben)
- Switch: AP-Uplink-Port(s) → Trunk (tagged 10,20,30,40,90,99,100 + native vlan1). [ap2 erst sinnvoll, wenn direkt am Core ODER TP-Link trunkt]
- ap1: Bridge-VLAN → CAPsMAN-Manager → (Auto-Rollback) vlan-filtering=yes.
- ap2: Bridge-VLAN → CAP enable (manager=10.40.41.1).
- Verifizieren: ap2 im Manager; SSIDs auf beiden Radios; Mgmt erreichbar. Rollback canceln.
Safety — Auto-Rollback
/system scheduler add name=vlan-rollback interval=5m \
on-event="/interface bridge set [find name=bridge] vlan-filtering=no; /system scheduler remove vlan-rollback"
Offene Punkte (User)
- Finale Verkabelung bestätigen (ap1: ether1→FB-WAN, ether2→Core-Trunk; ap2: direkt an Core vs. TP-Link trunken).
- Switch-Mgmt-IP:
.3oder.239(da.2jetzt = ap2). - Echte WLAN-Passphrasen (später).
Dateien
routeros/ap1-manager.rsc·routeros/ap2-cap.rsc