diff --git a/routeros/wan-cutover-runbook.md b/routeros/wan-cutover-runbook.md new file mode 100644 index 0000000..560879e --- /dev/null +++ b/routeros/wan-cutover-runbook.md @@ -0,0 +1,71 @@ +# WAN-Cutover Runbook (Solo, ohne Claude live) + +Ziel: FB-LAN4 auf Passthrough/Bridge umstellen, sodass **ap1 ether1** die echte Liwest-Public-IP +zieht (Single-NAT statt Double-NAT). Der Testmechanismus läuft **autonom auf ap1** und loggt persistent +— du brauchst Claude während des Cutovers nicht. + +**Dein Console-Pfad:** altes WiFi → `10.40.41.1` (WebFig → New Terminal). Läuft über ap1 **ether2** +(ALLNET-Uplink) und übersteht den Cutover an ether1/FB-LAN4. + +> ⚠️ **device-mode=home** blockiert auf ap1 Scheduler *und* `/tool fetch`. Deshalb arbeitet der +> Mechanismus **ohne Scheduler**: `wantest-run` ist ein blockierendes Loop-Script, das im Hintergrund +> weiterläuft (auch wenn deine Session abreißt). Der MAC-Auto-Revert ist fest in den Clone-Lauf eingebaut. + +--- + +## Schritt 0 — Vorbereitung (mit Claude online schon erledigt) +- Scripts auf ap1 installiert: `wantest-probe`, `wantest-run`, `wanmac-clone`, `wanmac-revert`. +- Disk-Logging aktiv → Ergebnisse in `wan-test.0.txt` **und** live im `/log`. +- FB-WAN-MAC für den Clone-Lauf: **`0C:72:74:36:90:99`** (CM-MAC, als Default hinterlegt). + +## Schritt 1 — Auto-Capture starten +WebFig-Terminal auf `10.40.41.1`: +``` +:global WTN 40 # optional: 40 Proben (~10 min). Default ohne = 24 (~6 min) +/system script run wantest-run +``` +→ probt alle 15 s und loggt jede Schicht. Läuft im Hintergrund. (Terminal blockiert während des Laufs; +einfach ein zweites WebFig-Fenster für den Log öffnen.) + +## Schritt 2 — FritzBox umstellen + Kabel +- FB-UI → LAN4 auf Passthrough/IP-Client (Klickanleitung im Chat / `docs/`). +- ether1 von ap1 an den FB-Passthrough-Port. **ether2 (Uplink) bleibt stecken!** + +## Schritt 3 — Live mitlesen +``` +/log print where message~"WANTEST" +``` +Schichten interpretieren: +- `ether1 ... addr=86.x.x.x` → externe IP gezogen ✓ (Bridge greift) +- `wan-reach via-1.1.1.1 ok ...` → **Routing+NAT zur Public-IP ok** (ohne DNS-Abhängigkeit) +- `wan-reach ... FAIL` → Routing/NAT kaputt → „nach .1 nichts" = WAN-seitig +- `dns-doh ok ...` → DoH-Namensauflösung ok (das, was Clients als DNS nutzen) +- `dns-doh FAIL` → DoH/Bootstrap kaputt → „nach .1 nichts" = **DNS** (Client erreicht .1, aber nichts per Name) + +## Schritt 4 — MAC-Clone testen (optional, ~90 s, selbst-revertierend) +Erst wenn Baseline extern steht: +``` +/system script run wanmac-clone +``` +→ setzt CM-MAC `0C:72:74:36:90:99`, release/renew, 4 Proben, dann **garantierter Auto-Revert** auf +Werks-MAC (alles in einem Lauf). Vergleiche im Log IP/Schichten mit FB-MAC vs. Baseline. +Not-Revert sofort: `/system script run wanmac-revert`. + +## Schritt 5 — Abschluss +- `wantest-run` endet von selbst nach WTN Proben (Log: „WANTEST run done"). +- Früher stoppen: `/system script job print` → `/system script job remove [find script=wantest-run]`. +- Dann Claude wieder online holen → Claude liest `wan-test.0.txt` und bestimmt die Root-Cause. + +--- + +## Sicherheitsnetze (eingebaut) +- **Fallback-Route:** statische Default-Route via bridge (distance=2) bleibt — fällt ether1 aus, + geht Internet automatisch wieder über die FB (Double-NAT). Kein Totalausfall. +- **MAC-Auto-Revert:** im Clone-Lauf fest eingebaut (~90 s), läuft im Hintergrund garantiert zu Ende. +- **Console bleibt:** `10.40.41.1` via ether2/altes WiFi ist vom Cutover unabhängig erreichbar. + +## Notfall +- ether1 zieht keine externe IP / kein Internet: `/system script run wanmac-revert`, dann FB-LAN4 + zurück auf normal — Fallback-Route hält das LAN online. +- ap1 nicht erreichbar: ether2-Kabel prüfen (Uplink zu ALLNET), NICHT ether1. +- Hängendes Script killen: `/system script job print` → `/system script job remove `. diff --git a/routeros/wan-cutover-test.rsc b/routeros/wan-cutover-test.rsc new file mode 100644 index 0000000..21bccbe --- /dev/null +++ b/routeros/wan-cutover-test.rsc @@ -0,0 +1,58 @@ +# ===== ap1 — Offline-fähiger WAN-Cutover-Test (scheduler-frei) ===== +# RouterOS 7.23.x, device-mode=home. Schichtweise Diagnose für FB-Bridge/Passthrough-Cutover. +# +# ⚠️ device-mode blockiert /system scheduler (scheduler=false) UND /tool fetch (fetch=false). +# Daher: KEINE Scheduler — Autonomie via blockierendem Loop-Script (läuft im Hintergrund +# weiter, auch wenn die Console-Session abreißt). Raw-Internet-Test via :resolve gegen feste +# IP (ICMP/fetch sind hier unbrauchbar/geblockt). +# +# Apply: per REST/MikroMCP ODER /import wan-cutover-test.rsc +# Lesen: /log print where message~"WANTEST" bzw. Datei wan-test.0.txt (persistent) +# Einzel: /system script run wantest-probe +# Lauf: /system script run wantest-run (24 Proben @15s = ~6 min; Hintergrund-fähig) +# vorher optional: :global WTN 40 (mehr Iterationen) +# Stop: /system script job print → /system script job remove [find script=wantest-run] + +# --- idempotent: alte Versionen entfernen --- +/system scheduler remove [find name~"^wantest-"] +/system script remove [find name~"^wantest-"] +/system logging remove [find action="wantest"] +/system logging action remove [find name="wantest"] + +# --- persistentes Logging auf Disk (überlebt Offline-Fenster + Reboot) --- +# topics=script greift NUR auf script-generierte :log-Zeilen → genau unsere WANTEST-Zeilen +/system logging action add name=wantest target=disk disk-file-name=wan-test disk-lines-per-file=2000 +/system logging add topics=script action=wantest + +# --- Probe: eine schichtweise Messung, jede Zeile mit Timestamp + WANTEST-Prefix --- +/system script add name=wantest-probe policy=read,write,test,policy source={ + :local ts ([/system clock get date] . " " . [/system clock get time]) + :local e1stat "?" + :do { :set e1stat [/ip dhcp-client get [find interface=ether1] status] } on-error={} + :local e1addr "-" + :do { :set e1addr [/ip dhcp-client get [find interface=ether1] address] } on-error={} + :local e1mac [/interface ethernet get [find name=ether1] mac-address] + :log info ("WANTEST [" . $ts . "] ether1 status=" . $e1stat . " addr=" . $e1addr . " mac=" . $e1mac) + :local gw "-" + :do { :set gw [/ip route get [find dst-address="0.0.0.0/0" active=yes] gateway] } on-error={} + :log info ("WANTEST route default-gw=" . $gw) + # WAN-Routing+NAT: Router -> public 1.1.1.1 (UDP/53). UNABHÄNGIG von ap1-DNS-Config. + # (ICMP/HTTPS sind hier geblockt -> :resolve gegen feste IP ist das robuste Signal.) + :do { :local w [:resolve "google.com" server=1.1.1.1] ; :log info ("WANTEST wan-reach via-1.1.1.1 ok google.com=" . $w) } on-error={ :log info "WANTEST wan-reach via-1.1.1.1 FAIL (Routing/NAT?)" } + # DoH end-to-end: ap1-Resolver = was die Clients als DNS bekommen + :do { :local d [:resolve "google.com"] ; :log info ("WANTEST dns-doh ok google.com=" . $d) } on-error={ :log info "WANTEST dns-doh FAIL (DoH/Bootstrap?)" } +} + +# --- Run: blockierender Loop, probt N×@15s. Hintergrund-fähig (überlebt Session-Abbruch). --- +/system script add name=wantest-run policy=read,write,test,policy source={ + :global WTN + :if (([:typeof $WTN] = "nothing") or ($WTN = "")) do={ :set WTN 24 } + :log info ("WANTEST run start (" . $WTN . "x @15s, ~" . ($WTN * 15 / 60) . " min)") + :for i from=1 to=$WTN do={ + /system script run wantest-probe + :delay 15s + } + :log info "WANTEST run done" +} + +:log info "WANTEST cutover-test installiert (probe + run, scheduler-frei, disk-logging)" diff --git a/routeros/wan-macclone-test.rsc b/routeros/wan-macclone-test.rsc new file mode 100644 index 0000000..36ce718 --- /dev/null +++ b/routeros/wan-macclone-test.rsc @@ -0,0 +1,57 @@ +# ===== ap1 — WAN MAC-Clone-Test (FB CM-MAC → ether1), scheduler-frei ===== +# RouterOS 7.23.x, device-mode=home. Setzt wan-cutover-test.rsc voraus (nutzt wantest-probe). +# +# FB-WAN-MAC = CM-MAC 0C:72:74:36:90:99 (DOCSIS-SW 7.3.5.3.521, vom User aus FB-UI). +# ⚠️ CM-MAC = Cable-Modem-/DOCSIS-Layer. Im echten Bridge-Modus nutzt die FB diese MAC +# selbst → MAC-Konflikt-Risiko. Public-IP kam bereits mit ether1-eigener MAC → Clone ist +# Verifikation, kein Muss. +# +# device-mode blockiert /system scheduler → Auto-Revert ist hier KEIN Scheduler, sondern fest +# in den Clone-Lauf eingebaut (linearer Ablauf, ~90 s Clone-Fenster, dann garantierter Revert — +# läuft im Hintergrund zu Ende, auch wenn die Console-Session abreißt). +# +# Ablauf (Console über altes WiFi auf 10.40.41.1): +# 1) Baseline-Cutover mit ether1-eigener MAC (wantest-run) → Public-IP geloggt +# 2) /system script run wanmac-clone → setzt CM-MAC, release/renew, 4 Proben, AUTO-REVERT +# 3) Log prüfen: IP/Schichten mit FB-MAC vs. Baseline (/log print where message~"WANTEST") +# Not-Revert jederzeit: /system script run wanmac-revert + +# --- idempotent --- +/system scheduler remove [find name~"^wanmac-"] +/system script remove [find name~"^wanmac-"] + +# --- Clone: orig sichern → CM-MAC → release/renew → 4 Proben → GARANTIERTER Auto-Revert --- +/system script add name=wanmac-clone policy=read,write,test,policy source={ + :global FBMAC + :if (([:typeof $FBMAC] = "nothing") or ($FBMAC = "")) do={ :set FBMAC "0C:72:74:36:90:99" } + :global E1ORIG + :set E1ORIG [/interface ethernet get [find name=ether1] mac-address] + :log info ("WANTEST macclone: orig=" . $E1ORIG . " -> fb=" . $FBMAC . " (Auto-Revert in ~90s)") + /interface ethernet set [find name=ether1] mac-address=$FBMAC + :do { /ip dhcp-client release [find interface=ether1] } on-error={} + :delay 2s + :do { /ip dhcp-client renew [find interface=ether1] } on-error={} + :delay 25s + :for i from=1 to=4 do={ /system script run wantest-probe ; :delay 15s } + # --- garantierter Auto-Revert im selben Lauf (kein Scheduler nötig) --- + /interface ethernet reset-mac-address [find name=ether1] + :do { /ip dhcp-client release [find interface=ether1] } on-error={} + :delay 2s + :do { /ip dhcp-client renew [find interface=ether1] } on-error={} + :delay 15s + /system script run wantest-probe + :log info ("WANTEST macclone done -> revert auf factory-MAC (orig war " . $E1ORIG . ")") +} + +# --- Not-Revert: sofort Werks-MAC zurück (falls man früher raus will) --- +/system script add name=wanmac-revert policy=read,write,test,policy source={ + /interface ethernet reset-mac-address [find name=ether1] + :do { /ip dhcp-client release [find interface=ether1] } on-error={} + :delay 2s + :do { /ip dhcp-client renew [find interface=ether1] } on-error={} + :delay 10s + /system script run wantest-probe + :log info "WANTEST macclone manual-revert -> factory-MAC" +} + +:log info "WANTEST macclone-test installiert (clone mit eingebautem Auto-Revert + manual-revert)"