feat(vpn): VPN-Satelliten — WireGuard-Clients als Satelliten ohne Installation beim Kunden

Einstellungen → VPN → WireGuard → Clients: WireGuard-Datei des Kunden
hochladen/einfuegen (editierbar), je Verbindung Schalter (an = auch nach
Neustart, aus = bleibt aus), bearbeiten, Download, ℹ-Verlauf, loeschen;
Log-Aufbewahrung im Reiter Einstellungen. Server-Reiter mit Anleitung fuer
UDP 443 (NPM-Stream bzw. ohne Nginx), Server selbst folgt.

Jede Verbindung ist ein eigener Container (aria-vpn-<id>, Image aus
satellite/Dockerfile.vpn) mit eigenem Netz-Namensraum: WireGuard + normaler
satellite.py (kind=vpn). Firewall im Container: Tunnel nur ausgehend, keine
Verbindung Kundennetz → ARIA; ins ARIA-Netz nur RVS + Endpunkt. Routen ohne
wg-quick, RVS-Weg nie durch den Tunnel (auch bei 0.0.0.0/0). Scan ueber den
Tunnel aktiv per TCP (kein mDNS/ARP), FritzBox an Port 49000 erkannt.
Satelliten-Ansicht: eigene Gruppe VPN-Satelliten.

Lokal Ende-zu-Ende getestet (Kunde mit WG-Server + LAN, Fake-RVS):
Tunnel, Verlauf, Scan, Sperren in beide Richtungen, Volltunnel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-01 13:30:10 +01:00
co-authored by Claude Opus 5.5
parent ca35f5f1e0
commit 627b826226
9 changed files with 1155 additions and 12 deletions
+3
View File
@@ -3745,6 +3745,8 @@ class ARIABridge:
"location": payload.get("location") or sid,
"caps": payload.get("caps") or [],
"control": bool(payload.get("control")),
# "vpn" = VPN-Satellit (Kundennetz hinter WireGuard, laeuft auf ARIA)
"kind": payload.get("kind") or "lan",
"last_seen": time.time(),
}
cur = self._satellites[sid]
@@ -5229,6 +5231,7 @@ class ARIABridge:
"id": s["id"], "location": alias or own,
"agentName": own, "alias": alias,
"caps": s.get("caps") or [], "control": bool(s.get("control")),
"kind": s.get("kind") or "lan",
"online": (now - s.get("last_seen", 0)) < 300,
})
return out