Add fail-closed WireGuard container gateway

This commit is contained in:
Mikei386
2026-08-22 20:48:49 +02:00
parent 2f3bdde8b0
commit 0e5876f1a9
17 changed files with 365 additions and 109 deletions
+40 -42
View File
@@ -1,55 +1,53 @@
# WireGuard-Heimseite
# WireGuard über die Fritzbox
Der Installer kann nur den KI-Host konfigurieren. Einmalig muss der vorhandene
WireGuard-Router im Heimnetz den neuen Peer kennen. Ohne diesen externen Schritt
kann kein automatisches Skript auf dem Uni-Host den Tunnel fertigstellen.
## Gewählter Betriebsmodus
## Peer ergänzen
Athena verwendet die Fritzbox-Konfiguration für **einen einzelnen
WireGuard-Client**. Die unveränderte Exportdatei wird als root-only Secret nach
Beispiel mit KI-WireGuard-Adresse `10.77.0.2/32`:
```ini
[Peer]
PublicKey = <PUBLIC-KEY-DES-KI-HOSTS>
AllowedIPs = 10.77.0.2/32
```text
/etc/mike-ai/wireguard/fritz-athena.conf
```
Das Heimgerät muss das LAN `192.168.1.0/24` zum Tunnel routen können. Geräte im
Heimnetz benötigen entweder eine Route für `10.77.0.2/32` über den
WireGuard-Router oder der Router maskiert den VPN-Verkehr passend.
kopiert (`chmod 600`). Sie gehört weder ins Git-Repository noch in Backups ohne
Verschlüsselung. Eine LAN-zu-LAN-Konfiguration ist für diesen Host nicht nötig.
## KI-Internetzugang über zuhause
Der Tunnel endet im Container `mike-ai-wireguard-gateway`. Nur dieser Container
erhält `NET_ADMIN` und `/dev/net/tun`. Open WebUI und Router veröffentlichen
keine Host-Ports; der Gateway stellt ausschließlich Port 8080 und 8081 auf der
von der Fritzbox zugeteilten VPN-Adresse bereit.
Wenn `WG_ROUTE_AI_INTERNET=true` gesetzt ist, muss der Heim-Peer IPv4-Forwarding
und NAT ins WAN erlauben. Das wird auf dem Heimrouter eingerichtet, nicht auf
dem Universitätsnetz. Beispielprinzip für nftables:
## Split der Verantwortlichkeiten
```nft
table inet mike_ai {
chain forward {
type filter hook forward priority 0; policy accept;
iifname "wg0" ip saddr 10.77.0.2 accept
oifname "wg0" ip daddr 10.77.0.2 ct state established,related accept
}
}
- Debian, Paketverwaltung und SSH benutzen die normale Standortverbindung.
- Die Docker-Netze `frontend` und `tools-egress` werden per Quellrouting zum
WireGuard-Gateway geschickt.
- Interner Docker-Verkehr bleibt lokal und durchquert den Tunnel nicht.
- Der Fritzbox-Export darf `0.0.0.0/0` und `::/0` enthalten. Das ändert **nicht**
die Default-Route des Debian-Hosts, sondern nur die des Gateway-Namespace.
- Fällt WireGuard aus, bleibt die Quellroute auf den dann unerreichbaren
Gateway zeigen: Anwendungscontainer fallen geschlossen aus.
table ip mike_ai_nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip saddr 10.77.0.2 oifname "<HEIM-WAN-INTERFACE>" masquerade
}
}
## Kontrolle ohne Geheimnisse auszugeben
```bash
docker inspect -f '{{.State.Health.Status}}' mike-ai-wireguard-gateway
docker exec mike-ai-wireguard-gateway wg show wg0 latest-handshakes
systemctl status mike-ai-container-vpn-guard
```
Die tatsächlichen Interface-Namen und die bestehende Firewall des Heimrouters
gehen vor. Regeln nicht blind neben eine bereits verwaltete Firewall kopieren.
Der Healthcheck verlangt einen Handshake, der jünger als drei Minuten ist.
Open WebUI liegt unter `http://<VPN-IP>:8080`, der Router unter
`http://<VPN-IP>:8081`. An der physischen Standortadresse dürfen beide Ports
nicht antworten.
## Sicherheitsprüfung
## Getestetes Verhalten am 22. August 2026
1. Vom Heimnetz `10.77.0.2` erreichen.
2. Open WebUI auf `10.77.0.2:8080` erreichen.
3. Aus dem Universitäts-LAN Port 8080/8081 nicht erreichen.
4. `wg0` am KI-Host stoppen: KI-Container dürfen nun weder Heimnetz noch
Internet erreichen.
5. Der Debian-Host selbst darf weiterhin nur die ausdrücklich gewünschte
Administration über das Uni-LAN anbieten.
- Fritzbox-Handshake und Datenverkehr in beide Richtungen: erfolgreich
- Open WebUI und Router über die VPN-Adresse: HTTP 200
- dieselben Ports über die physische Hostadresse: geschlossen
- VPN-Gateway gestoppt: ausgehender Open-WebUI-Test blockiert (fail-closed)
- Gateway erneut gestartet: automatischer aktueller Handshake
Die Exportdatei muss Bestandteil des verschlüsselten Disaster-Recovery-Satzes
sein. Ohne sie kann ein neuer Host den Heimtunnel nicht rekonstruieren.