diff --git a/docs/tp10-context-digest.md b/docs/tp10-context-digest.md index 4ade212..81b483d 100644 --- a/docs/tp10-context-digest.md +++ b/docs/tp10-context-digest.md @@ -3,7 +3,7 @@ > Verdichteter Handoff-Stand. Vollständig: `docs/tp10-vpn-migration.md`. (Erstellt lokal via Ollama > `nemotron-3-nano:4b`, fakten-gegengeprüft.) -- **TP10** = 2 AVM-Tunnel (FM=IPsec, DW/Geli=FB-WireGuard) → **2× WireGuard mit Hub auf ap1** (MikroTik hAP). Gated: permanenter FB-Bridge. +- **TP10** = 2 AVM-Tunnel (FM **= FB-WG**, IPsec längst gekillt; DW/Geli = FB-WireGuard) → **2× WireGuard mit Hub auf ap1** (MikroTik hAP). Gated: permanenter FB-Bridge. - **Entscheidung 2026-06-17:** TP10 **vertagt, gebündelt mit FB-Bridge-Cutover** (VPN-auf-FB ⊕ Bridge schließen sich aus). Am Bridge-Tag hat ap1 die Public-IP → kein Port-Forward. Vorerst beide VPN über die BF-FritzBox: **FM=IPsec, DW=FB-WG**. - **Root Cause (FM-PoC bewiesen):** FB masqueradet den WG-Tunnel, wenn die WG-Interface-`Address` eine **Transfernetz-IP** ist. AVM = Proxy-ARP → **FB-WG-`Address` MUSS die LAN-IP sein**. Beweis: Ping `10.101.0.10` kam aus `10.255.255.2` (NAT). - **Eckdaten:** @@ -13,6 +13,6 @@ - FM LAN **`10.101.0.0/24`** GW .254, FB-WG-`Address` = **`10.101.0.254/24`** - DW/Geli CGNAT v4, LAN heute **`192.168.178.0/24`** GW .1, künftig **`10.95.10.0/24`**. FB-WG-`Address` = **`192.168.178.1/24, 10.95.10.1/24`** (dual, renumber-fest). Keepalive 25. - **Zustand:** ap1-Hub geparkt (Peers disabled, WG-Routen entfernt, Firewall bleibt). DW-Config bei Geli vor Ort gestaged 2026-06-17. -- **Offen (sobald BF erreichbar):** `peer2` enable, allowed-address **`192.168.178.0/24,10.95.10.0/24`** (Key `FqYZLztQ/qME5VDie5QLGH++5299WJiE1dPpQnPbzUw=` oder Gelis FB-eigener Key), Routen `192.168.178.0/24` + `10.95.10.0/24` → wg-hub. `peer1`/FM bleibt disabled. +- **Gestaged (`routeros/tp10-cutover-apply.rsc`, am Bridge-Tag anwenden):** `peer1`/FM enable, allowed-address `10.101.0.0/24`, **Endpoint `abxhutfgsid9snmy.myfritz.net:52476`** (bidirektional, FM kein CGNAT). `peer2`/DW enable, allowed-address **`192.168.178.0/24,10.95.10.0/24`** (Key `FqYZLztQ…PbzUw=` oder Gelis FB-eigener Key), Endpoint leer (CGNAT-Dial-in). Routen `10.101.0.0/24` + `192.168.178.0/24` + `10.95.10.0/24` → wg-hub. Plus Input-WAN-Seal + ether1 `use-peer-dns=no`. - **Gotchas:** (1) FB-WG-`Address` = LAN-IP, kein Transfernetz. (2) NetBIOS routet nicht über Tunnel → per IP/DNS testen (SMB 445), kein Broadcast. (3) Gelis FB lehnt 2 WG zum selben Zielnetz ab → direkter Swap. (4) Verify: Antwort-Quelle muss echte LAN-IP sein, nicht `10.255.255.x`. - **v6-Variante (später):** Gelis FB hat natives öffentliches IPv6 `2a0e:7a02:31c:3000::/56` (rotiert ~30h via MyFRITZ), v6-Inbound offen → direktes WG ap1↔Geli über v6 umgeht CGNAT; Inner-Tunnel bleibt IPv4. diff --git a/docs/tp10-vpn-migration.md b/docs/tp10-vpn-migration.md index bca6825..6b70093 100644 --- a/docs/tp10-vpn-migration.md +++ b/docs/tp10-vpn-migration.md @@ -3,11 +3,18 @@ > **Single Source of Truth** für TP10. Research: `docs/research/vpn-comparison.md` · IPv6: Memory `project-ipv6-state`. > Plan-Scratch (historisch, teils überholt): `~/.claude/plans/pure-wibbling-graham.md`. +## 🟢 STATUS 2026-06-25: CUTOVER-READY — Apply-Skript gestaged, wartet auf Bridge-Tag +ap1-Live-Stand verifiziert; alle ap1-Änderungen in **`routeros/tp10-cutover-apply.rsc`** gebündelt (idempotent): +WG-Peers säubern+enable, Spoke-Routen, **Input-Chain WAN-Seal** (🔴 ap1 bekommt Public-IP → Management/Resolver dicht), +ether1 `use-peer-dns=no`. FM-`.conf`-Endpoint auf **`bf4…`** umgestellt. Klick-Anleitungen: +`routeros/fritzbox-wg-lanlan-klickanleitung.md` (FM-FB) + `routeros/fritzbox-bf-bridge-cutover-klickanleitung.md` (BF-FB). +Modus: **stagen → am Bridge-Tag 1× Apply + ether1 umstecken** (Runbook unten). FritzBox = kein MCP (UI/Klick). + ## 🅿️ STATUS 2026-06-17: VERTAGT — gebündelt mit dem FB-Bridge-Cutover TP10 wird **nicht** mehr als Parallel-Migration vorab gemacht, sondern **zusammen mit dem permanenten FB-Bridge-Cutover** — denn **VPN-auf-FB und FB-Bridge schließen sich aus** (Bridge = Modem = keine VPN-Terminierung). Bonus: am Bridge-Tag hat **ap1 die echte Public-IP** → **kein FB-Port-Forward-Umweg** mehr, Spokes zeigen direkt auf ap1 (via DDNS). -- **Beide VPN laufen vorerst über die BF-FB:** **FM = IPsec**, **DW = FB-WG** (Status quo, produktiv). +- **Beide VPN laufen vorerst über die BF-FB:** ~~FM = IPsec~~ → **FM = FB-WG** (IPsec längst gekillt), **DW = FB-WG**. - **DW-Config ist aber schon bei Geli vor Ort gestaged** (2026-06-17, seltener Zugriff genutzt) — wird erst aktiv, wenn die ap1-Seite live geht (s.u. „Offen"). @@ -23,7 +30,7 @@ echte LAN-IPs, LAN-LAN sauber. (Gleiche Ursache wie der alte „NetBIOS routet n | Hub `wg-hub` (ap1) | UDP **51821**, MTU 1412, **keine IF-IP**, Key `P/bztIk13cAmLHbN6oHGGnWAKLZsqR5TXAbFP+NGGBk=` | | **Endpoint (Spokes)** | **`bf4.emsenhuber.net:51821`** — DDNS via Cloudflare (Zone `emsenhuber.net`, **proxied=false**, TTL 120) → `86.56.201.104`. Überlebt IP-Wechsel **und** FB-Bridge. NICHT MyFRITZ (stirbt im Bridge). | | BF-Seite (AllowedIPs der Spokes) | `10.40.0.0/16` | -| FM | LAN `10.101.0.0/24` (GW .254), war IPsec. FB-WG-`Address` = **`10.101.0.254/24`** (LAN-IP!) | +| FM | LAN `10.101.0.0/24` (GW .254). **IPsec gekillt → bereits FB-WG** (peert heute mit BF-FB; FM-FB horcht auf `abxhutfgsid9snmy.myfritz.net:52476`, erreichbar/kein CGNAT). FB-WG-`Address` = **`10.101.0.254/24`** (LAN-IP!). Migration = Peer-Endpoint auf `bf4…:51821` umbiegen. ap1-peer1 bekommt FM-Endpoint → **bidirektional** | | DW/Geli | LAN heute `192.168.178.0/24` (GW .1), **CGNAT v4**, Antennengem. Geroldsgrün. Künftig **`10.95.10.0/24`**. FB-WG-`Address` = **`192.168.178.1/24, 10.95.10.1/24`** (Dual, renumber-fest) | | Keepalive | Spoke-Seite `PersistentKeepalive=25` (CGNAT-Dial-out) | @@ -31,13 +38,19 @@ echte LAN-IPs, LAN-LAN sauber. (Gleiche Ursache wie der alte „NetBIOS routet n **ap1-Park-Zustand:** Peers **disabled**, WG-Routen **entfernt** (FM/DW laufen über FB-Default), `wg-hub` bleibt (Key erhalten), Firewall-Regeln bleiben (TP5-Vorarbeit). NAT braucht nichts (Egress wg-hub ≠ masq-Interface bridge/ether1). -## ⏳ Offen — ap1-Seite aktivieren (sobald BF erreichbar; aktuell locked out) -- `peer2` (DW) enable/neu: `public-key=FqYZLztQ/qME5VDie5QLGH++5299WJiE1dPpQnPbzUw=` (unser Key; falls Gelis FB - **eigene** Keys erzeugt → deren Public-Key eintragen), **allowed-address = `192.168.178.0/24, 10.95.10.0/24`**, Endpoint leer. -- Routen `192.168.178.0/24 → wg-hub` **und** `10.95.10.0/24 → wg-hub`. -- `peer1` (FM) bleibt **disabled** (FM auf IPsec, vertagt bis Bridge-Tag). -- Verify: `list_wireguard_peers` Handshake; `/ping 10.101.0.10 src-address=10.40.20.1` bzw. ein Geli-Host → **Quelle muss - die echte LAN-IP sein**, nicht `10.255.255.x`. **NetBIOS-Lehre:** per IP/DNS testen (SMB 445), nie Broadcast/Netzwerkumgebung. +## ✅ ap1-Seite — gestaged in `routeros/tp10-cutover-apply.rsc` (am Bridge-Tag anwenden) +Das Skript erledigt idempotent (Live-Stand 2026-06-25 verifiziert): +- **peer1 (FM)** allowed-address `10.101.0.0/24` (Transfernetz-/32 raus), enable. Key `dzRY0lnn…fyiVE=`. +- **peer2 (DW)** allowed-address `192.168.178.0/24,10.95.10.0/24` (Transfernetz-/32 raus, künftiges Netz rein), enable. + Key `FqYZLztQ…PbzUw=` (falls Gelis FB **eigene** Keys erzeugt → deren Public-Key eintragen). +- Routen `10.101.0.0/24`, `192.168.178.0/24`, `10.95.10.0/24` → `wg-hub`. +- **Input-WAN-Seal** (est/rel · drop invalid · WG51821 · dhcp68 · icmp · LAN · **drop WAN**) — schließt + telnet/ftp/ssh/api/winbox/www + offenen Resolver/53 gegenüber dem Internet, sobald ether1 die Public-IP hat. +- ether1-DHCP `use-peer-dns=no` (DoH bleibt einzige DNS-Quelle). + +Hinweis: **NAT, Forward-FW (wg-hub), Default-Fallback-Route, masquerade-ether1 sind bereits korrekt** — nicht im Skript. +- Verify: `list_wireguard_peers` Handshake; SMB/445 per IP auf FM-/Geli-Host → **Quelle = echte LAN-IP**, nicht + `10.255.255.x`. **NetBIOS-Lehre:** per IP/DNS testen, nie Broadcast/Netzwerkumgebung. ## DW-Gotchas - **2 WG zum selben Zielnetz**: Gelis FB lehnt zwei WG-Verbindungen mit überlappenden AllowedIPs (`10.40.0.0/16`) ab diff --git a/routeros/fritzbox-bf-bridge-cutover-klickanleitung.md b/routeros/fritzbox-bf-bridge-cutover-klickanleitung.md new file mode 100644 index 0000000..06e59bc --- /dev/null +++ b/routeros/fritzbox-bf-bridge-cutover-klickanleitung.md @@ -0,0 +1,58 @@ +# BF-FritzBox: Bridge/Passthrough + alte Tunnel abbauen — Klick-Anleitung + +> **Methode:** Claude erklärt Absicht + Klickpfad, **du klickst** an der BF-FritzBox (FB 6660, Liwest, `10.40.41.254`). +> ⚠️ FRITZ!OS-Labels sind versionsabhängig — wo unsicher, zählt die **Absicht**; sag mir, was die UI anbietet. +> 🔗 Teil des permanenten Cutovers — Gesamtablauf: `routeros/wan-cutover-runbook.md` + `docs/tp10-vpn-migration.md`. + +## Ziel +Die BF-FB gibt die **öffentliche Liwest-IPv4 per Passthrough an ap1-ether1** weiter → **ap1 wird der Edge** (Public-IP, +VPN-Hub). Die FB verliert ihre Router-/VPN-Rolle, **Telefonie bleibt auf der FB** (separater Voice-Pfad, von der +IPv4-Weitergabe unberührt). Mechanismus = **LAN4-Passthrough** (= der reversible Weg aus dem Test, **kein Liwest-Anruf +nötig**). Optionaler späterer Schritt: echter DOCSIS-Bridge/Modem via Liwest-Support (sauberer, aber nicht erforderlich). + +## ⚠️ Reihenfolge — Hand in Hand mit ap1 +1. **FM-FB** hat die neue WG-`.conf` (bf4-Endpoint) — `fritzbox-wg-lanlan-klickanleitung.md`. DW: laut dir erledigt. +2. **ap1-Apply** läuft (`routeros/tp10-cutover-apply.rsc`) — Hub scharf, WAN-Seal aktiv. **Erst danach** an die BF-FB. +3. **DIESE Anleitung:** Passthrough an + ether1 umstecken. (Tunnel-Teardown unten erst **nach** Verify.) +> Konsole während des Cutovers: **FB-WiFi → ap1 `10.40.41.1`** (WebFig) über ether2. **ether2 NIE ziehen.** + +--- + +## Teil 1 — IPv4 an ap1 durchreichen (LAN4-Passthrough) +`Internet → Zugangsdaten` (bzw. `Internet → ...`) → Funktion **„Gerät mit eigener öffentlicher IPv4" / „Passthrough" +/ „Exposed Host an LAN4"** suchen. +- **Absicht:** Die eine öffentliche Liwest-IPv4 wird **per DHCP an das Gerät an LAN4** (= ap1-ether1) übergeben. +- Aktivieren, LAN4 als Passthrough-Port wählen, speichern. +- Falls FRITZ!OS das nicht direkt anbietet: sag mir die vorhandenen Menüpunkte — dann lotse ich Feld für Feld + (alternativ DOCSIS-Bridge via Liwest-Anruf, dann ist die FB reines Modem). + +## Teil 2 — Umstecken +- **ether1** von ap1 an den **FB-LAN4-Passthrough-Port**. **ether2 bleibt stecken** (Uplink/Konsole). +- ap1-ether1 zieht jetzt Lease + **Public-IP**; Default-Route distance=1 übernimmt automatisch (Bridge-Fallback@2), + Egress masquerade-ether1 greift. → Prüfen via `mcp__mikromcp__list_dhcp_clients` (ether1 status=bound) und + `mcp__mikromcp__list_routes` (Default via ether1 aktiv). + +## Teil 3 — 🔴 DDNS abgleichen (sonst finden die Spokes den Edge nicht) +- ether1-Public-IP lesen: `mcp__mikromcp__run_command` → `/ip address print where interface=ether1`. +- **`bf4.emsenhuber.net`** (Cloudflare, Zone `emsenhuber.net`, **proxied=false**, TTL 120) auf **genau diese IP** setzen, + falls abweichend. *(ap1 kann device-mode-bedingt nicht selbst aktualisieren → vom Laptop/NAS aus.)* + +## Teil 4 — Verify (erst danach Tunnel abbauen!) +- `mcp__mikromcp__list_wireguard_peers` → **peer1 (FM) und peer2 (DW) Handshake**, rx/tx > 0. +- Von einem BF-Host **per IP** (kein NetBIOS/Broadcast): SMB/445 auf je einen FM- und DW-Host. +- **Antwort-Quelle MUSS die echte LAN-IP sein** (z.B. `10.101.0.x` / Geli-LAN), **nicht** `10.255.255.x` (= FB-NAT). + +## Teil 5 — Alte AVM-Tunnel abbauen (nach grünem Verify) +`Internet → Freigaben → Reiter „VPN (WireGuard)"`: +- **Alte FM↔BF-FB-WG** **deaktivieren/löschen** — die WG-Kopplung, über die FM **bisher** lief (FM peerte mit der + BF-FB auf `xvbeo64…myfritz:51821`). Jetzt peert FM↔**ap1** (`bf4…:51821`). *(IPsec ist längst gekillt → dort nichts zu tun.)* +- **Alte DW/Geli-FB-WG** (Server-Port **51820**) **deaktivieren/löschen**. + *(DW-Gotcha: Gelis FB lehnt 2 WG zum selben Zielnetz ab → der neue Geli↔ap1-Tunnel ersetzt den alten direkt; der + Swap auf Geli-Seite ist laut dir bereits erfolgt.)* +- Portfreigabe **51821 → 10.40.41.1** wird im Passthrough hinfällig → entfernen. + +## Rollback (jederzeit, lockout-sicher) +- **WAN zurück:** Passthrough an der FB aus → **ether1** zurück an einen normalen FB-LAN-Port. ap1 fällt über die + distance-2-Route via bridge automatisch in den Double-NAT zurück. **LAN bleibt durchgehend online** (ether2 unberührt). +- **Tunnel:** alte IPsec/WG erst nach grünem Verify abschalten → bis dahin jederzeit reaktivierbar. +- **ap1-Seite:** per `routeros/tp10-cutover-apply.rsc`-Umkehr (Peers disabled, Seal/Routen entfernen). diff --git a/routeros/fritzbox-wg-lanlan-klickanleitung.md b/routeros/fritzbox-wg-lanlan-klickanleitung.md index 647026b..e21c4ae 100644 --- a/routeros/fritzbox-wg-lanlan-klickanleitung.md +++ b/routeros/fritzbox-wg-lanlan-klickanleitung.md @@ -1,8 +1,13 @@ # FritzBox WireGuard als LAN-LAN-Kopplung (FM/DW-Spoke → ap1-Hub) — Klick-Anleitung -> **Methode:** Claude erklärt Absicht + Klickpfad, **du klickst** an der FritzBox. Beispiel FM-Standort -> (`10.101.0.0/24`, GW `10.101.0.254`), aktuell produktiv über **IPsec**. Hub = ap1 (BF). -> ⚠️ FRITZ!OS-Labels sind versionsabhängig — wo unsicher, zählt die **Absicht**. +> **Methode:** Claude erklärt Absicht + Klickpfad, **du klickst** an der FritzBox. FM-Standort +> (`10.101.0.0/24`, GW `10.101.0.254`). **IPsec ist längst gekillt** → FM läuft bereits über **FB-WireGuard** +> (peert aktuell mit der **BF-FB** auf `xvbeo64…myfritz:51821`; FM-FB horcht selbst auf +> `abxhutfgsid9snmy.myfritz.net:52476`). Hub = ap1 (BF). ⚠️ FRITZ!OS-Labels sind versionsabhängig — Absicht zählt. +> +> 🔗 **Teil des permanenten Cutovers** (`docs/tp10-vpn-migration.md` + `routeros/wan-cutover-runbook.md`). +> Der Hub-Endpoint ist jetzt **`bf4.emsenhuber.net:51821`** (DDNS), **nicht** mehr MyFRITZ — denn die BF-FB +> geht in den Bridge-Mode und verliert MyFRITZ + Portfreigabe. `bf4` zeigt direkt auf ap1-ether1 (Public-IP). ## 🎯 ROOT CAUSE (bestätigt 2026-06-16) + der Fix **Messung:** Ping auf realen FM-Host `10.101.0.10` über WG → Antwort kam aus **`10.255.255.2`** (Tunnel-IP) → **die FB @@ -20,18 +25,27 @@ FB **muss ihre eigene LAN-IP** sein → dann routet die FB ihr LAN **ohne NAT**, |---|---|---| | **WG-Interface-Address (FB)** | **`10.101.0.254/24`** (LAN-IP!) | **`192.168.178.1/24`** (LAN-IP!) | | Erreichbare Netze / AllowedIPs (→Hub) | `10.40.0.0/16` | `10.40.0.0/16` | -| Hub-Endpoint | `xvbeo64jqlqd9gfo.myfritz.net:51821` | dito (DW: CGNAT → wählt ausgehend) | +| Hub-Endpoint | **`bf4.emsenhuber.net:51821`** | dito (DW: CGNAT → wählt ausgehend) | | Hub-Public-Key | `P/bztIk13cAmLHbN6oHGGnWAKLZsqR5TXAbFP+NGGBk=` | dito | | MTU / Keepalive | `1412` / `25` | `1412` / `25` | | Vorbereitete `.conf` | `routeros/.secrets/wg-fm.conf` | `routeros/.secrets/wg-dw.conf` | ## ⚠️ Sicherheit (FM ist produktiv!) -- **IPsec bleibt an** = Sicherheitsnetz. Erst abschalten, wenn der Echt-Host-Test grün ist. -- WG läuft parallel zu IPsec (kein Konflikt). ap1-Seite ist fertig — dort nichts ändern. +- Die **bestehende FM↔BF-FB-WG bleibt an** = Sicherheitsnetz, bis der Echt-Host-Test über ap1 grün ist. +- ap1-Seite kommt per `routeros/tp10-cutover-apply.rsc` (Hub scharf, peer1 mit FM-Endpoint) — dort nichts klicken. --- -## Teil 1 — Bestehende (falsche) FM-WG-Verbindung entfernen +## ⚡ Schnellpfad (wahrscheinlich ausreichend) +FM ist **schon** auf WG mit korrektem LAN-IP-Modell (`Address=10.101.0.254/24`) — sonst liefe es nicht sauber. +Dann ist die ganze Migration **ein Feld**: in der bestehenden FM-WG-Verbindung den **Peer-Endpoint** von +`xvbeo64…myfritz.net:51821` (BF-FB) auf **`bf4.emsenhuber.net:51821`** (ap1) umbiegen — fertig. +Erlaubt FRITZ!OS kein Bearbeiten des Endpoints → Verbindung **löschen + via `wg-fm.conf` neu importieren** +(gleicher Key/Address, nur neuer Endpoint). **Nur wenn FM noch die alte Transfernetz-Adresse hat**, brauchst du +Teil 1+2 unten. + +## Teil 1 — Bestehende (falsche, transfernetz-basierte) FM-WG-Verbindung entfernen +*(Nur falls FM noch NICHT auf dem LAN-IP-Modell ist.)* `Internet → Freigaben → Reiter „VPN (WireGuard)"` → die FM-Verbindung **löschen** (sie hat die falsche Transfernetz-Adresse → NAT). @@ -52,13 +66,15 @@ Transfernetz-Adresse → NAT). - peer1 allowed-address bleibt `10.101.0.0/24` (Transfernetz-/32 ist obsolet, schadet aber nicht). > Sag Bescheid — nicht-disruptiv per MikroMCP. -## Teil 4 — Verifizieren, dann erst IPsec abschalten -1. WG aktiv (IPsec an lassen). Ich pinge von ap1 sourced `10.40.20.1` → **`10.101.0.10`** + `torch wg-hub`: - - **Quelle = `10.101.0.10`** → ✅ kein NAT mehr, echtes LAN-LAN → weiter. - - Quelle = `10.255.255.2` → noch NAT → Adresse/Modus in Teil 2 nochmal prüfen. +## Teil 4 — Verifizieren, dann erst die alte FM↔BF-FB-WG abbauen +1. Neuer Tunnel aktiv (alte FM↔BF-FB-WG noch an lassen). Ich pinge von ap1 sourced `10.40.20.1` → **`10.101.0.10`** + + `torch wg-hub`: + - **Quelle = `10.101.0.10`** → ✅ kein NAT, echtes LAN-LAN → weiter. + - Quelle = `10.255.255.x` → noch NAT → Adresse/Modus prüfen (Teil 2). 2. Gegenrichtung: FM-Host → BF-Host (NAS) per IP; **SMB/445 per IP** (NetBIOS-Lehre: per IP/DNS, kein Broadcast). -3. Beide Richtungen grün → **IPsec für FM auf der BF-FB deaktivieren** → erneut testen. -4. Stabil → FM migriert. **DW** danach gleich (Address `192.168.178.1/24`, CGNAT → ausgehend/Keepalive). +3. Beide Richtungen grün → **alte FM↔BF-FB-WG auf der BF-FB deaktivieren** → erneut testen. +4. Stabil → FM migriert. **DW** läuft analog (Address `192.168.178.1/24`, CGNAT → ausgehend/Keepalive). ## Rollback -- WG an der FM-FB deaktivieren + IPsec aktivieren → Ausgangszustand. ap1-Seite unverändert lassen (inert). +- Auf der FM-FB den Peer-Endpoint zurück auf `xvbeo64…myfritz:51821` (BF-FB) biegen bzw. die alte Verbindung + wieder aktivieren → Ausgangszustand. ap1-Seite ist inert, kann bleiben. diff --git a/routeros/tp10-cutover-apply.rsc b/routeros/tp10-cutover-apply.rsc new file mode 100644 index 0000000..92d3cdb --- /dev/null +++ b/routeros/tp10-cutover-apply.rsc @@ -0,0 +1,70 @@ +# ===================================================================== +# TP10 Cutover-Apply (ap1) — WG-Hub scharf + WAN-Input-Seal +# ===================================================================== +# Zweck: ap1 in einem Rutsch von "geparkt" auf "Edge + VPN-Hub" bringen. +# WANN ANWENDEN: am Bridge-Tag, SCHRITT 2 des Runbooks — VOR dem Umstecken +# von ether1 an den FB-Passthrough-Port. +# SICHERHEIT: im Double-NAT harmlos — Peers warten auf die Spokes, der +# WAN-Drop trifft nur das (noch tote) ether1. Kein LAN-Lockout +# (Drop greift ausschliesslich in-interface-list=WAN = ether1). +# IDEMPOTENT: alle Blöcke sind wiederholbar (find-Guards / set). +# ROLLBACK: Peers disabled=yes, WG-Routen + TP10-seal-* Regeln entfernen. +# +# Anwenden via MikroMCP: upload_file -> run_script (oder /import) +# Vorab IMMER: export_config / create_backup +# --------------------------------------------------------------------- + +:log info "TP10-cutover: apply start" + +# --- A) WireGuard-Hub: Peers säubern (Transfernetz raus) + scharf schalten +# peer1/FM: erreichbar (eigener myfritz-Endpoint, KEIN CGNAT) -> Endpoint setzen +# => bidirektional (ap1 ODER FM kann aufbauen). peer2/DW bleibt Dial-in (CGNAT, Endpoint leer). +/interface/wireguard/peers +set [find where name="peer1"] allowed-address=10.101.0.0/24 \ + endpoint-address=abxhutfgsid9snmy.myfritz.net endpoint-port=52476 disabled=no +set [find where name="peer2"] allowed-address=192.168.178.0/24,10.95.10.0/24 disabled=no + +# --- B) Routen zu den Spoke-Netzen (Gateway = Interface wg-hub) +# RouterOS leitet aus allowed-address KEINE Routen ab -> explizit. +/ip/route +:if ([:len [find where dst-address="10.101.0.0/24" gateway="wg-hub"]]=0) do={ \ + add dst-address=10.101.0.0/24 gateway=wg-hub comment="TP10: FM spoke -> wg-hub" } +:if ([:len [find where dst-address="192.168.178.0/24" gateway="wg-hub"]]=0) do={ \ + add dst-address=192.168.178.0/24 gateway=wg-hub comment="TP10: DW spoke (heute) -> wg-hub" } +:if ([:len [find where dst-address="10.95.10.0/24" gateway="wg-hub"]]=0) do={ \ + add dst-address=10.95.10.0/24 gateway=wg-hub comment="TP10: DW spoke (kuenftig) -> wg-hub" } + +# --- C) Input-Chain abdichten (WAN-Seal). Reihenfolge oben->unten: +# est/rel | drop invalid | [WG 51821 vorhanden] | dhcp68 | icmp | LAN | drop WAN +/ip/firewall/filter +# 1+2 ueber die bestehende WG-Regel schieben (est zuerst, dann invalid) +:if ([:len [find where comment="TP10-seal-est"]]=0) do={ \ + add chain=input action=accept connection-state=established,related,untracked \ + comment="TP10-seal-est" place-before=[find where comment="TP10: WG hub listen (51821)"] } +:if ([:len [find where comment="TP10-seal-inv"]]=0) do={ \ + add chain=input action=drop connection-state=invalid \ + comment="TP10-seal-inv" place-before=[find where comment="TP10: WG hub listen (51821)"] } +# 4-7 NACH der WG-Regel anhaengen (in dieser Reihenfolge) +:if ([:len [find where comment="TP10-seal-dhcp"]]=0) do={ \ + add chain=input action=accept protocol=udp dst-port=68 in-interface-list=WAN \ + comment="TP10-seal-dhcp" } +:if ([:len [find where comment="TP10-seal-icmp"]]=0) do={ \ + add chain=input action=accept protocol=icmp comment="TP10-seal-icmp" } +:if ([:len [find where comment="TP10-seal-lan"]]=0) do={ \ + add chain=input action=accept in-interface-list=LAN comment="TP10-seal-lan" } +:if ([:len [find where comment="TP10-seal-wandrop"]]=0) do={ \ + add chain=input action=drop in-interface-list=WAN comment="TP10-seal-wandrop" } + +# --- D) ether1-DHCP-Client: kein ISP-DNS-Leak (DoH bleibt einzige Quelle) +# default-route-distance=1 ist bereits gesetzt (Auto-Switchover < Bridge-Fallback@2) +/ip/dhcp-client +set [find where interface="ether1"] use-peer-dns=no + +:log info "TP10-cutover: apply done" +# ===================================================================== +# NICHT Teil dieses Skripts (bereits korrekt auf ap1): +# - NAT: masquerade out-interface=ether1 (*3) + no-NAT 10.40.0.0/16 (*4) +# - Forward-FW: accept in/out-interface=wg-hub (*E/*F) +# - Default-Fallback-Route 0.0.0.0/0 via 10.40.41.254 distance=2 +# VPN-Traffic egresst ueber wg-hub -> matcht keine Masquerade -> echte LAN-IPs. +# ===================================================================== diff --git a/routeros/wan-cutover-runbook.md b/routeros/wan-cutover-runbook.md index b9a49d4..71c480b 100644 --- a/routeros/wan-cutover-runbook.md +++ b/routeros/wan-cutover-runbook.md @@ -1,6 +1,13 @@ # WAN-Cutover Runbook + Tutorial (ap1 / Liwest FB-Passthrough) -> ## ⚠️ DAS IST EIN REVERSIBLER TEST — KEIN PERMANENTER UMSTIEG +> ## 🟢 UPDATE 2026-06-25: jetzt der PERMANENTE Cutover (TP10 gekoppelt) +> Die Tunnel-Sperre ist gelöst: TP10 ist **cutover-ready**. Der permanente Ablauf (FM-FB → ap1-Apply → Passthrough → +> DDNS → Verify → alte Tunnel abbauen) steht in `docs/tp10-vpn-migration.md` + den Klick-Anleitungen +> `routeros/fritzbox-bf-bridge-cutover-klickanleitung.md` (BF-FB) und `routeros/fritzbox-wg-lanlan-klickanleitung.md` (FM-FB). +> ap1-Apply = **`routeros/tp10-cutover-apply.rsc`**. Das Folgende bleibt als **Test-/Diagnose- und Rollback-Referenz** gültig +> (Verkabelung, Konsolenpfad, `wantest-*`/`wanmac-*`, Sicherheitsnetze — alles weiterhin korrekt). + +> ## ⚠️ Ursprünglich: REVERSIBLER TEST — die Reversibilität gilt weiter bis zum Tunnel-Teardown > Die FritzBox bleibt **produktiver Router + VPN-Endpunkt + Telefon**. Wir testen nur, ob der > Bridge/Passthrough-Mode sauber funktioniert, sammeln Diagnose-Daten und **bauen danach zurück**. > **Grund:** Die BF-FritzBox terminiert aktuell **2 Site-to-Site-Tunnel** (AVM LAN-LAN: 1× IPsec +