diff --git a/docs/GNAI-006-SEC_VPN.md b/docs/GNAI-006-SEC_VPN.md index fa24f8e..d7a2061 100644 --- a/docs/GNAI-006-SEC_VPN.md +++ b/docs/GNAI-006-SEC_VPN.md @@ -4,7 +4,7 @@ **Titel:** Homelab / Infrastructure – WireGuard VPN Gateway (LXC) Setup & Access Control -**Version:** 1.2 +**Version:** 1.3 **Status:** In Umsetzung (Schritt 1–4 & 7 fertig, Step 5/6/9 offen) @@ -32,7 +32,7 @@ Dieses Dokument beschreibt die verbindliche Einrichtung, Härtung und Verifikati | IP-Adresse LXC | `10.0.0.15/24` (Gateway: `10.0.0.1`) | | VPN Subnetz | `10.8.0.0/24` | | Listening Port | `51820/UDP` (Portweiterleitung auf Fritzbox 7530 an `10.0.0.15`) | -| DynDNS | `ghostnet.selfhost.eu` → Subdomain `vpn.ghostnet.selfhost.eu` als `WG_HOST` | +| DNS | Subdomain `vpn.ghostnet.selfhost.eu` (A-Record beim Domain-DNS-Anbieter → WAN-IP) als `WG_HOST` | | Container Engine | Podman 5.4.2, Quadlet (`/etc/containers/systemd/wg-easy.container`) | | VPN Management | wg-easy (`ghcr.io/wg-easy/wg-easy:latest`), UI auf `http://10.0.0.15:51821` (LAN-only) | | Firewall | nftables, strikte INPUT policy `drop` | @@ -182,19 +182,23 @@ WantedBy=multi-user.target Verifikation: ✅ `podman ps` zeigt `wg-easy` mit host-Netzwerk; `wg0` up mit `10.8.0.1/24`, `ListenPort 51820`; UI `http://10.0.0.15:51821` HTTP 200 (localhost & LAN-IP). -### 5. Perimeter-Portweiterleitung Fritzbox 7530 👤 (User) +### 5. Perimeter-Portweiterleitung Fritzbox 7530 👤 (User) ✅ Portweiterleitung **UDP `51820` → `10.0.0.15`** auf der Fritzbox 7530 einrichten. Verifikation: `tcpdump -i eth0 udp port 51820` auf dem LXC während Handshake-Versuch aus dem WAN. -**Status: offen** +**Status: ✅ erledigt (2026-09-09, User); End-to-End-Verifikation offen (Step 8/9).** -### 6. DynDNS-Subdomain 👤 (User) +### 6. DNS-Subdomain 👤 (User) -In NPM (10.0.0.10) die Subdomain `vpn.ghostnet.selfhost.eu` anlegen, die auf die WAN-IP zeigt (bzw. bestehendes Ghost-Record-Verfahren verwenden). +**Korrektur 2026-09-09:** Der A-Record gehört **nicht** in den Nginx Proxy Manager (NPM 10.0.0.10 – der verwaltet nur HTTP(S)-Proxy-Hosts, für UDP 51820 nutzlos) und nicht ins selfhost.eu-Web-Portal (Instanzen-Hosting, keine DNS-Zone). Die Zone `ghostnet.selfhost.eu` wird beim **DNS-Anbieter/Registrar der Domain** gepflegt – dort, wo `jellyfin./nextcloud./…` bereits existieren. -**Status: offen** +Eintrag anlegen: `vpn` → Typ **A – IPv4** → Ziel **WAN-IP** (`93.208.161.126` laut `getent` am 2026-09-09). DNS kann keine Ports tragen – der Port steht in der Client-Config (`Endpoint = vpn.ghostnet.selfhost.eu:51820`). + +> ⚠️ **WAN-IP-Check offen:** Falls die WAN-IP dynamisch ist (Fritzbox-Übersicht → „statische IP“ prüfen), veraltet der A-Record bei IP-Wechsel → DynDNS nötig. Bestehende Subdomains laufen bereits auf `93.208.161.126`. + +**Status: offen (User) – A-Record anlegen + Statisch-Check** ### 7. Peers erzeugen ✅ @@ -253,8 +257,8 @@ Deaktiviere WLAN auf beiden Testgeräten (reiner 4G/5G-Pfad), VPN aktivieren: | 2 | nftables + ip_forward | ✅ | | 3 | SSH-Härtung / admin-User | ✅ | | 4 | wg-easy Quadlet + wg0 | ✅ | -| 5 | Fritzbox Portforward | ⏳ User | -| 6 | NPM-Subdomain `vpn.ghostnet.selfhost.eu` | ⏳ User | +| 5 | Fritzbox Portforward UDP 51820 | ✅ User (2026-09-09; E2E-Check offen) | +| 6 | A-Record `vpn.ghostnet.selfhost.eu` beim Domain-DNS-Anbieter | ⏳ User | | 7 | Peers Laptop-FullAdmin / Android-LLMAdmin | ✅ | | 8 | Split-Tunnel-Konfig (`WG_ALLOWED_IPS`) | ✅ (End-to-End-Verifikation ⏳ mit Step 9) | | 9 | Penetrationstest Mobilfunk | ⏳ | @@ -270,3 +274,4 @@ Details & Entscheidungen: siehe `GNAI-006-SEC_VPN_Implementation-Log.md`. | 1.0 | – | Erster Draft | | 1.1 | 2026-09-09 | Umsetzung dokumentiert: Hostname `wireguard` (nicht `wireguard-gateway`); Testmatrix auf „Ausstehend“ (keine Tests über Mobilfunk gelaufen); `PASSWORD_HASH` = bcrypt (wg-easy/bcryptjs), nicht Argon2; Quadlet mit `EnvironmentFile=`; nftables-Konfig & ip_forward dokumentiert; wg-easy-allowedIPs-Limitation vermerkt; Umsetzungszustand-Tabellen & Implementation-Log ergänzt | | 1.2 | 2026-09-09 | Split-Tunneling konkretisiert: clientseitige AllowedIPs kommen aus Env-Variable `WG_ALLOWED_IPS` (Default `0.0.0.0/0` = Full-Tunnel!); `WG_ALLOWED_IPS` in `/opt/wg-easy/environment` gesetzt, Container neu gestartet, Env im Container verifiziert; Android-/24-Limitierung dokumentiert (nur `/32`-Einträge); Schritt 8 in „Konfig gesetzt / End-to-End offen“ zerlegt; `WG_PERSISTENT_KEEPALIVE`-Hinweis ergänzt | +| 1.3 | 2026-09-09 | DNS-Korrektur: A-Record gehört beim **Domain-DNS-Anbieter** (nicht NPM/selfhost.eu-Portal – NPM ist nur HTTP-Proxy); Fritzbox-Portforward ✅ erledigt; WAN-IP `93.208.161.126` per `getent` verifiziert; Statisch/DynDNS-Check als offen vermerkt | diff --git a/docs/GNAI-006-SEC_VPN_Implementation-Log.md b/docs/GNAI-006-SEC_VPN_Implementation-Log.md index 223ab08..77fd3bc 100644 --- a/docs/GNAI-006-SEC_VPN_Implementation-Log.md +++ b/docs/GNAI-006-SEC_VPN_Implementation-Log.md @@ -2,7 +2,7 @@ **Bezug:** GNAI-006-SEC_VPN.md **Session:** 2026-09-09 (Agent-Session, Arbeit per SSH auf LXC 105) -**Letzte Aktualisierung:** 2026-09-09 16:50 – `WG_ALLOWED_IPS`-Befund (Sektion 3.3), Split-Tunnel-Konfig auf LXC gesetzt, O3/O4 aktualisiert +**Letzte Aktualisierung:** 2026-09-09 17:15 – Fritzbox-Portforward ✅; DNS-Korrektur (A-Record beim Domain-DNS-Anbieter, nicht NPM); WAN-IP `93.208.161.126` verifiziert; O1/O2 aktualisiert **Zweck:** Nachvollziehbare Dokumentation der Umsetzungsschritte, Abweichungen vom Draft, technischen Befunde und Fehlerbehebungen. --- @@ -117,8 +117,8 @@ Client-UUIDs (LXC): `Laptop-FullAdmin` = `2e9ed910-36dc-4fbd-8694-8d904670ea19`, | # | Punkt | Typ | Blockiert durch | | --- | --- | --- | --- | -| O1 | Fritzbox 7530: Portforward **UDP 51820 → 10.0.0.15** | 👤 User | – | -| O2 | NPM (10.0.0.10): Subdomain `vpn.ghostnet.selfhost.eu` anlegen | 👤 User | – | +| O1 | Fritzbox 7530: Portforward **UDP 51820 → 10.0.0.15** | ✅ erledigt (2026-09-09) | E2E-Check mit O4/O5 | +| O2 | **A-Record** `vpn` → WAN-IP `93.208.161.126` beim **Domain-DNS-Anbieter** anlegen (Korrektur: **nicht** NPM – der ist nur HTTP-Proxy; **nicht** selfhost.eu-Portal – das verwaltet keine DNS-Zone) + Statisch-Check der WAN-IP | 👤 User | – | | O3 | Client-Profile herunterladen (Laptop + Android), `AllowedIPs` (aus `WG_ALLOWED_IPS`) + `Endpoint vpn.ghostnet.selfhost.eu:51820` prüfen | Agent + User | O1, O2 | | O4 | Split-Tunnel-Routing end-zu-end verifizieren (Step 8 SOP; Konfig steht, s. 3.3) | Agent + User | O3 | | O5 | Penetrationstest Mobilfunk (Testmatrix Sektion 4 SOP) | gemeinsam | O1, O2, O3 |