127.0.0.1, erzwingen Token- und secretKey-Prüfungen vor jedem Byte und fassen Gateway- und Doctor-Sonden zu einem regionalen Alarm zusammen—ein niedrig exponierter Mehrregion-Modus statt breiter Öffnung.
Alternativen: Tailscale MagicDNS, SSH-Reverse-Tunnel oder hier STCP, wenn Mesh verboten ist. Kontext: GeoDNS-Matrix, Cloudflare Tunnel, JumpHost-HowTo, SCP/SFTP-RTT, Split-Horizon. Öffentliche CTAs: Titelseite, Preise, Hilfe, Kaufen, Blog.
Drei Betriebsschmerzen, die das Layout löst
- 1 Demonstriert auf
0.0.0.0: jede Marketing-Demo wird zur dauerhaften Angriffsfläche; STCP hält den ergonomischen Pfad auf Loopback. - 2 Geheimnis-Sprawl: systemd-Kopien pro Region explodieren; hier genügen ein
auth.tokenfürfrpsplus je STCP-Proxy einsecretKey, kalendergetrieben rotierbar. - 3 Sonden-Rauschen: Gateway grün während Doctor hängt erzeugt zwei Tickets; Merge pro Region kollabiert das auf „JP rot“ statt Doppelpaging.
| Designziel | Mechanismus | Abnahmesignal |
|---|---|---|
| Gateway-Port nicht im Internet | STCP-Visitor + frps-Token |
ss -ltn zeigt OpenClaw nur auf 127.0.0.1 auf Builder und Visitor |
| Auth vor OpenClaw-TCP | auth.token (frps) + secretKey (STCP) |
Zähler für abgewiesene Verbindungen steigen bei Drift; OpenClaw-Logs bleiben ruhig |
| Regionale Isolation | eigenes proxy_name pro PoP (z. B. openclaw-sin-gw) |
Tokyo-Visitor wählt Singapur nicht per Tippfehler—Namens-Mismatch scheitert |
| Health-Rollup Gateway + Doctor | Merge-Worker je Region | ein Alarm pro regionaler Störung, nicht pro Endpunkt |
Rollen, Ports und Verkettung von Gateway und Doctor
frps auf Linux-Bastion: bindPort = 7000, auth.method = "token", langes auth.token; optional Dashboard 7500 hinter TLS. 7000/tcp nur für Operator- und Builder-Subnetze. frpc auf jedem vpshalo-Mac registriert zwei STCP-Proxys: openclaw-{region}-gw → 127.0.0.1:18080 (Gateway) und openclaw-{region}-doctor → 127.0.0.1:18081 (Doctor-JSON). Je Proxy ein secretKey.
Visitor auf Operator- oder Merge-Host: ausgehend zur Bastion, lokal 127.0.0.1:28080 und 28081. curl http://127.0.0.1:28080/healthz testet Visitor → Token → Secret → Loopback → OpenClaw. Doctor auf 28081 deckt hängende Reloads auf, selbst wenn healthz grün bleibt.
Minimal reproduzierbare Schritte (pro Region einmal)
Platzhalter {region} durch Inventar-Tags ersetzen (sin, tyo, hkg, icn, lax).
- Schritt 1 — OpenClaw pinnen:
OPENCLAW_HOME=/var/lib/openclaw/{region}(macOS-Pfad analog), Start mit--gateway-bind 127.0.0.1:18080 --doctor-bind 127.0.0.1:18081;curlnur von localhost gegen/healthzund/doctor. - Schritt 2 — frps:
frps -c frps.tomlmit obigen Auth-Feldern;7000/tcpin SG/UFW/nftrestriktiv. - Schritt 3 — Builder-frpc: zwei
type = "stcp"-Proxys ohneremotePort; jesecretKey; Unit mit Restart und Backoff, damit Flaps keine Firewall-Lockerung erzwingen. - Schritt 4 — Visitor: zwei
[[visitors]]mit passendemserverNameundsecretKey,bindAddr = "127.0.0.1"; vor Team-Rolloutcurllokal verifizieren. - Schritt 5 — Sonden mergen: Worker ruft nacheinander
127.0.0.1:28080/healthzund127.0.0.1:28081/doctorauf, schreibt{region,gw_ms,doctor_ms,status,error_class}in die TSDB; Page nur wenn beide Lanes im selben Fünf-Minuten-Fenster rot sind; Multi-Region-Eskalation erst bei zwei Regionen gleichzeitig.
# frpc.toml — Builder, zwei STCP-Proxys auf Loopback
serverAddr = "bastion.example"
serverPort = 7000
auth.method = "token"
auth.token = "<langes-frps-token>"
[[proxies]]
name = "openclaw-sin-gw"
type = "stcp"
secretKey = "<sk-sin-gw>"
localIP = "127.0.0.1"
localPort = 18080
[[proxies]]
name = "openclaw-sin-doctor"
type = "stcp"
secretKey = "<sk-sin-doctor>"
localIP = "127.0.0.1"
localPort = 18081
# frpc.toml — Visitor, beide Lanes nur auf 127.0.0.1
[[visitors]]
name = "v-openclaw-sin-gw"
type = "stcp"
serverName = "openclaw-sin-gw"
secretKey = "<sk-sin-gw>"
bindAddr = "127.0.0.1"
bindPort = 28080
[[visitors]]
name = "v-openclaw-sin-doctor"
type = "stcp"
serverName = "openclaw-sin-doctor"
secretKey = "<sk-sin-doctor>"
bindAddr = "127.0.0.1"
bindPort = 28081
0.0.0.0 heben. Loopback bleibt Loopback; sonst verliert das Muster seinen Audit-Wert.| Parameter | Startwert | Stabilitätsnotiz |
|---|---|---|
| frps bindPort | 7000/tcp | Nur vertrauenswürdige Quell-IP-Räume; keine Portweiterleitung ins Guest-WLAN |
| OpenClaw Gateway / Doctor | 18080 / 18081 | Beispielkonvention; dokumentiert mit ss gegen versehentliches 0.0.0.0 |
| Visitor-Bindings | 28080 / 28081 | Nur Merge-Host/Operator; nie auf LAN-Interfaces spiegeln |
| Merge-Fenster | 300 s | Kürzer für Demos, länger für Batch-Builds mit seltener Telemetrie |
| curl-Timeout Sonden | 2 s | Getrennt vom OpenClaw-Upstream-Timeout im Runbook festhalten |
| Geheimnisrotation | ≤ 15 Min. Rollout-Fenster | Proxy und Visitor gemeinsam; danach curl-Grün vor Alarm-Silence |
Drei Runbook-Sätze zum Zitieren
- Rotation: ein
auth.tokenfürfrps, je STCP-Proxy einsecretKey—weniger Fläche als viele SSH-Hosteinträge. - Scans: ohne Secret kein TCP zu OpenClaw; Ablehnungen in
frps-Metriken statt in App-Logs. - Loopback beidseitig deckt Audit-Forderung „localhost only“; Ausnahmen dokumentieren.
Fehlersuche (kurz)
Visitor tot: 7000/tcp vom Subnetz; Logs trennen Token- vs. Secret-Fehler, jeweils nur eine Variable ändern. Gateway ok, Doctor hängt: Modell-Thread—OpenClaw neu starten. Latenz hoch: Relais über frps; Builder näher zur Bastion, siehe RTT-Matrix. Rotation: Visitor- und Proxy-secretKey gemeinsam; curl 127.0.0.1:28080/healthz. Beide Sonden rot: Tunnel oder frps, nicht OpenClaw—Supervision prüfen.
Fazit: Loopback je Region, STCP mit Auth, kein öffentlicher Mac-Listener, Rotation im Kalender, ein Alarm pro Region. Kapazität folgt dem gemessenen PoP—niedrige RTT zwischen frps und frpc stabilisiert Sonden.
Builder an Bastion und Mess-PoP koppeln
Titelseite (inkl. Knotenübersicht #node-list), Preise, Hilfe-Center, Kaufen und den Technologie-Blog nutzen—alles ohne Login-Zwang. Region wählen, die zu eurer Bastion und euren Sonden passt.
Regionale Kaufseiten: Japan (Tokio) · Korea (Seoul) · Hongkong · Singapur · USA Westen