Files
bf-infra/docs/tp10-vpn-migration.md
Christoph Emsenhuber a36c160903 TP10 💡 v6-Variante: WARP→Gelis öffentl. v6-FB als CGNAT-freie Fernwartung
- Gelis CGNAT ist nur v4 → ihre FB ĂŒber natives v6 erreichbar (Port offen).
  WARP (schon im Einsatz) liefert Christoph outbound-v6 trotz Liwest-v4-only.
- PoC = ad-hoc Fernwartung; Daueform = direktes WG ap1↔Geli-FB ĂŒber echtes
  v6 (HE-6in4, da Liwest auch mit Fiber kein v6) statt Hub-Spoke-Gymnastik.
- EndgerĂ€te (Note10, Cudy) bleiben v6-agnostisch: v6 nur Ă€ußerer Transport,
  LAN bleibt IPv4. Nicht fĂŒr Telefonie.
- teilprojekte.md: TP10 von ⏞ PAUSIERT auf đŸ…żïž VERTAGT (Bridge-Cutover-BĂŒndelung).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 18:23:27 +02:00

92 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TP10 — Multi-Site-VPN-Migration (2× AVM-S2S → 2× WireGuard, Hub auf ap1)
> Stand 2026-06-16 · Research: `docs/research/vpn-comparison.md` · Plan: `~/.claude/plans/pure-wibbling-graham.md`
> gated: permanenter FB-Bridge-Mode (AP4.1) hÀngt an diesem TP.
> **Reihenfolge fix: VPNs migrieren → Liwest-Anruf (Bridge) → FB wird Modem.**
> ## đŸ…żïž STATUS 2026-06-17: VERTAGT — gebĂŒndelt mit dem FB-Bridge-Cutover
> **Entscheidung:** TP10 nicht mehr als Parallel-Migration vorab, sondern **zusammen mit dem permanenten Bridge-
> Cutover** (VPN-auf-FB ⊕ FB-Bridge schließen sich aus). Am Bridge-Tag hat ap1 die echte Public-IP → **kein
> FB-Port-Forward-Umweg** mehr; Spokes zeigen direkt auf ap1 (DDNS). **FM-PoC ✅** hat den Fix bewiesen (Root Cause:
> FB masqueradet, wenn die WG-Interface-`Address` eine **Transfernetz-IP** statt der **FB-LAN-IP** ist — AVM Proxy-ARP).
> **Park-Zustand ap1:** Peers `disabled`, WG-Routen entfernt (FM/DW wieder ĂŒber die FB), `wg-hub` bleibt (Key erhalten),
> Firewall bleibt (TP5-Vorarbeit). Beide VPN vorerst ĂŒber die FB: **FM = IPsec, DW = FB-WG.**
> **Resume:** `routeros/fritzbox-wg-lanlan-klickanleitung.md` (FB-LAN-IP als Interface-Adresse, Verify gegen `10.101.0.10`).
## 💡 Variante DW/Geli — v6-direkt statt CGNAT-Spoke (Idee 2026-06-17, fĂŒr spĂ€ter)
Gelis CGNAT ist **nur v4**; ihre FritzBox hat **öffentliches natives v6** (`2a0e:7a02:31c:3000::/56`, rotiert ~30h →
MyFRITZ-DDNS) → ihre FB ist **ĂŒber v6 von außen erreichbar**. Der **v6-Inbound-Port auf Gelis FB ist bereits offen.**
- **Sofort/PoC (ad-hoc Fernwartung, da Geli kein Zero Trust hat):** Christophs **WARP** (schon im Einsatz) gibt ihm
outbound-v6 trotz Liwest-v4-only → `Christoph(WARP-v6) → CF-Edge → Gelis v6-FB`. CGNAT-immun, reversibel.
Nur Fernwartung — **nicht** fĂŒr Telefonie (Calls = Messenger-Relays).
- **Daueform (sauberer):** echtes v6 auf BF-Seite via **HE-6in4** (Liwest gibt voraussichtlich **auch mit Fiber kein v6**)
→ **direktes WireGuard ap1↔Geli-FB ĂŒber v6**, kein Cloudflare im Datenpfad, kein Tunnel-in-Tunnel (WARP ist selbst WG),
**umgeht die ganze Hub-&-Spoke-CGNAT-Gymnastik** unten (Geli mĂŒsste nicht mehr outbound zum Hub initiieren — v6↔v6 ist
symmetrisch erreichbar). Siehe Memory `project-ipv6-state`.
- **EndgerĂ€te bleiben v6-agnostisch:** v6 ist **nur der Ă€ußere Transport** zwischen FB-WAN und Christophs Endpunkt; im
Tunnel lÀuft Gelis LAN weiter **rein IPv4** (192.168.178.0/24). Ihre GerÀte (Galaxy Note 10, Cudy-APs als Bridge, NAS 
)
mĂŒssen **kein v6 können** — sie sehen nie ein v6-Paket. v6-EigenfĂ€higkeit eines Backend-GerĂ€ts wĂ€re nur nötig, wollte man
es **direkt ohne Tunnel** ĂŒber v6 erreichen (klobig: Freigabe pro GerĂ€t + rotierendes Prefix) — macht man nicht.
## Zielbild
- **ap1 (hAP axÂČ, 7.23.1) = WireGuard-Hub** (nativ). FM & DW = FritzBox-Spokes (hub-&-spoke, keine Zusatz-HW).
- Ablösung der **2 produktiven AVM-LAN-LAN-Tunnel** auf der BF-FB → **2× WireGuard auf ap1**:
- **FM** `10.101.0.0/24` (GW .254) — war **IPsec**.
- **DW/Geli** `192.168.178.0/24` (GW .1, **CGNAT**, Antennengemeinschaft GeroldsgrĂŒn) — war **WireGuard**.
## ✅ As-built auf ap1 (Phase A erledigt, 2026-06-16)
| Objekt | Wert |
|---|---|
| Interface `wg-hub` | Listen **UDP 51821**, MTU 1412, **keine IF-IP**, running |
| Hub-Public-Key | `P/bztIk13cAmLHbN6oHGGnWAKLZsqR5TXAbFP+NGGBk=` |
| Endpoint (fĂŒr Spokes) | **`xvbeo64jqlqd9gfo.myfritz.net:51821`** (MyFRITZ-FQDN) |
| Peer FM (`peer1`) | pub `dzRY0lnnUygijChWe5wXZmXPeNcbdALpqBptA3fyiVE=`, allowed `10.255.255.2/32,10.101.0.0/24`, Endpoint leer |
| Peer DW (`peer2`) | pub `FqYZLztQ/qME5VDie5QLGH++5299WJiE1dPpQnPbzUw=`, allowed `10.255.255.3/32,192.168.178.0/24`, Endpoint leer |
| Route | `10.101.0.0/24` → wg-hub · `192.168.178.0/24` → wg-hub (beide active) |
| Firewall | input accept udp/51821 · forward accept in/out wg-hub (TP5-Vorarbeit) |
| NAT | **keine Änderung nötig** — masquerade ist out-interface bridge/ether1; Tunnel-Egress = wg-hub → nie NATed |
**Port 51821 (statt 51820):** Die BF-FB hĂ€lt ihren eigenen WG-Server auf 51820 fĂŒr den **noch laufenden DW-Tunnel**.
51821 fĂŒr den Hub vermeidet die Kollision wĂ€hrend der Parallelphase.
**Spoke-Configs (Private-Keys, NICHT im Git):** `routeros/.secrets/wg-fm.conf`, `routeros/.secrets/wg-dw.conf`.
## ✅ Vorbedingung (User erledigt)
- **FB-Portfreigabe** UDP **51821** → `10.40.41.1` (ap1) gesetzt.
## Phase B — Cutover (pro Spoke, Parallelphase) — OFFEN
> Pro Standort: neuen WG-Tunnel hochziehen, **verifizieren**, erst dann den alten AVM-Tunnel abschalten.
### B1 — FM zuerst (alter IPsec-Tunnel bleibt parallel an)
1. `routeros/.secrets/wg-fm.conf` in die **FM-FritzBox** importieren:
`Internet → Freigaben → VPN (WireGuard) → Verbindung hinzufĂŒgen → eigene Konfiguration importieren`.
- ⚠ Falls FRITZ!OS keinen Import mit vorgegebenem Key erlaubt: FB-WG-Verbindung manuell anlegen, FB-**Public-Key**
ablesen und melden → wird in `peer1` auf ap1 eingetragen (`manage_wireguard_peer` set public-key).
2. **Handshake prĂŒfen:** `list_wireguard_peers` → `peer1` last-handshake aktuell, rx/tx > 0.
3. **L3-Verify (NetBIOS-Lehre, s.u.):** Ping ap1 → ein Host in `10.101.0.0/24`; Gegenrichtung FM → BF-Host (NAS);
**SMB per IP (TCP 445)** testen, **nicht** Netzwerkumgebung/Broadcast.
4. GrĂŒn → **IPsec-Tunnel** fĂŒr FM auf der BF-FB deaktivieren → erneut prĂŒfen.
### B2 — DW/Geli danach (alter FB-WG-Tunnel auf 51820 bleibt parallel an)
5. `routeros/.secrets/wg-dw.conf` in die **DW-FritzBox** importieren (CGNAT → wĂ€hlt ausgehend, Keepalive 25).
6. Handshake + L3-Verify (Ping/SMB per IP in `192.168.178.0/24` ↔ BF).
7. GrĂŒn → alten **DW-WG-Server/Tunnel** auf der BF-FB abbauen.
## NetBIOS / Namensauflösung (FM — bekannter Stolperstein)
FrĂŒherer FM-WG-Versuch scheiterte an „NetBIOS nicht geroutet". NetBIOS-Namensauflösung lĂ€uft ĂŒber **Broadcasts
(UDP 137/138)**, die ĂŒber einen *gerouteten* Tunnel grundsĂ€tzlich nicht traversieren — kein Routing-Bug.
→ **L3 zuerst per IP beweisen** (Ping + SMB/445); Namensauflösung per **IP oder DNS** lösen (statische EintrĂ€ge),
nicht ĂŒber Broadcast-Browsing. Unser Design fĂŒhrt beide Richtungen in AllowedIPs/Routes → unicast muss laufen.
## Phase C — Abschluss (nach beidseitig grĂŒn, ≄1 Tag stabil)
8. TP5-Firewall auf ap1 finalisieren (WG-Regeln behalten).
9. **DDNS-Übergabe:** MyFRITZ lĂ€uft ĂŒber die FB, entfĂ€llt evtl. im Bridge-Mode → ap1 braucht eigenes DDNS
(`/ip cloud` mynetname / DynDNS); Spoke-Endpoints dann auf ap1-FQDN umstellen.
⚠ PrĂŒfen, ob `/ip cloud` trotz device-mode=home lĂ€uft (scheduler/fetch geblockt).
10. **Liwest-Anruf** fĂŒr FB-Bridge-Mode → FB wird Modem, ether1 = WAN, Portfreigabe entfĂ€llt.
11. Entblockt: NAS/Controller-IP-Migration (IP-Plan Phase 3) + Wegfall Double-NAT.
## RĂŒckbau (falls nötig)
- ap1-Seite vollstÀndig reversibel: Peers/Routen/Firewall via `manage_*` `action=remove`, `wg-hub` löschen.
- Alte AVM-Tunnel erst nach Verifikation abschalten → jederzeit reaktivierbar.