Files
bf-infra/routeros/tp28-ap3-bringup.rsc
Christoph Emsenhuber fd05286e4b TP28 wieder geoeffnet: ap3 (cAP ax) vorbereitet, core ether21 Trunk, MikroMCP-Registry auf bf-infra
Dritter Access-Point ap3 (MikroTik cAP ax, cAPGi-5HaxD2HaxD) kommt dazu und loest
mittelfristig ap1 in Technik UG ab. Statt eines neuen TP wandert TP28 aus dem Archiv
zurueck -- neue Regel: ein archiviertes TP ist ein geschlossenes, kein versiegeltes
Ticket (Christoph-Direktive 2026-08-30).

Live am Core:
- ether21 ist AP-Trunk (10/20/30/40/50/90/99 tagged, Muster ether15). ⚠️ Erratum: erst
  war ether22 angenommen und getaggt; der Port hat keinen Link. Gegenprobe ueber die
  Bridge-Host-Tabelle: auf ether21 sitzt D0:EA:11:FF:16:9D = E01 vom ap3-Label.
  ether22 wieder leer.
- Backups vorher: pre-ap3-20260830.backup/.rsc auf core und ap1.
- Compliance vor und nach jeder Aenderung 104/104, 0 Drifts.

Golden Config (2 Pushes: e25d654b, 20472cdb):
- Core-L2-Block traegt ether21.
- AP-Zweig rendert die Bridge-Ports jetzt aus ap.extra_ports statt hartkodiert
  ether3/4/5. Das war die stille Annahme "AP == hAP ax2 mit 5 Ports"; der cAP ax hat
  zwei. Default in ap-common = hAP-ax2-Bestand, ap3 ueberschreibt mit [].
  Dass ap1/ap2 danach zeichengleich rendern, beweist die 0-Drift-Messung.

Kanalplan NICHT neu erfunden: TP25 hat ihn am 2026-08-24 fuer genau dieses Geraet
gerechnet (DFS vom User genehmigt). ap3 = 5180/Ce + 2437 (ch6, nicht ch1 -- ch1 bleibt
fuer ap1, damit 1/6/11 erstmals lueckenlos aufgeht). ap1/ap2 gehen beim Umzug auf
5260/Ce bzw. 5300/Ce, 5220/Ce bleibt Ausweichspur.

MikroMCP-Registry (MCP-Lifecycle, User-Freigabe 2026-08-30) -- zwei Drifts:
- MIKROMCP_CONFIG_PATH zeigte auf ~/dev/bf-network-r6 (Archiv-Repo); die identische
  Datei in bf-infra war wirkungslos. Jetzt bf-infra = SSoT.
- In opencode.jsonc fehlte MIKROMCP_CONFIG_PATH ganz, hinterlegt waren nur ap1/ap2 --
  opencode kannte core/branch gar nicht. Beide Clients zeigen jetzt auf dieselbe
  Registry; ap3 aufgenommen, rosVersion von stale 7.23/7.19.5 auf 7.24 korrigiert.
  Neustart des MCP noetig, Registry wird nur beim Start gelesen.

Noch offen: physischer Bring-up (Datei liegt bereit), ap1-Radios aus, CAPsMAN-Objekte
fuer ap3, Nautobot-Adoption, Messrunde -- und die Passwort-Rotation: das gemeinsame
MikroTik-Admin-PW ist in dieser Session durch eine ungefilterte Ausgabe des
mikromcp-env-Blocks ins Transkript geraten und gilt als verbrannt (Posten fuer TP30).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 12:14:21 +02:00

110 lines
7.0 KiB
Plaintext

# =====================================================================================
# ap3 — Bring-up als reiner CAP unter dem CAPsMAN-Manager crs326-core.
# TP28-Nachtrag, 2026-08-30. Geraet: MikroTik cAP ax (cAPGi-5HaxD2HaxD), Werkszustand.
#
# WEG: Laptop an ap3 ether2 (cAP ax HAT einen zweiten Port), Datei per scp hoch,
# dann `/import file=tp28-ap3-bringup.rsc`. ether1 dabei NOCH NICHT am Netz.
# Danach ether1 -> crs326-core ether21 (ist seit 2026-08-30 Trunk).
#
# 🔴 ether2 bleibt in DIESER Datei als LIFELINE im Bridge (untagged VLAN1), damit die
# Sitzung das abschliessende `vlan-filtering=yes` ueberlebt. Der Abbau ist eine
# EIGENE Datei (tp28-ap3-lifeline-abbau.rsc) und laeuft ERST, wenn ap3 ueber
# 10.40.99.13 erreichbar ist. Zielzustand = wie ap2: ether2 kein Bridge-Port.
#
# ⚠️ NICHT von routeros/.secrets/ap*-prov-base.rsc abgeleitet — die sind als
# historisch/nicht-deploybar markiert und tragen veraltete PSKs. Vorlage ist der
# LIVE-Stand von ap2 (2026-08-30 gelesen).
#
# DELTAS ZU ap1/ap2 (hAP ax2): cAP ax hat nur ZWEI Ethernet-Ports (ether1 PoE-in,
# ether2 PoE-out) — es gibt kein ether3/4/5. Der GC-Template-AP-Zweig hat die
# hartkodiert; dort kommt `ap.extra_ports` dazu (fuer ap3 = leere Liste).
# =====================================================================================
/system identity set name=ap3
# --- L3/WAN-Reste weg. Ein Werks-cAP bringt DHCP-Client/Server + NAT mit; beides hat
# im BF-Netz nichts verloren (der Core ist DHCP- und NAT-Instanz).
/ip dhcp-client remove [find]
/ip dhcp-server remove [find]
/ip dhcp-server network remove [find]
/ip pool remove [find]
/ip firewall nat remove [find]
/ipv6 dhcp-client remove [find]
# --- Interface-Lists: ether1 ist Uplink, NICHT WAN.
:if ([:len [/interface list find where name=LAN]]=0) do={ /interface list add name=LAN }
:if ([:len [/interface list find where name=WAN]]=0) do={ /interface list add name=WAN }
/interface list member remove [find where interface=ether1]
# --- Bridge sicherstellen, VLAN-Filter waehrend des Umbaus AUS.
:if ([:len [/interface bridge find where name=bridge]]=0) do={ /interface bridge add name=bridge }
/interface bridge set [find name=bridge] vlan-filtering=no
# ether2 traegt PoE-out. Nichts haengt dran -> aus, wie ap1/ap2 es mit ihrem PoE-Port halten.
/interface ethernet set [find name=ether2] poe-out=off
# --- Werks-WLAN abraeumen. REIHENFOLGE IST PFLICHT: `configuration` referenziert
# security/datapath/channel; wer die Referenzierten zuerst loescht, bekommt einen
# Fehler und laesst einen Teil-Zustand zurueck (Lehre aus tp28-ap-wifi-reste-abraeumen.rsc).
# `[find !dynamic]` waere hier ein SYNTAXFEHLER — diese Objekte haben gar keine
# dynamic-Eigenschaft. Richtig ist schlicht `[find]`.
/interface wifi capsman set enabled=no
/interface wifi remove [find where !(name=wifi1 || name=wifi2)]
/interface wifi configuration remove [find]
/interface wifi steering remove [find]
/interface wifi security remove [find]
/interface wifi datapath remove [find]
/interface wifi channel remove [find]
# Werks-Inline-Overrides auf den Master-Radios loeschen, sonst gewinnen sie gegen den Manager.
/interface wifi set [find name=wifi1] !configuration.ssid !security.authentication-types !security.passphrase !security.ft-over-ds
/interface wifi set [find name=wifi2] !configuration.ssid !security.authentication-types !security.passphrase !security.ft-over-ds
# --- Bridge-Ports idempotent. ether2 = Lifeline (faellt spaeter weg).
:if ([:len [/interface bridge port find where interface=ether1]]=0) do={ /interface bridge port add bridge=bridge interface=ether1 }
:if ([:len [/interface bridge port find where interface=ether2]]=0) do={ /interface bridge port add bridge=bridge interface=ether2 }
:if ([:len [/interface bridge port find where interface=wifi1]]=0) do={ /interface bridge port add bridge=bridge comment=defconf interface=wifi1 }
:if ([:len [/interface bridge port find where interface=wifi2]]=0) do={ /interface bridge port add bridge=bridge comment=defconf interface=wifi2 }
# --- Bridge-VLAN-Tabelle. Muster = ap2 live, plus ether2 in VLAN1 (Lifeline).
# IOT (30) nur auf wifi2: die Zone hat bands=["2g"] (ConfigContext ap-common).
# MGMT (99) liegt auf der Bridge, NICHT auf den Radios — sonst waere Management
# over-the-air.
/interface bridge vlan remove [find]
/interface bridge vlan add bridge=bridge untagged=bridge,ether1,ether2 vlan-ids=1
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=10
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=20
/interface bridge vlan add bridge=bridge tagged=ether1,wifi2 vlan-ids=30
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=40
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=50
/interface bridge vlan add bridge=bridge tagged=ether1,wifi1,wifi2 vlan-ids=90
/interface bridge vlan add bridge=bridge tagged=ether1,bridge vlan-ids=99
# --- Mgmt-Layer. IP nach TP32-Konvention (.10-.29 = physische Hosts): ap1 .11, ap2 .12, ap3 .13.
:if ([:len [/interface vlan find where name=vlan99]]=0) do={ /interface vlan add name=vlan99 interface=bridge vlan-id=99 }
/ip address remove [find where interface=vlan99]
/ip address add address=10.40.99.13/24 interface=vlan99
:if ([:len [/interface list member find where list=LAN and interface=vlan99]]=0) do={ /interface list member add list=LAN interface=vlan99 }
:if ([:len [/interface list member find where list=LAN and interface=bridge]]=0) do={ /interface list member add list=LAN comment=defconf interface=bridge }
/ip route remove [find where comment="mgmt default via core"]
/ip route add dst-address=0.0.0.0/0 gateway=10.40.99.1 comment="mgmt default via core"
/ip dns set allow-remote-requests=yes servers=10.40.99.1
# Zeitquelle ist der Core (seit 2026-08-18). Ohne das war ap2 einmal 17 h versetzt und
# seine Logs fuer jede geraeteuebergreifende Korrelation wertlos.
/system ntp client set enabled=yes
/system ntp client servers remove [find]
/system ntp client servers add address=10.40.99.1
# --- CAP-Modus. 🔴🔴 `slaves-datapath` IST NICHT OPTIONAL.
# Der Manager schickt `datapath.bridge=bridge` zwar mit, der CAP uebernimmt davon
# aber NUR die vlan-id — die Bridge-Mitgliedschaft bleibt lokal. Fehlt das Objekt,
# assoziieren Clients auf iot/media/untrusted/guest sauber und bekommen NIE DHCP,
# waehrend dirtyvader-main (Master-Radios = statische Bridge-Ports) weiterlaeuft.
# Genau so lagen IOT+MEDIA am 2026-08-18 rund 14 Stunden. KEINE vlan-id hier —
# die liefert der Manager pro VAP.
/interface wifi datapath add name=dp-caps-slaves bridge=bridge comment="TP28-fix: bridge fuer CAPsMAN-Slave-VAPs"
/interface wifi cap set enabled=yes discovery-interfaces=vlan99 slaves-datapath=dp-caps-slaves
# --- ZULETZT: Bridge VLAN-scharf schalten. Vorher waere der Rest der Datei nicht angekommen.
/interface bridge set [find name=bridge] vlan-filtering=yes
:log info "tp28-ap3: bring-up fertig, ip=10.40.99.13 cap=yes slaves-datapath=dp-caps-slaves"