diff --git a/docs/GNAI-006-SEC_VPN.md b/docs/GNAI-006-SEC_VPN.md index 2f1ec88..91a83cd 100644 --- a/docs/GNAI-006-SEC_VPN.md +++ b/docs/GNAI-006-SEC_VPN.md @@ -4,12 +4,16 @@ **Titel:** Homelab / Infrastructure – WireGuard VPN Gateway (LXC) Setup & Access Control -**Version:** 1.3 +**Version:** 1.4 -**Status:** In Umsetzung (Schritt 1–4 & 7 fertig, Step 5/6/9 offen) +**Status:** In Umsetzung (Schritt 1–7 fertig, Step 5/6 ✅ User, Step 8/9 offen) **Vorgänger / Referenzen:** GNAI-003-INFRA, GNAI-004-SEC +**Client-Dokus (Benutzeranleitung):** +* [GNAI-006-SEC_VPN_Clients_Linux.md](GNAI-006-SEC_VPN_Clients_Linux.md) – Linux (KDE Plasma, z. B. CachyOS) +* [GNAI-006-SEC_VPN_Clients_Windows11.md](GNAI-006-SEC_VPN_Clients_Windows11.md) – Windows 11 + **Änderungsvorschlag Draft:** Hostname, Testmatrix und PASSWORD_HASH-Format gemäß Umsetzung korrigiert (siehe Changelog) --- @@ -275,3 +279,4 @@ Details & Entscheidungen: siehe `GNAI-006-SEC_VPN_Implementation-Log.md`. | 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 | +| 1.4 | 2026-09-09 | DNS ✅ (Wildcard-DynDNS war bereits ausreichend; Redundanz-A-Record harmlos, Auflösung verifiziert); **zwei Client-Einrichtungsdocs** ergänzt (Linux/KDE, Windows 11) und im Header referenziert | diff --git a/docs/GNAI-006-SEC_VPN_Clients_Linux.md b/docs/GNAI-006-SEC_VPN_Clients_Linux.md new file mode 100644 index 0000000..cb1abe0 --- /dev/null +++ b/docs/GNAI-006-SEC_VPN_Clients_Linux.md @@ -0,0 +1,105 @@ +# GNAI-006-SEC – VPN-Client-Einrichtung: Linux (KDE Plasma) + +**Bezug:** GNAI-006-SEC_VPN.md (WireGuard-VPN-Gateway LXC 105) +**Zielgruppe:** Benutzer (Laptop, z. B. CachyOS mit KDE Plasma) +**Version:** 1.0 · 2026-09-09 + +--- + +## 1. Voraussetzungen + +* WireGuard-Client-Paket installiert +* Das eigene wg-easy-Profil (`.conf`) – s. Abschnitt 2 + +## 2. Profil aus der wg-easy-UI beziehen (einmalig) + +> ⚠️ Die UI ist **nur aus dem LAN** erreichbar (nftables). Beim ersten Setup also im Heimnetz (WLAN/LAN) bleiben. + +1. Browser öffnen → `http://10.0.0.15:51821` +2. Passwort eingeben +3. In der Client-Liste den eigenen Eintrag wählen (z. B. `Laptop-FullAdmin`) +4. **`Download`** klicken → Datei `Laptop-FullAdmin.conf` wird heruntergeladen + *(Alternativ: QR-Code auf dem Display mit dem Smartphone scannen – Android/KDE-kompatibel.)* + +Die Datei enthält alles Notwendige: + +```ini +[Interface] +PrivateKey = … # nur die eigenen – NICHT weitergeben +Address = 10.8.0.2/32 +DNS = 10.0.0.1 # Fritzbox als Resolver + +[Peer] +PublicKey = … +PresharedKey = … +Endpoint = vpn.ghostnet.selfhost.eu:51820 +AllowedIPs = 10.0.0.0/24, 10.8.0.0/24, … +``` + +**Nur der Abschnitt `[Interface]` (PrivateKey!) ist privat** – `PublicKey`/`PresharedKey` dürfen geteilt werden, `PrivateKey` niemals. + +## 3. WireGuard installieren (CachyOS) + +```bash +sudo pacman -S wireguard-dkms wireguard-tools +``` + +* DKMS baut das WireGuard-Kernelmodul für den jeweils laufenden Kernel (CachyOS wechselt Kernel häufig – DKMS verhindert, dass nach einem Kernel-Update das Modul fehlt). +* Prüfen: `lsmod | grep wireguard` + +## 4. Profil importieren + +### Variante A – KDE-Systemtray (empfohlen) + +1. Oben rechts in der Taskleiste → **Systemtray-Icon** (kleines WLAN/Schild-Symbol) – erscheint nach Installation von `wireguard-tools` + `plasma-workspace` (bzw. `plasma-vault`-unabhängig, Teil der Standard-KDE-Pakete). +2. Rechtsklick auf das Icon → **„New from file…“** → die `.conf` wählen. +3. Eintrag erscheint in der Liste → Rechtsklick → **„Connect“**. + +### Variante B – `wg-quick` (Konsole / Autostart) + +```bash +# Profil in das Konfigurationsverzeichnis legen +install -m 600 ~/Downloads/Laptop-FullAdmin.conf /etc/wireguard/ + +# Verbindung starten (ohne root) +sudo wg-quick up wg0 + +# Status +wg show wg0 + +# Verbinden getrennt +sudo wg-quick down wg0 +``` + +**Autostart (optional):** `/etc/wireguard/wg0.conf` mit `[Interface] PrivateKey=…` vorhanden → `sudo systemctl enable wg-quick@wg0`. + +## 5. Verifikation + +```bash +ip -br addr show wg0 # wg0 UP, 10.8.0.2/32 +ping -c 3 10.8.0.1 # VPN-Gateway (muss funktionieren) +ping -c 3 10.0.0.2 # Proxmox – LAN via Tunnel +ping -c 3 10.0.0.90 # LLM-Server – LAN via Tunnel +curl -s ifconfig.co # eigene ÖFFENTLICHE IP (Nicht-LAN: muss die WAN-IP des Providers sein, NIE 10.0.0.x) +``` + +**Erwartet (Split-Tunneling):** +* LAN-Hosts (`10.0.0.0/24`) → **über den VPN-Tunnel** +* Alles andere (Internet) → **direkt** (Nicht-LAN: Provider-NAT) +* `curl ifconfig.co` zeigt deine **normale** Außen-IP – **nicht** eine VPN-IP + +## 6. Fehlersuche + +| Symptom | Ursache / Lösung | +| --- | --- | +| „No handshake yet“ nach 30 s | (1) LAN: `http://10.0.0.15:51821` erreichbar? (2) Nicht-LAN: DNS von `vpn.ghostnet.selfhost.eu` auflösen (`nslookup vpn.ghostnet.selfhost.eu` → muss `93.208.161.126` zeigen); Fritzbox-Portforward UDP 51820 aktiv? | +| `wg-quick` meldet `WireGuard kernel module not loaded` | `sudo modprobe wireguard` (DKMS nicht installiert oder Kernel-Update → `sudo pacman -S wireguard-dkms`) | +| LAN-Ping funktioniert, `curl ifconfig.co` zeigt VPN-IP | Client ist (fälschlich) im Full-Tunnel-Modus → `AllowedIPs` in der `.conf` prüfen – muss **nur** `10.0.0.0/24,10.8.0.0/24,…` sein, **nicht** `0.0.0.0/0` | +| `Permission denied` bei `wg-quick up` | `sudo` vergessen (oder: `sudo usermod -aG wheel $USER` + `sudo /usr/bin/setfacl -m u:$USER:rw /etc/wireguard/wg0.conf` für rootless) | +| KDE-Icon fehlt | `plasma-workspace`-Paket installiert; Systemtray neu starten: `plasmashell --replace` | + +## 7. Sicherheitshinweise + +* **Niemals** den PrivateKey aus der `.conf` in einen Chat/Die-Cloud/Chat-Verlauf stellen. +* `.conf` mit `chmod 600` (`install -m 600` s. oben) – kein World-Readable. +* Bei Verdacht auf Kompromittierung: in der wg-easy-UI Client **deaktivieren** (Toggle) oder **delete** – der Server erkennt den Key nicht mehr an. diff --git a/docs/GNAI-006-SEC_VPN_Clients_Windows11.md b/docs/GNAI-006-SEC_VPN_Clients_Windows11.md new file mode 100644 index 0000000..3170b50 --- /dev/null +++ b/docs/GNAI-006-SEC_VPN_Clients_Windows11.md @@ -0,0 +1,86 @@ +# GNAI-006-SEC – VPN-Client-Einrichtung: Windows 11 + +**Bezug:** GNAI-006-SEC_VPN.md (WireGuard-VPN-Gateway LXC 105) +**Zielgruppe:** Benutzer (Windows 11) +**Version:** 1.0 · 2026-09-09 + +> Windows 11 nutzt WireGuard über den **integrierten WireGuard-Treiber** (Hyper-V-basiert). Es braucht **kein** extra Kernelmodul – es reicht die Desktop-App. + +--- + +## 1. WireGuard-App installieren + +### Variante A – Microsoft Store (empfohlen) + +1. **Microsoft Store** öffnen → Suche: **WireGuard** +2. Veröffentlicher: **WireGuard** (wireguard.com) → **Installieren** +3. App startet leer („No connections“) + +### Variante B – Installer (GitHub-Release) + +1. → **Windows** → `wireguard-x.x.x-amd64.msi` +2. Installieren (Admin-Prompt bestätigen) + +## 2. Profil aus der wg-easy-UI beziehen (einmalig) + +> ⚠️ Die UI ist **nur aus dem LAN** erreichbar. Beim ersten Setup also im Heimnetz. + +1. Browser → `http://10.0.0.15:51821` → Passwort +2. Eigene Client-Karte (z. B. `Laptop-FullAdmin`) → **`Download`** → `.conf` wird gespeichert + +**Profil in die App importieren:** + +1. WireGuard-App starten → **„+“** (oben rechts) → **„Import from file…“** +2. Die heruntergeladene `.conf` wählen → Eintrag erscheint in der Verbindungsliste + +*(Alternativ: QR-Code aus der UI mit dem Telefon scannen → in WireGuard auf dem Telefon; für Windows nur File-Import.)* + +## 3. Verbinden + +1. In der App den Eintrag anklicken (z. B. `Laptop-FullAdmin`) +2. **„Start“** (grüner Schalter) +3. Taskleiste unten rechts: **Netzwerk-Icon** zeigt ein kleines **WireGuard-Schild** → verbunden +4. Nach 2–5 s steht die Tunnel-IP `10.8.0.x/32` (s. Status unter „Verbinden“) + +## 4. Verifikation + +**PowerShell:** + +```powershell +# 1. Tunnel-IP +Get-NetIPAddress -InterfaceAlias "Laptop-FullAdmin" | Select-Object IPAddress +# erwartet: 10.8.0.2 (oder .3) + +# 2. LAN via Tunnel +ping 10.8.0.1 # VPN-Gateway +ping 10.0.0.2 # Proxmox +ping 10.0.0.90 # LLM-Server + +# 3. Außen-IP (muss die NORMALE Provider-IP sein, nicht 10.0.0.x) +Invoke-RestMethod "https://ifconfig.co" +``` + +**Split-Tunneling-Erwartung:** +* `10.0.0.0/24` + `10.8.0.0/24` → **Tunnel** +* Internet (alles andere) → **direkt**, Außen-IP = deine normale WAN-IP + +## 5. Fehlersuche + +| Symptom | Ursache / Lösung | +| --- | --- | +| „No handshake yet“ nach 30 s | (1) Im LAN? (UI erreichbar `http://10.0.0.15:51821`) (2) Nicht-LAN: `nslookup vpn.ghostnet.selfhost.eu` → muss auf WAN-IP zeigen; Fritzbox-Forward UDP 51820 aktiv? | +| App meldet `No WireGuard adapter found` | Windows 11 nutzt den integrierten WireGuard-Treiber – kein extra Setup nötig. Prüfen: *Einstellungen → Apps → Optionalle Features* → „Windows-Hyper-V-Plattform“ / „Windows Internal WireGuard“ aktiv. Fehlt es → Feature aktivieren (Admin) → Neustart. | +| Ping ins LAN klappt, aber `Invoke-RestMethod ifconfig.co` zeigt VPN-IP | `AllowedIPs` in der `.conf` ist `0.0.0.0/0` (Full-Tunnel) → neu aus UI herunterladen (wg-easy-Env `WG_ALLOWED_IPS` muss gesetzt sein, s. GNAI-006) | +| „Access is denied“ beim Start | App als Administrator starten (Einmalig) oder Firewall-Einstellung prüfen: Windows Firewall blockiert gelegentlich ausgehende UDP 51820 → Ausnahme hinzufügen. | +| VPN-Icon in der Taskleiste fehlt | Taskleiste rechts → Pfeil → „WireGuard“ → **pinnen** (Rechtsklick → „Auf Taskleiste pinnen“) | + +## 6. Autostart / Verhalten bei Netzwerkwechsel + +* **Standard:** Verbindung bleibt aktiv, wechselt mit dem Netzwerk (WAN-Wechsel = kurzer Datenverlust, dann Re-Handshake). +* **Autostart bei Login:** WireGuard-App → Einstellungen (Zahnrad) → „Start automatically at login“ (falls verfügbar; in älteren Builds: `shell:startup` mit `wireguard.exe --startup` – **empfohlen: Store-Version**). + +## 7. Sicherheitshinweise + +* **Niemals** den `[Interface]`-Abschnitt der `.conf` (PrivateKey) teilen, per E-Mail/Chat/Kopie. +* `.conf` auf dem Rechner mit NTFS-Berechtigungen schützen (Standard-User-Ordner = `Users\\Downloads` – genügt für Einzelplatz; bei Mehrbenutzer-Rechner unter `C:\Users\Public` **nicht** ablegen). +* Bei Verdacht auf Kompromittierung: wg-easy-UI → Client deaktivieren/löschen → neu erzeugen (alter Key wird dann nie mehr akzeptiert).