Add fail-closed WireGuard container gateway
This commit is contained in:
+40
-42
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user