Release / verify (push) Canceled after 0s
CI / checks (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / backend (push) Canceled after 0s
Release / test (push) Canceled after 0s
Release / publish (backend) (push) Canceled after 0s
Release / publish (frontend) (push) Canceled after 0s
Release / publish (proxy) (push) Canceled after 0s
Release / publish (updater) (push) Canceled after 0s
- **Management-Tunnel** (System › Management-Tunnel): Firewalls hinter NAT/CGNAT verwalten. Ein optionaler WireGuard-Hub auf dem OPNexus-Server (Compose-Profil `overlay`, Container `wg-hub` aus dem Backend-Image mit `NET_ADMIN`) nimmt die Firewalls entgegen, die sich nach außen einwählen; OPNexus erreicht deren API über einen kleinen CONNECT-Proxy des Hubs, der nur ins Tunnel-Netz verbindet. Je Firewall eine Tunnel-Adresse und ein eigener Pre-Shared Key, Anleitung mit kopierbaren Werten, Live-Status (Handshake, Datenmenge). Der Hub nimmt keine neuen Verbindungen aus dem Tunnel an. Ende-zu-Ende gegen eine echte OPNsense 26.7 geprüft (Handshake, API, Zertifikat festsetzen). Neue Tabellen `overlay_settings`, `overlay_peers` (Migration `0015`); das Backend-Image enthält jetzt `wireguard-tools`, `iproute2`, `iptables`.
21 lines
961 B
Python
21 lines
961 B
Python
"""HTTP CONNECT through the overlay hub's proxy, for the few places that open a raw TLS connection."""
|
|
import asyncio
|
|
from urllib.parse import urlsplit
|
|
|
|
|
|
async def open_tunnel(proxy_url: str, host: str, port: int, timeout: float = 8.0):
|
|
"""(reader, writer) connected to host:port through the proxy; TLS can be started on top with ``writer.start_tls``."""
|
|
proxy = urlsplit(proxy_url)
|
|
reader, writer = await asyncio.wait_for(asyncio.open_connection(proxy.hostname, proxy.port or 8888), timeout)
|
|
try:
|
|
writer.write(f"CONNECT {host}:{port} HTTP/1.1\r\nHost: {host}:{port}\r\n\r\n".encode())
|
|
await writer.drain()
|
|
head = await asyncio.wait_for(reader.readuntil(b"\r\n\r\n"), timeout)
|
|
status = int(head.split(b" ", 2)[1])
|
|
if status != 200:
|
|
raise OSError(f"Der Overlay-Proxy lehnt die Verbindung ab (HTTP {status})")
|
|
except Exception:
|
|
writer.close()
|
|
raise
|
|
return reader, writer
|