TP22 abgeschlossen + WLAN-Roaming repariert (802.11k/v)
TP22 Schritt 5 — Datenmodell as-built aus dem Geraet erhoben (bridge/port, bridge/vlan, bridge/host + ARP/Leases), nicht aus der Doku: - crs326-core von 5 auf 26 Ports; 3 waren "GEPLANT (tentativ)", ether1 zeigte noch auf das tote sw1 #12 - Standort-Fehler: crs326-branch + ap2 standen auf Technik UG, real Technik OG - sw1/sw2/cudy2 -> Decommissioned (Endzustand), cudy1 -> Offline; sw1-Duplikat-Ports (gi*) entfernt - Schritt 4 entschieden: keine Secret-Injection (Governance-Regel 1 deckt es ab) TP21.1/4 — core ether4 geklaert und behoben: dort haengt das Wohnzimmer- Sideboard. Der Port war als ap1-Trunk vorkonfiguriert, pvid=40 nahm untagged an (Upstream ok), Egress war tagged -> TV bekam nichts. Diagnose ueber TX/RX- Asymmetrie + ARP failed bei frischem bound-Lease (ein bound-Lease beweist nur den Upstream: INIT-REBOOT-REQUEST braucht kein ACK). Auf untagged VLAN40 gezogen, Kabel bleibt auf Port 4 (Patchfeld-Nummerierung ist Infrastruktur). TP3.3 — Steering-Regression aus dem TP3-Rebuild behoben: /interface wifi steering war auf BEIDEN APs leer. 802.11r/FT macht die Uebergabe nur schnell, ausgeloest wird sie von 802.11k/v -> sticky client bis zum Abriss. st-main (rrm/wnm, neighbor-group bf-main) wiederhergestellt und ins GC-Template aufgenommen, damit eine Neuprovisionierung es nicht wieder still verliert. Compliance 20/20 -> 63/68 (dieselben 5 bekannten Altlasten): - neue Features wifi-steering, bridge-port, bridge-vlan - der L2-Layer war bisher komplett unueberwacht (core-Zweig hatte gar keine Bridge-Sektion, AP-Zweig nur VLAN ohne Ports) - Bridge-Sektionen bewusst als Literal-Block statt aus DCIM abgeleitet: pvid aus untagged_vlan zu generieren haette die akzeptierten Schiefstaende (core ether3, core ether2, branch ether9-23) zu Dauerdrift gemacht Alle Geraete-Aenderungen liefen ueber Nautobot-GC-ConfigPlans mit /system backup davor, keine Direkt-Writes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,46 @@
|
||||
# Vorbereitung des Cutovers und beschreiben nicht mehr den Sollzustand.
|
||||
# =====================================================================================
|
||||
|
||||
# [0] L2-FABRIC — Bridge-Ports + Bridge-VLAN-Tabelle.
|
||||
# Literal-Block, KEINE Ableitung aus DCIM: der As-built traegt bewusste Schiefstaende
|
||||
# (ether3 ist untagged-Member von VLAN40, hat aber pvid=1; ether2 haengt zusaetzlich in
|
||||
# VLAN1). Wuerde man pvid aus `untagged_vlan` generieren, meldete die Compliance genau
|
||||
# diese akzeptierten Altlasten als Dauerdrift. Der Block ist damit das, was Golden Config
|
||||
# fuer einen handgebauten L2-Layer leisten soll: Drift-Erkennung gegen den Ist-Zustand.
|
||||
# `/interface bridge` selbst ist bewusst NICHT abgedeckt (traegt die geraetespezifische
|
||||
# admin-mac -> waere pro Geraet verschieden und ist kein Fleet-Standard).
|
||||
/interface bridge port add bridge=bridge comment=defconf frame-types=admit-only-vlan-tagged interface=ether1
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether2 pvid=40
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether3
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether4 pvid=40
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether5 pvid=40
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether6 pvid=40
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether7
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether8
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether9
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether10
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether11 pvid=10
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether12
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether13
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether14 pvid=30
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether15
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether16 pvid=100
|
||||
{% for n in range(17, 25) %}
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether{{ n }}
|
||||
{% endfor %}
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=sfp-sfpplus1
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=sfp-sfpplus2
|
||||
# ether4 = Wohnzimmer-Sideboard: 2026-08-13 von Trunk auf untagged VLAN40 gezogen (TP21.1/4).
|
||||
/interface bridge vlan add bridge=bridge untagged=ether1,ether2 vlan-ids=1
|
||||
/interface bridge vlan add bridge=bridge tagged=ether1,ether8,ether15 vlan-ids=10
|
||||
/interface bridge vlan add bridge=bridge tagged=ether8,ether13,ether15 vlan-ids=20
|
||||
/interface bridge vlan add bridge=bridge tagged=ether1,ether8,ether15 untagged=ether14 vlan-ids=30
|
||||
/interface bridge vlan add bridge=bridge tagged=ether1,ether8,ether15 untagged=ether2,ether3,ether4,ether5 vlan-ids=40
|
||||
/interface bridge vlan add bridge=bridge tagged=ether1,ether8,ether15 vlan-ids=50
|
||||
/interface bridge vlan add bridge=bridge tagged=ether1,ether8,ether15 vlan-ids=90
|
||||
/interface bridge vlan add bridge=bridge tagged=ether8,ether15,bridge vlan-ids=99
|
||||
/interface bridge vlan add bridge=bridge tagged=ether1 untagged=ether16 vlan-ids=100
|
||||
|
||||
# [1] INTERFACE-LISTS
|
||||
/interface list add comment=TP15 name=WAN
|
||||
/interface list add comment=TP15 name=LAN
|
||||
@@ -108,6 +148,31 @@
|
||||
/ip address add address={{ obj.primary_ip4.address }} comment=TP21-mgmt-target interface=vlan99 network={{ obj.primary_ip4.host.split(".")[:3] | join(".") }}.0
|
||||
/ip dns set servers=10.40.99.1
|
||||
/ip route add comment=TP21-default dst-address=0.0.0.0/0 gateway=10.40.99.1
|
||||
|
||||
# L2-FABRIC — wie beim Core ein Literal-Block (Begruendung dort).
|
||||
# ether9-23 tragen pvid=20 OHNE VLAN-Membership (Bootstrap-Rev4-Rest, funktionslos) —
|
||||
# bewusst so abgebildet, damit eine spaetere Bereinigung als Drift sichtbar wird.
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether1
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether2
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether3 pvid=10
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether4 pvid=10
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether5 pvid=40
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether6 pvid=40
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether7 pvid=20
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether8
|
||||
{% for n in range(9, 24) %}
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether{{ n }} pvid=20
|
||||
{% endfor %}
|
||||
/interface bridge port add bridge=bridge comment=defconf interface=ether24
|
||||
/interface bridge port add bridge=bridge comment=defconf disabled=yes interface=sfp-sfpplus1
|
||||
/interface bridge port add bridge=bridge comment=defconf disabled=yes interface=sfp-sfpplus2
|
||||
/interface bridge vlan add bridge=bridge comment=MAIN tagged=ether1,ether24,bridge untagged=ether3,ether4 vlan-ids=10
|
||||
/interface bridge vlan add bridge=bridge comment=INFRA tagged=ether1,ether24,bridge,ether2,ether8 untagged=ether7 vlan-ids=20
|
||||
/interface bridge vlan add bridge=bridge comment=IOT tagged=ether1,ether24,bridge vlan-ids=30
|
||||
/interface bridge vlan add bridge=bridge comment=MEDIA tagged=ether1,ether24,bridge untagged=ether5,ether6 vlan-ids=40
|
||||
/interface bridge vlan add bridge=bridge comment=UNTRUSTED tagged=ether1,ether24,bridge vlan-ids=50
|
||||
/interface bridge vlan add bridge=bridge comment=GUEST tagged=ether1,ether24,bridge vlan-ids=90
|
||||
/interface bridge vlan add bridge=bridge comment=MGMT tagged=ether1,ether24,bridge vlan-ids=99
|
||||
{% elif obj.role.name == "Wireless AP" %}
|
||||
{% set ap = obj.get_config_context()["ap"] %}
|
||||
{% set mgmt_host = obj.primary_ip4.host %}
|
||||
@@ -150,13 +215,23 @@
|
||||
/interface wifi security add authentication-types={{ z.auth }} ft={{ z.ft }}{% if z.ft == "yes" %} ft-over-ds={{ z.ft_over_ds }}{% endif %} name=sec-{{ z.name }} passphrase="<<REDACTED>>"
|
||||
{% endfor %}
|
||||
|
||||
# [3b] STEERING — 802.11k (rrm: Neighbor Reports) + 802.11v (wnm: BSS Transition).
|
||||
# OHNE das klebt der Client am sterbenden AP, bis die Verbindung abreisst; 802.11r/FT
|
||||
# macht die Uebergabe nur SCHNELL, es loest sie nicht aus. Genau das fehlte nach dem
|
||||
# TP3-Rebuild auf beiden APs und hat Videocalls beim Durchgehen abgerissen (TP3.3).
|
||||
# `neighbor-group` ist site-weit identisch -- nur dann gelten ap1/ap2 als Nachbarn.
|
||||
# Konstante statt ConfigContext: es gibt genau EINE Roaming-Domain pro Standort.
|
||||
{% set steering = {"name": "st-main", "neighbor_group": "bf-main"} %}
|
||||
/interface wifi steering add name={{ steering.name }} neighbor-group={{ steering.neighbor_group }} rrm=yes wnm=yes
|
||||
|
||||
# [4] CONFIGURATION — main sitzt auf den Master-Radios und bringt den Channel mit
|
||||
# (je Band eine configuration); alle anderen Zonen sind Slave-VAPs ohne channel=.
|
||||
# steering= haengt nur an den Master-Zonen (RouterOS exportiert es nach ssid=).
|
||||
{% for z in ap.zones %}
|
||||
{% if z.master %}
|
||||
{% for r in ap.radios %}
|
||||
{% if r.key in z.bands %}
|
||||
/interface wifi configuration add channel=ch-{{ r.key }} country={{ ap.country }} datapath=dp-{{ z.name }} mode=ap name=cfg-{{ z.name }}-{{ r.key }} security=sec-{{ z.name }} ssid={{ z.ssid }}
|
||||
/interface wifi configuration add channel=ch-{{ r.key }} country={{ ap.country }} datapath=dp-{{ z.name }} mode=ap name=cfg-{{ z.name }}-{{ r.key }} security=sec-{{ z.name }} ssid={{ z.ssid }} steering={{ steering.name }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
@@ -164,6 +239,17 @@
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
# [4b] BRIDGE-PORTS — ether2 fehlt bewusst: seit der Uplink-Umstellung auf ether1 (PoE)
|
||||
# ist er KEIN Bridge-Port mehr. ether1 traegt kein comment=defconf (beim Rebuild
|
||||
# neu angelegt), die uebrigen schon — deshalb hier nicht ueber einen Kamm geschoren.
|
||||
/interface bridge port add bridge={{ ap.bridge }} comment=defconf interface=ether3
|
||||
/interface bridge port add bridge={{ ap.bridge }} comment=defconf interface=ether4
|
||||
/interface bridge port add bridge={{ ap.bridge }} comment=defconf interface=ether5
|
||||
{% for r in ap.radios %}
|
||||
/interface bridge port add bridge={{ ap.bridge }} comment=defconf interface={{ r.iface }}
|
||||
{% endfor %}
|
||||
/interface bridge port add bridge={{ ap.bridge }} interface={{ uplink }}
|
||||
|
||||
# [5] BRIDGE-VLAN — Nur Master-Radios sind Bridge-Ports (Slave-VAPs forwarden darueber),
|
||||
# deshalb muessen wifi1/wifi2 tagged-Member je Client-VLAN sein. Die frueheren
|
||||
# "Ausnahmen" fallen hier aus den Daten heraus: IOT hat bands=["2g"] -> nur wifi2.
|
||||
|
||||
Reference in New Issue
Block a user