リモートアクセス
SSH トンネル(Gateway WS)と tailnet を使ったリモートアクセス。
このリポジトリは、専用ホスト(デスクトップ/サーバー)で単一のゲートウェイ(プライマリサーバー)を実行し、クライアントがそれに接続することで、「SSH 経由のリモート」をサポートしています。
- オペレーター(あなた/macOS アプリ)の場合:SSH トンネリングは普遍的なフォールバックです。
- ノード(iOS/Android および将来のデバイス)の場合:ゲートウェイ WebSocket に接続します(必要に応じて LAN/tailnet または SSH トンネルを使用)。
コアアイデア
- ゲートウェイ WebSocket は、設定したポート(デフォルト 18789)の loopback にバインドされます。
- リモート使用の場合、SSH 経由でそのループバックポートを転送できます(または tailnet/VPN を使用してトンネルを減らします)。
一般的な VPN/tailnet セットアップ(エージェントが存在する場所)
ゲートウェイホストを「エージェントが存在する場所」と考えてください。セッション、認証プロファイル、チャネル、状態があります。
ラップトップ/デスクトップ(およびノード)はそのホストに接続します。
#
1) tailnet 内の常時オンラインのゲートウェイ(VPS またはホームサーバー)
永続的なホストでゲートウェイを実行し、Tailscale または SSH 経由でアクセスします。
- ''最高の UX:'' ''gateway.bind: "loopback"'' を保持し、コントロール UI に ''Tailscale Serve'' を使用します。
- フォールバック: アクセスが必要なマシンからのループバック + SSH トンネルを維持します。
- ''例:'' ''exe.dev''(シンプルな VM)または ''Hetzner''(本番 VPS)。
ラップトップが頻繁にスリープするが、エージェントを常にオンラインにしたい場合に最適です。
#
2) ホームデスクトップでゲートウェイを実行し、ラップトップからリモート制御
ラップトップはエージェントを実行しません。リモートで接続します:
- macOS アプリの SSH 経由のリモートモードを使用します(設定→一般→「OpenClaw が実行される場所」)。
- アプリはトンネルを開いて管理するため、WebChat + ヘルスチェックが「正常に動作」します。
ランブック:''macOS リモートアクセス''。
#
3) ラップトップでゲートウェイを実行し、他のマシンからリモートアクセス
ゲートウェイをローカルに保持しますが、安全に公開します:
- 他のマシンからラップトップへの SSH トンネル、または
- コントロール UI 用の Tailscale サーブとループバックのみのゲートウェイ。
ガイド:''Tailscale'' および ''ネットワーク概要''。
コマンドフロー(何がどこで実行されるか)
1 つのゲートウェイサービスが状態+チャネルを所有します。ノードは周辺機器です。
フローの例(Telegram → ノード):
- Telegram メッセージが ゲートウェイ に到着します。
- ゲートウェイは エージェント を実行し、ノードツールを呼び出すかどうかを決定します。
- ゲートウェイはゲートウェイ WebSocket (''node.*'' RPC) 経由で ''ノード'' を呼び出します。
- ノードが結果を返します。ゲートウェイが Telegram に返信します。
Note:
- ''ノードはゲートウェイサービスを実行しません。'' 意図的に分離されたプロファイルを実行しない限り、ホストごとに 1 つのゲートウェイのみです(''複数のゲートウェイ''を参照)。
- macOS アプリの「ノードモード」は、ゲートウェイ WebSocket 上のノードクライアントに過ぎません。
SSH トンネル(CLI + ツール)
リモートゲートウェイ WS へのローカルトンネルを作成します:
ssh -N -L 18789:127.0.0.1:18789 user@host
トンネルが確立されると:
- ''openclaw health'' および ''openclaw status --deep'' が ''ws://127.0.0.1:18789'' 経由でリモートゲートウェイに到達します。
- openclaw gateway {status,health,send,agent,call}' は、必要に応じて --url 経由で転送された URL をターゲットにすることもできます。
注:''18789'' を設定した ''gateway.port''(または ''--port''/''OPENCLAW_GATEWAY_PORT'')に置き換えます。
CLI リモートデフォルト
CLI コマンドがデフォルトで使用するようにリモートターゲットを永続化できます:
{
gateway: {
mode: "remote",
remote: {
url: "ws://127.0.0.1:18789",
token: "your-token",
},
},
}ゲートウェイがループバックのみの場合、URL を ''ws://127.0.0.1:18789'' に保持し、最初に SSH トンネルを開きます。
SSH 経由のチャット UI
WebChat は別の HTTP ポートを使用しなくなりました。SwiftUI チャット UI はゲートウェイ WebSocket に直接接続します。
- SSH 経由で ''18789'' を転送します(上記参照)、次にクライアントを ''ws://127.0.0.1:18789'' に接続します。
- macOS では、トンネルを自動的に管理するアプリの「SSH 経由のリモート」モードを優先します。
macOS アプリ「SSH 経由のリモート」
macOS メニューバーアプリは、同じセットアップをエンドツーエンドで駆動できます(リモートヘルスチェック、WebChat、音声ウェイク転送)。
ランブック:''macOS リモートアクセス''。
セキュリティルール(リモート/VPN)
簡潔なバージョン:バインドが必要な場合を除き、ゲートウェイをループバックのみに保持します。
- Loopback + SSH/Tailscale Serve が最も安全なデフォルトです(公開露出なし)。
- ''非ループバックバインディング''(ループバックが利用できない場合の ''lan''/''tailnet''/''custom'' または ''auto'')は、認証トークン/パスワードを使用する必要があります。
- ''gateway.remote.token'' はリモート CLI 呼び出し''のみ''用です — ローカル認証を有効にしません。
- ''wss://'' を使用する場合、''gateway.remote.tlsFingerprint'' がリモート TLS 証明書をピンします。
- ''Tailscale Serve'' は、''gateway.auth.allowTailscale: true'' の場合、ID ヘッダー経由で認証できます。
トークン/パスワード認証が必要な場合は、''false'' に設定します。
- ブラウザ制御をオペレーターアクセスとして扱います:tailnet のみ + 意図的なノードペアリング。
詳細:''セキュリティ''。