LABNET-02 abgeschlossen: ADR-0004 akzeptiert (Architektur v2), AAR Lab-Seite
- ADR-0004: Status akzeptiert; real gebaute Architektur v2 dokumentiert (UniFi bietet kein WG-Site-to-Site -> UDM-Server + CFGMON als Client mit 'Networks Behind Client'), inkl. Messwerten aus dem Negativtest - AAR Lab-Seite: 5 Befunde, Eingrenzungsmethodik, 5 Lehren (u.a. 'Server'-Auswahl erfasst nur das Tunnel-Subnetz; Portbedingung gehoert in beide Portfelder) - README: Uebergabe-Issue-Ausnahme als auslaufend markiert - shared/lab-netzwerk.md: beide WG-Zugaenge tabellarisch Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PKhFj1S3UdD6xL2fbWPeYj
This commit is contained in:
co-authored by
Claude Fable 5
parent
97fe9e0fa8
commit
830c740a58
@@ -19,11 +19,12 @@ pushen** — solche Commits gehen beim nächsten Mirror-Lauf verloren (Rettung:
|
|||||||
`.patch` von Gitea ziehen + `git am`, siehe
|
`.patch` von Gitea ziehen + `git am`, siehe
|
||||||
[Kanonisierung](verfahren/deploy-uebergabe.md)).
|
[Kanonisierung](verfahren/deploy-uebergabe.md)).
|
||||||
|
|
||||||
**Eine befristete Ausnahme:** Die **Deploy-Übergabe-Issues** laufen auf dem
|
**Eine auslaufende Ausnahme:** Die **Deploy-Übergabe-Issues** laufen noch auf dem
|
||||||
Gitea-Mirror-Tracker, weil CFGMON und andere Hosts außerhalb des Labs `git.lab`
|
Gitea-Mirror-Tracker, weil Hosts außerhalb des Labs `git.lab` historisch nicht
|
||||||
noch nicht erreichen. Abgelöst wird das durch das Site-to-Site-VPN
|
erreichten. Seit 2026-08-01 **steht das Site-to-Site-VPN**
|
||||||
([ADR-0004](decisions/0004-site-to-site-vpn-hetzner-lab.md),
|
([ADR-0004](decisions/0004-site-to-site-vpn-hetzner-lab.md)) — bei eingeschaltetem
|
||||||
[Issue #12](https://git.lab/axion1337.chat/management/-/issues/12)).
|
Tunnel erreicht CFGMON git.lab. Der Umzug der Übergabe-Issues und der Rückbau
|
||||||
|
dieser Ausnahme sind Folgearbeit.
|
||||||
|
|
||||||
## Struktur
|
## Struktur
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,57 @@
|
|||||||
# 0004 — Site-to-Site-VPN Hetzner-Projektnetz ↔ Lab, schaltbar über die UDM
|
# 0004 — Site-to-Site-VPN Hetzner-Projektnetz ↔ Lab, schaltbar über die UDM
|
||||||
|
|
||||||
**Status:** vorgeschlagen (Design abgestimmt, Umsetzung offen → [Issue #12](https://git.lab/axion1337.chat/management/-/issues/12)) · **Datum:** 2026-08-01 · **Entscheider:** sorb
|
**Status:** akzeptiert (umgesetzt und abgenommen 2026-08-01, Testreihe 1–7 in [management#12](https://git.lab/axion1337.chat/management/-/issues/12)) · **Datum:** 2026-08-01 · **Entscheider:** sorb
|
||||||
|
|
||||||
## Kontext
|
## Kontext
|
||||||
|
|
||||||
Das Lab ist die Quelle der Wahrheit (ADR-0002), aber die Hetzner-Hosts erreichen
|
Das Lab ist die Quelle der Wahrheit (ADR-0002), aber die Hetzner-Hosts erreichten
|
||||||
`git.lab` nicht — das erzwang beim Cutover die Übergabe-Issue-Ausnahme. Ein
|
`git.lab` nicht — das erzwang beim Cutover die Übergabe-Issue-Ausnahme. Ein
|
||||||
dauerhafter Zugang von exponierten Servern ins Heimnetz soll es trotzdem nicht sein.
|
dauerhafter Zugang von exponierten Servern ins Heimnetz soll es trotzdem nicht sein.
|
||||||
|
|
||||||
## Entscheidung
|
## Entscheidung
|
||||||
|
|
||||||
Ein **eigener WireGuard-Site-to-Site-Tunnel** (getrennt vom Roadwarrior) verbindet
|
Ein **eigener WireGuard-Tunnel** (getrennt vom Roadwarrior) verbindet das
|
||||||
das Hetzner-Projektnetz `10.0.0.0/24` mit dem Lab — **die UDM initiiert**, der
|
Hetzner-Projektnetz `10.0.0.0/24` mit dem Lab-VLAN `10.58.73.0/24`. Der An/Aus-Schalter
|
||||||
An/Aus-Schalter liegt in der UniFi-UI (Bedarfsfall-Prinzip, Kontrolle im Lab):
|
liegt in der UniFi-UI; die Hetzner-Seite ist passiv und kann den Tunnel nicht selbst
|
||||||
|
öffnen (Bedarfsfall-Prinzip, Kontrolle im Lab).
|
||||||
|
|
||||||
- Endpunkt = CFGMON (WG-Listener UDP 51821, ufw nur für `178.25.213.70/32`);
|
### Wie es tatsächlich gebaut wurde (Architektur v2)
|
||||||
keine neue Portfreigabe am Heimanschluss.
|
|
||||||
- Transfernetz `10.58.75.0/24`; CFGMON ist Hetzner-seitiges Gateway
|
Der ursprüngliche Entwurf sah die **UDM als Initiator** gegen einen WireGuard-Listener
|
||||||
(Forwarding + Hetzner-Cloud-Netzwerk-Route `10.58.73.0/24 → 10.0.0.3`).
|
auf CFGMON vor. UniFi bietet Site-to-Site jedoch nur als OpenVPN/IPsec an; WireGuard
|
||||||
- Split-Tunnel strikt (AllowedIPs nur `10.58.73.0/24`), Split-DNS nur `~lab`
|
existiert dort ausschließlich als **Server** — dafür mit der Option „Networks Behind
|
||||||
→ `10.58.73.1` (kein `lab.de`, kein `axion1337.de`).
|
Client". Die Richtung wurde deshalb gedreht:
|
||||||
- Eigene UDM-Firewall-Zone: nur → Overmind:443 + DNS `10.58.73.1:53`.
|
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| **UDM** | zweiter WG-**Server** „Matrix", UDP **51841**, Tunnelnetz **10.58.75.0/24**, „Alternate Address for Clients" = `178.25.213.70` |
|
||||||
|
| **Client „Hetzner"** | `10.58.75.2`, **Networks Behind Client = `10.0.0.0/24`** |
|
||||||
|
| **CFGMON** | WG-**Client/Initiator**, dauerhaft aktiv (`enable`) + `PersistentKeepalive 25`; AllowedIPs nur `10.58.73.0/24, 10.58.75.1/32`; Split-DNS nur `~lab` → `10.58.73.1`; `ip_forward` + iptables-ACCEPT in `DOCKER-USER` (ufw ist dort inaktiv), **kein NAT** |
|
||||||
|
| **Fritzbox** | Portfreigabe UDP **51841** → `192.168.178.20` |
|
||||||
|
| **Hetzner** | Netz-Range auf **`10.0.0.0/8`** erweitert, Route `10.58.73.0/24 → 10.0.0.3` — damit erreichen alle Server im Netz das Lab **ohne eigene Konfiguration** |
|
||||||
|
| **UniFi-Firewall** | Trennung vom Roadwarrior über **Quell-/Ziel-IP** (`10.58.75.0/24` + `10.0.0.0/24`), nicht über eine eigene Zone: erlaubt sind nur `10.58.73.17:443` (git.lab/Registry) und `10.58.73.1:53` (DNS); IoT und Arbeit sind für alle VPNs komplett gesperrt |
|
||||||
|
|
||||||
## Konsequenzen
|
## Konsequenzen
|
||||||
|
|
||||||
- Übergabe-Issues können nach Umsetzung auf git.lab umziehen; die Ausnahme aus
|
- Übergabe-Issues können jetzt nach git.lab umziehen; die Ausnahme aus ADR-0002 wird
|
||||||
ADR-0002 entfällt.
|
in einem Folge-Issue zurückgebaut.
|
||||||
- Ein kompromittierter Hetzner-Host kann den Tunnel nicht öffnen (Initiative
|
- Abschaltung wirkt in **unter 4 s**, Rückkehr nach dem Einschalten in **~8 s** ohne
|
||||||
liegt bei der UDM) und sieht bei offenem Tunnel nur git.lab:443.
|
Eingriff auf der Hetzner-Seite (gemessen 2026-08-01 23:21–23:23).
|
||||||
- Der TURN-Rotations-CronJob trifft nur bei eingeschaltetem Tunnel auf git.lab —
|
- Ein kompromittierter Hetzner-Host sieht bei offenem Tunnel nur git.lab:443 und den
|
||||||
seine Gitea-PR-Ausnahme bleibt, bewusst.
|
Lab-DNS; bei geschlossenem Schalter gar nichts.
|
||||||
|
- Preis der Richtungsdrehung: eine Portfreigabe am Heimanschluss (im Ursprungsentwurf
|
||||||
|
nicht nötig). Bewertung: akzeptabel, da nur UDP 51841 und WireGuard auf unbekannte
|
||||||
|
Peers still schweigt.
|
||||||
|
- Der TURN-Rotations-CronJob trifft nur bei eingeschaltetem Tunnel auf git.lab — seine
|
||||||
|
Gitea-PR-Ausnahme bleibt bewusst bestehen.
|
||||||
- game.axion1337.de profitiert erst nach Aufnahme in den vSwitch (GAME-01).
|
- game.axion1337.de profitiert erst nach Aufnahme in den vSwitch (GAME-01).
|
||||||
|
|
||||||
## Verworfene Alternativen
|
## Verworfene Alternativen
|
||||||
|
|
||||||
- Einzelne Roadwarrior-Profile pro Server: Schalter läge auf den exponierten
|
- **UDM als Initiator** (Ursprungsentwurf): von UniFi nicht angeboten.
|
||||||
Hosts, Key-Streuung, kein Site-Routing.
|
- Einzelne Roadwarrior-Profile pro Server: Schalter läge auf den exponierten Hosts,
|
||||||
|
Key-Streuung, kein Site-Routing.
|
||||||
- Tunnel dauerhaft an: widerspricht dem Bedarfsfall-Prinzip ohne echten Gewinn.
|
- Tunnel dauerhaft an: widerspricht dem Bedarfsfall-Prinzip ohne echten Gewinn.
|
||||||
- git.lab öffentlich exponieren: größte Angriffsfläche, klar verworfen.
|
- git.lab öffentlich exponieren: größte Angriffsfläche, klar verworfen.
|
||||||
|
- Eigene UniFi-Zone für den Tunnel: technisch nicht möglich (VPN-Server bleiben in der
|
||||||
|
VPN-Zone), siehe [AAR Lab-Seite](../verfahren/aar/2026-08-01-labnet02-lab.md).
|
||||||
|
|||||||
@@ -5,6 +5,16 @@ Hosts im Lab: Overmind (git.lab, [hosts/overmind.md](../hosts/overmind.md)),
|
|||||||
der Mac. Kaskade: **Fritzbox (WAN) → UDM Pro**, kein Doppel-NAT, statische
|
der Mac. Kaskade: **Fritzbox (WAN) → UDM Pro**, kein Doppel-NAT, statische
|
||||||
Route in der Fritzbox für das Lab-VLAN.
|
Route in der Fritzbox für das Lab-VLAN.
|
||||||
|
|
||||||
|
**Zwei WireGuard-Zugänge (Stand 2026-08-01, beide gelöst/abgenommen):**
|
||||||
|
|
||||||
|
| Zugang | Server | Port | Tunnelnetz | Zweck |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| Roadwarrior „Thore" | UDM | 51840 | 10.58.74.0/24 | Handy/MacBook ins Lab (LABNET-01) |
|
||||||
|
| Site-to-Site „Matrix" | UDM | 51841 | 10.58.75.0/24 | Hetzner-Netz 10.0.0.0/24 ↔ Lab (LABNET-02, [ADR-0004](../decisions/0004-site-to-site-vpn-hetzner-lab.md)) |
|
||||||
|
|
||||||
|
Bestandsdoku (Soll-Konfiguration, Diagnose-Merksätze):
|
||||||
|
[homelab/docs → MorninglightMountain](https://git.lab/homelab/docs/-/blob/main/netz/morninglightmountain.md).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## LABNET-01 — WireGuard-Roadwarrior ins Lab kaputt (seit einigen Monaten)
|
## LABNET-01 — WireGuard-Roadwarrior ins Lab kaputt (seit einigen Monaten)
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# AAR — LABNET-02, Lab-Seite (UDM/UniFi, Einzäunung und Abnahme)
|
||||||
|
|
||||||
|
**Datum:** 2026-08-01 · **Host/Stack:** MorninglightMountain (UDM Pro), UniFi Policy Engine
|
||||||
|
**Auftrag:** Architektur v2 planen, Lab-Seite koordinieren, Testreihe 1–7 abnehmen
|
||||||
|
**Gegenstück:** [CFGMON-Seite](2026-08-01-labnet02-cfgmon.md) · Issue: `management#12`
|
||||||
|
|
||||||
|
## 1. Ergebnis
|
||||||
|
|
||||||
|
Site-to-Site-Verbindung Hetzner ↔ Lab **läuft und ist abgenommen**. Ein Hetzner-Server
|
||||||
|
erreicht `git.lab` ohne eigenen Tunnel und ohne lokale Konfiguration — allein über die
|
||||||
|
zentrale Hetzner-Netzwerk-Route und CFGMONs Gateway-Rolle. Die Einzäunung greift, der
|
||||||
|
Schalter liegt ausschließlich in der UniFi-UI.
|
||||||
|
|
||||||
|
Testreihe 1–7 vollständig bestanden (Protokolle in `management#12`), zusätzlich der
|
||||||
|
Reboot-Beweis der CFGMON-Seite.
|
||||||
|
|
||||||
|
## 2. Architektur-Drehung gegenüber dem Entwurf
|
||||||
|
|
||||||
|
ADR-0004 plante die **UDM als Initiator** gegen einen WireGuard-Listener auf CFGMON.
|
||||||
|
Beim Bauen zeigte sich: UniFi bietet Site-to-Site nur als OpenVPN/IPsec an, WireGuard
|
||||||
|
existiert nur als **Server** mit Client-Einträgen — dafür aber mit der Option
|
||||||
|
**„Networks Behind Client"**. Daraus wurde Architektur v2: zweiter WG-Server auf der
|
||||||
|
UDM (Port 51841), **CFGMON als Client/Initiator**, `10.0.0.0/24` als Netz hinter dem
|
||||||
|
Client. Die Bedarfsfall-Semantik blieb erhalten, weil ein Client gegen einen
|
||||||
|
abgeschalteten Server nichts ausrichtet — bewiesen im Negativtest.
|
||||||
|
|
||||||
|
Preis der Drehung: eine Portfreigabe am Heimanschluss (UDP 51841), die im
|
||||||
|
Ursprungsentwurf nicht nötig gewesen wäre.
|
||||||
|
|
||||||
|
## 3. Befunde
|
||||||
|
|
||||||
|
| # | Befund | Schwere | Status |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | **„Server = WireGuard Server X" erfasst in der Policy Engine nur das Tunnel-Subnetz**, nicht die über „Networks Behind Client" angehängten Netze. Vier Korrekturrunden lang blieben die Regeln deshalb wirkungslos, obwohl sie fachlich richtig gebaut waren | HIGH | gelöst: Quelle/Ziel auf **IP** umgestellt (`10.58.75.0/24` + `10.0.0.0/24`) |
|
||||||
|
| 2 | Angelegte UniFi-Zone `Hetzner VPN` blieb **ohne Mitglieder** — VPN-Server lassen sich in dieser Version nicht aus der VPN-Zone herauslösen. Ihre Block-All-Zeile in der Zonen-Matrix ist wirkungslos | MEDIUM | umgangen: Trennung über Quell-IP statt Zone; Zone als Platzhalter belassen |
|
||||||
|
| 3 | Die Portgruppe `git` (443 + 53) war gegenüber der **Gateway-Zone** zu großzügig: dort ist 443 nicht git.lab, sondern die **Router-Admin-Oberfläche**. Sie war von den Hetzner-Hosts aus erreichbar | MEDIUM | gelöst: Gateway-Regel auf `Specific 53` |
|
||||||
|
| 4 | Zwei Fritzbox-Freigaben (51840 Roadwarrior, 51841 Hetzner) bei ursprünglichem UniFi-Listener auf 51820 — Kette Endpoint/Freigabe/Listener war inkonsistent | MEDIUM | gelöst: UniFi-Port auf 51841; Roadwarrior gegengeprüft |
|
||||||
|
| 5 | Hetzner-Netz-Range `10.0.0.0/16` deckte das Routen-Ziel `10.58.73.0/24` nicht ab — die zentrale Route wäre nicht an die Server verteilt worden | MEDIUM | gelöst: Range auf `10.0.0.0/8` erweitert (nachträglich möglich, nur Erweitern) |
|
||||||
|
|
||||||
|
## 4. Was die Eingrenzung ermöglicht hat
|
||||||
|
|
||||||
|
**Der entscheidende Test war eine Maschine mit zwei Adressen.** CFGMON ist über
|
||||||
|
`10.58.75.2` (Tunnel) *und* `10.0.0.3` (Hetzner-Netz) erreichbar. Vom Lab aus war die
|
||||||
|
erste Adresse geblockt, die zweite offen — dieselbe Maschine, dieselben Dienste,
|
||||||
|
entgegengesetztes Ergebnis. Damit war Befund 1 nicht mehr Vermutung, sondern Messung.
|
||||||
|
|
||||||
|
**Timeout vs. „Connection refused" trennt Firewall von fehlendem Dienst.** Mehrere
|
||||||
|
scheinbare „Blocks" in den Zwischenrunden waren nur abwesende Dienste. Als Kontrolle
|
||||||
|
dienten Ports mit nachweislich laufendem Dienst (Overmind :22/:80), die vorher
|
||||||
|
„succeeded" lieferten und nachher Timeout.
|
||||||
|
|
||||||
|
**Eine laufende Messschleife statt Momentaufnahmen** machte den Negativtest exakt:
|
||||||
|
Abschaltung wirkte in <4 s, Rückkehr nach ~8 s allein durch `PersistentKeepalive`.
|
||||||
|
|
||||||
|
## 5. Lehren
|
||||||
|
|
||||||
|
1. **Zonen-Zuordnung ist interface-basiert, Feinauswahl ist es nicht.** Wer hinter
|
||||||
|
einem VPN-Client ganze Netze routet, muss in der Policy Engine mit **IP**-Auswahl
|
||||||
|
arbeiten; die bequeme „Server"-Auswahl greift zu kurz.
|
||||||
|
2. **Bei „Block alles außer …" gehört die Portbedingung in BEIDE Portfelder.** Der
|
||||||
|
Rückverkehr wird an seinem *Quell*-Port erkannt. Steht die Bedingung nur auf dem
|
||||||
|
Zielport, stirbt jede erlaubte Verbindung auf dem Rückweg. (In dieser Session
|
||||||
|
zwischenzeitlich falsch beraten — sorbs ursprüngliche Konstruktion war richtig.)
|
||||||
|
3. **Ausnahmelisten sind zielabhängig.** Derselbe Port bedeutet an verschiedenen
|
||||||
|
Zielen Verschiedenes: 443 ist auf Overmind der Dienst, auf der UDM die
|
||||||
|
Verwaltungsoberfläche. Eine Portgruppe pro Ziel, nicht eine für alles.
|
||||||
|
4. **Syslog Logging an der Regel hätte Runden gespart.** Es beantwortet die Frage
|
||||||
|
„greift die Regel überhaupt?" sofort, statt sie aus Wirkungen zu erschließen.
|
||||||
|
5. **Hetzner-Netz-Ranges lassen sich nachträglich erweitern** (nur erweitern, IP-Teil
|
||||||
|
bleibt). Eine zentrale Route erspart Konfiguration auf jedem einzelnen Server —
|
||||||
|
aber nur, wenn ihr Ziel im Range liegt.
|
||||||
|
|
||||||
|
## 6. Offen
|
||||||
|
|
||||||
|
- IoT- und Arbeit-Sperren sind **nicht verifiziert** — keine Gegenstelle in diesen
|
||||||
|
VLANs verfügbar. Bei nächster Gelegenheit von einem Gerät dort gegentesten.
|
||||||
|
- Regel-Beschreibungsfelder in UniFi sind leer; Verweis auf LABNET-02/ADR-0004 fehlt.
|
||||||
|
- Portgruppe heißt `git`, enthält aber 443 + 53 — sprechender Name wäre besser.
|
||||||
|
- Folgearbeit (eigenes Issue): Deploy-Übergabe-Issues nach git.lab holen,
|
||||||
|
Gitea-Ausnahme in ADR-0002/README/CLAUDE.md zurückbauen.
|
||||||
Reference in New Issue
Block a user