Add WireGuard-only SSH recovery path

This commit is contained in:
Mikei386
2026-08-23 08:55:06 +02:00
parent 0887e4ba90
commit 16a6288a4d
3 changed files with 23 additions and 1 deletions
+9
View File
@@ -63,6 +63,7 @@ werden nicht ausgegeben. Sie liegen root-only unter `/etc/mike-ai`.
- Open WebUI: `http://<WIREGUARD-IP>:8080` - Open WebUI: `http://<WIREGUARD-IP>:8080`
- Router: `http://<WIREGUARD-IP>:8081` - Router: `http://<WIREGUARD-IP>:8081`
- SSH fallback: `ssh root@<WIREGUARD-IP>` (key-only, forwarded to host sshd)
- llama.cpp-WebUI: absichtlich deaktiviert und nicht veröffentlicht - llama.cpp-WebUI: absichtlich deaktiviert und nicht veröffentlicht
```bash ```bash
@@ -71,8 +72,16 @@ sudo docker inspect -f '{{.State.Health.Status}}' mike-ai-wireguard-gateway
sudo docker compose --env-file /etc/mike-ai/stack.env \ sudo docker compose --env-file /etc/mike-ai/stack.env \
-f /opt/mike-ai/stack/compose.yaml ps -f /opt/mike-ai/stack/compose.yaml ps
curl http://<WIREGUARD-IP>:8081/health curl http://<WIREGUARD-IP>:8081/health
ssh -o BatchMode=yes root@<WIREGUARD-IP> true
``` ```
Der SSH-Fallback lauscht ausschließlich auf der IPv4-Adresse von `wg0` im
WireGuard-Gateway-Container. Er wird nicht als Docker-Port auf dem
Standort-Interface veröffentlicht. Das Gateway leitet die Verbindung an den
hostseitigen Gateway-Endpunkt des festen `frontend`-Netzes weiter; Anmeldung,
Schlüsselprüfung und Protokollierung erfolgen weiterhin durch den normalen
OpenSSH-Dienst des Hosts.
Die TTS-Verbindung wird für eine frische Open-WebUI-Datenbank automatisch als Die TTS-Verbindung wird für eine frische Open-WebUI-Datenbank automatisch als
OpenAI-kompatibler Audio-Endpunkt des Routers vorbelegt. Der Router reicht sie OpenAI-kompatibler Audio-Endpunkt des Routers vorbelegt. Der Router reicht sie
intern an Piper weiter; Port 8085 wird nicht am Host veröffentlicht. Ein intern an Piper weiter; Port 8085 wird nicht am Host veröffentlicht. Ein
+4
View File
@@ -55,6 +55,9 @@ Minute sowie ein aktueller WireGuard-Handshake.
- SSH bleibt auf der Standort-Schnittstelle erreichbar, akzeptiert aber nur - SSH bleibt auf der Standort-Schnittstelle erreichbar, akzeptiert aber nur
Public-Key-Anmeldungen. Vor dem Transport muss der Schlüsselzugriff getestet Public-Key-Anmeldungen. Vor dem Transport muss der Schlüsselzugriff getestet
werden. werden.
- Zusätzlich stellt das WireGuard-Gateway unter seiner VPN-Adresse Port 22 als
key-only SSH-Notweg zum Host bereit. Der Listener ist explizit an `wg0`
gebunden und wird nicht auf dem Standort-Interface veröffentlicht.
- Der WireGuard-Tunnel muss **vor dem Transport** erfolgreich aufgebaut und von - Der WireGuard-Tunnel muss **vor dem Transport** erfolgreich aufgebaut und von
zuhause erreichbar getestet sein. zuhause erreichbar getestet sein.
- Für WireGuard braucht Athena keine eingehende Portfreigabe am Standort: Der - Für WireGuard braucht Athena keine eingehende Portfreigabe am Standort: Der
@@ -74,6 +77,7 @@ Minute sowie ein aktueller WireGuard-Handshake.
4. `mike-ai-wireguard-gateway` stoppen: Container-Egress muss scheitern; 4. `mike-ai-wireguard-gateway` stoppen: Container-Egress muss scheitern;
Gateway wieder starten und aktuellen Handshake prüfen. Gateway wieder starten und aktuellen Handshake prüfen.
5. Von zuhause aus ausschließlich über die spätere VPN-Adresse zugreifen. 5. Von zuhause aus ausschließlich über die spätere VPN-Adresse zugreifen.
Dabei sowohl Open WebUI als auch `ssh root@<WIREGUARD-IP>` prüfen.
Ohne erfolgreich getesteten WireGuard-Tunnel und die UEFI-Stromoptionen gilt der Ohne erfolgreich getesteten WireGuard-Tunnel und die UEFI-Stromoptionen gilt der
Host nicht als bereit für einen unbeaufsichtigten Standort. Host nicht als bereit für einen unbeaufsichtigten Standort.
@@ -46,7 +46,7 @@ ip -4 route replace default dev wg0
ip -6 route replace default dev wg0 2>/dev/null || true ip -6 route replace default dev wg0 2>/dev/null || true
cleanup() { cleanup() {
kill "${proxy_ui_pid:-}" "${proxy_router_pid:-}" 2>/dev/null || true kill "${proxy_ui_pid:-}" "${proxy_router_pid:-}" "${proxy_ssh_pid:-}" 2>/dev/null || true
wg-quick down "$RUNTIME" 2>/dev/null || true wg-quick down "$RUNTIME" 2>/dev/null || true
} }
trap cleanup EXIT INT TERM trap cleanup EXIT INT TERM
@@ -65,4 +65,13 @@ proxy_ui_pid=$!
socat TCP-LISTEN:8081,bind=0.0.0.0,reuseaddr,fork TCP:router:8081 & socat TCP-LISTEN:8081,bind=0.0.0.0,reuseaddr,fork TCP:router:8081 &
proxy_router_pid=$! proxy_router_pid=$!
# Emergency SSH path for unattended operation. Bind explicitly to WireGuard's
# IPv4 address, never to a Docker-facing interface or the physical host. The
# target is the host-side gateway of the fixed frontend bridge. Host sshd still
# enforces its normal key-only authentication policy.
wg_ipv4=$(ip -4 -o address show dev wg0 | awk 'NR == 1 { split($4, address, "/"); print address[1] }')
[ -n "$wg_ipv4" ] || { echo "WireGuard IPv4 address is missing" >&2; exit 1; }
socat TCP-LISTEN:22,bind="$wg_ipv4",reuseaddr,fork TCP:172.30.10.1:22 &
proxy_ssh_pid=$!
wait "$proxy_ui_pid" wait "$proxy_ui_pid"