デモで 0.0.0.0 公開が一番危ない。外向きはトンネル前段だけ、本体は 127.0.0.1。PoP はGeoDNS・SSH マトリクス、DNS 揺れはSplit-horizon 検収、枠は料金プランで測った地域に寄せる。
安全境界(ssh -R の前に読む)
ループバックが錨。管理/推論は 127.0.0.1(または抽象ソケット)のみ。SSH が逆転送し、バスションのループバックにポートが現れる。LAN 全域にモデルへの経路は不要。
非ループバックは必ず認証前段。LB やエージェント都合で実アドレスへ昇格させた瞬間、トンネル外から触れる面になる。OpenClaw の手前にベアラ/mTLS/OAuth のいずれかを挟むのが規律。「既定=ループバック+トンネル」「例外=監査可能な認証 GW」とチケットに書き、FW 差分を同梱する。
- 公開枢軸はバスションのみ。SG/
pf/nftで転送先を LB か割当 IP に限定。 - 一地域一トンネル所有者。鍵漏洩時の横移動を防ぐ。
OPENCLAW_HOMEは NFS 共有禁止。ジャーナルはローカル。
最小再現ステップ(地域ごとに一度)
ホスト名は例。在庫タグへ置換。
- 1
OPENCLAW_HOME=/var/lib/openclaw/<region>、HTTP を127.0.0.1:18080のみ。curl http://127.0.0.1:18080/healthzで確認。 - 2 バスションに専用ユーザ。
AllowTcpForwarding yes、鍵はシェル不可が望ましい。 - 3
ssh -N -o ServerAliveInterval=30 -R 127.0.0.1:7443:127.0.0.1:18080 tunnel@bastion。リモート側もループバック束縛を既定に。 - 4 nginx/Caddy/Envoy で TLS 終端→
127.0.0.1:7443。証明書は地域分割。 - 5 systemd 等で指数退避、連続失敗三回でアラート(フラップ時の緩い FW 開放を防ぐ)。
# モデルホスト:ループバックのみ
curl -fsS --max-time 2 http://127.0.0.1:18080/healthz
# バスション:TLS の前にトンネル着地を確認
curl -fsS --max-time 2 http://127.0.0.1:7443/healthz
トークン輪番(トンネルを切らずに回す)
ホスト鍵は据え置き、モデル API/Webhook は短周期。Vault→短寿命 env→EnvironmentFile→reload。新鍵発行→secrets.d/next併記→シグナル再読込 or 再起動(ループバックなら FW は不変)→五分グリーンで旧失効。同時再起動は窓で、手順はヘルプセンター運用票へ。
ヘルスプローブと合算ページング
JSON は region・lane(loopback/tunnel/edge_https)・rtt_ms・error_class を統一。五分窓で合算し、同一リージョン全 lane 落ちのみページ、トンネルが二地域同窓で落ちたときだけマルチ扱い。SSH フラップで三連ページを避ける。
- A ホスト上ループバック(一分)。
- B バスション→転送ポート(逆路のみ)。
- C 合成 HTTPS(五分、TLS レートと切り分け)。
再通知は指数退避。MagicDNS 稿と同じノイズ思想だが観測は SSH+HTTPS のみ。
FAQ
Tailscale を避ける理由。規制でオーバーレイ不可の VLAN がある。SSH は監査済み運用の再利用。メッシュ解禁後は MagicDNS 稿へ移行しホーム設計は流用。
GatewayPorts。0.0.0.0+無認証が危険。既定は 127.0.0.1、外向きはクライアント証明書。
プローブ認証。マージワーカー専用トークンを端末に置かない。モデル鍵と同周期で回す。
最初に死ぬ箇所。多くは keepalive より SSH。on-call はトンネル再起動を先に。
スクリプト化すれば境界は再現できる。ループバック内のモデル、狭い SSH 出口、非ループバックは認証 GW、短命秘密、密度に比例するアラート——オーバーレイ DNS 前にこれで足りる。