Remote access
リモートアクセス
OpenClaw はホスト上で1つの Gateway(マスター)を実行し、すべてのクライアントをそこに接続します。Gateway はセッション、認証プロファイル、チャンネル、状態を管理し、それ以外はすべてクライアントです。
- オペレーター(ユーザーまたは macOS アプリ):Gateway に到達できる場合は、LAN/Tailnet の WebSocket 直接接続が最も簡単です。SSH トンネリングは汎用的なフォールバックです。
- Node(iOS/Android およびその他のデバイス):Gateway の WebSocket(LAN/Tailnet または SSH トンネル)に接続します。
基本概念
Gateway WebSocket はデフォルトでポート 18789(gateway.port)のループバックにバインドされます。リモートで使用するには、Tailscale Serve または信頼できる LAN/Tailnet バインドを通じて公開するか、SSH 経由でループバックポートを転送します。
トポロジーの選択肢
| 構成 | Gateway の実行場所 | 最適な用途 |
|---|---|---|
| Tailnet 内の常時稼働 Gateway | Tailscale または SSH で到達する常設ホスト(VPS またはホームサーバー) | 頻繁にスリープするものの、エージェントを常時稼働させる必要があるノート PC。exe.dev(簡単な VM)または Hetzner(本番用 VPS)を参照してください。 |
| 自宅のデスクトップ | デスクトップ。ノート PC は macOS アプリのリモートモード(Settings → Connection → OpenClaw runs)で接続 | 電源を入れたままにするハードウェア上でエージェントを維持する場合。手順書:macOS リモートアクセス。 |
| ノート PC | SSH トンネルまたは Tailscale Serve で安全に公開するノート PC(gateway.bind: "loopback" を維持) |
単一マシン構成。Tailscale および Web を参照してください。 |
常時稼働構成とノート PC 構成では、gateway.bind: "loopback" を維持し、Control UI には Tailscale Serve を使用するか、gateway.remote.transport: "direct" を設定した信頼できる LAN/Tailnet バインドを使用することを推奨します。SSH トンネルは、どのマシンからでも利用できるフォールバックです。
コマンドの流れ(どこで何が実行されるか)
1つの Gateway が状態とチャンネルを管理し、Node は周辺機器として機能します。例(Telegram メッセージを Node ツールにルーティングする場合):
- Telegram メッセージが Gateway に到着します。
- Gateway がエージェントを実行し、Node ツールを呼び出すかどうかを判断します。
- Gateway が Gateway WebSocket(
node.invokeRPC)を介して Node を呼び出します。 - Node が結果を返し、Gateway が Telegram に返信します。
Node は Gateway サービスを実行しません。分離されたプロファイルを意図的に実行する場合を除き、ホストごとに実行する Gateway は1つだけにしてください(複数の Gateway を参照)。macOS アプリの「Node モード」は、Gateway WebSocket 経由で動作する単なる Node クライアントです。
SSH トンネル(CLI + ツール)
ssh -N -L 18789:127.0.0.1:18789 user@gateway-hostトンネルが確立されている間、openclaw health と openclaw status --deep は ws://127.0.0.1:18789 を介してリモート Gateway に到達します。openclaw gateway status、openclaw gateway health、openclaw gateway probe、openclaw gateway call も、--url を使用して転送先 URL を指定できます。
CLI のリモートデフォルト
CLI コマンドがデフォルトで使用するリモート接続先を永続化します。
{ gateway: { mode: "remote", remote: { url: "ws://127.0.0.1:18789", token: "your-token", }, },}Gateway がループバック限定の場合は、URL を ws://127.0.0.1:18789 のままにして、先に SSH トンネルを開きます。macOS アプリの SSH トンネル転送方式では、検出された Gateway のホスト名を gateway.remote.sshTarget(user@host または user@host:port)に指定し、gateway.remote.url はローカルトンネルの URL のままにします。リモートポートがローカルポートと異なる場合は、gateway.remote.remotePort を設定します。
ホストキーの検証はデフォルトで厳格です(gateway.remote.sshHostKeyPolicy: "strict")。代わりに実際に適用される OpenSSH 設定へ委任するには、"openssh" に設定します。有効にする前に、ユーザーおよびシステムの SSH 設定を確認してください。
信頼できる LAN または Tailnet 上ですでに到達可能な Gateway には、直接モードを使用します。
{ gateway: { mode: "remote", remote: { transport: "direct", url: "ws://192.168.0.202:18789", token: "your-token", }, },}認証情報の優先順位
Gateway の認証情報解決は、呼び出し、プローブ、ステータスの各経路と Discord の実行承認監視で、1つの共通契約に従います。Node ホストも同じ契約を使用しますが、ローカルモードには1つ例外があります(gateway.remote.* を無視します)。
- 明示的な認証情報(
--token、--password、またはツールのgatewayToken)は、明示的な認証を受け付ける呼び出し経路で常に優先されます。 - URL オーバーライドの安全性:
- CLI の
--urlは、暗黙的な設定または環境変数の認証情報を再利用しません。 - 環境変数
OPENCLAW_GATEWAY_URLでは、環境変数の認証情報(OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD)のみを使用できます。
- CLI の
- ローカルモードのデフォルト:
- トークン:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(ローカルトークンが未設定の場合のみリモートへフォールバック) - パスワード:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(ローカルパスワードが未設定の場合のみリモートへフォールバック)
- トークン:
- リモートモードのデフォルト:
- トークン:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - パスワード:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- トークン:
- Node ホストのローカルモードの例外:
gateway.remote.token/gateway.remote.passwordは無視されます。 - リモートのプローブおよびステータスにおけるトークン確認は、デフォルトで厳格です。リモートモードを対象とする場合は
gateway.remote.tokenのみを使用し、ローカルトークンへはフォールバックしません。 - Gateway の環境変数オーバーライドには、
OPENCLAW_GATEWAY_*のみを使用します。
チャット UI のリモートアクセス
WebChat には独立した HTTP ポートはありません。SwiftUI のチャット UI は Gateway WebSocket に直接接続します。
- SSH 経由で
18789を転送し(前述を参照)、クライアントをws://127.0.0.1:18789に接続します。 - LAN/Tailnet の直接モードでは、設定済みのプライベートな
ws://URL または安全なwss://URL にクライアントを接続します。 - macOS では、アプリのリモートモードが選択された転送方式を自動的に管理します。
macOS アプリのリモートモード
macOS メニューバーアプリは、リモートステータス確認、WebChat、音声ウェイク転送を含む同じ構成を、最初から最後まで管理します。手順書:macOS リモートアクセス。
セキュリティ規則(リモート/VPN)
バインドが必要だと確信している場合を除き、Gateway はループバック限定に維持してください。
- ループバック + SSH/Tailscale Serve が最も安全なデフォルトです(公開されません)。
- 平文の
ws://は、ループバック、プライベート/LAN(RFC 1918)、リンクローカル、CGNAT、.local、.ts.netの各ホストで使用できます。公開されたリモートホストではwss://を使用する必要があります。 - 非ループバックバインド(
lan/tailnet/custom、またはループバックを利用できない場合のauto)では、トークン、パスワード、またはgateway.auth.mode: "trusted-proxy"を設定したアイデンティティ認識型リバースプロキシによる Gateway 認証を使用する必要があります。 gateway.remote.token/.passwordはクライアントの認証情報ソースです。それ自体ではサーバー認証を設定しません。- ローカルの呼び出し経路で
gateway.remote.*をフォールバックとして使用できるのは、gateway.auth.*が未設定の場合のみです。 gateway.auth.token/gateway.auth.passwordが SecretRef によって明示的に設定されているものの解決できない場合、解決は安全側に失敗します(リモートへのフォールバックによって問題を隠しません)。gateway.remote.tlsFingerprintは、macOS の直接モードを含むwss://のリモート TLS 証明書を固定します。保存済みのフィンガープリントがない場合、macOS は通常のシステム信頼検証に合格した後、初回使用時にのみ固定します。自己署名証明書またはプライベート CA を使用する Gateway には、明示的なフィンガープリントまたは Remote over SSH が必要です。gateway.auth.allowTailscale: trueの場合、Tailscale Serve はアイデンティティヘッダーを介して Control UI/WebSocket トラフィックを認証できます。HTTP API エンドポイントはそのヘッダー認証を使用せず、代わりに Gateway の通常の HTTP 認証モードに従います。このトークン不要のフローでは、Gateway ホストが信頼されていることを前提とします。すべての場所で共有シークレット認証を使用するには、falseに設定してください。- 信頼済みプロキシ認証では、デフォルトで非ループバックのアイデンティティ認識型プロキシを想定します。同一ホスト上のループバックリバースプロキシを使用するには、
gateway.auth.trustedProxy.allowLoopback = trueを明示的に設定する必要があります。 - ブラウザーからの制御はオペレーターアクセスと同等に扱ってください。Tailnet 限定にし、Node のペアリングは意図的に行ってください。
詳細:セキュリティ。
macOS:LaunchAgent による永続的な SSH トンネル
macOS クライアントで最も簡単な永続構成は、SSH の LocalForward 設定項目と、再起動やクラッシュ後もトンネルを維持する LaunchAgent を使用する方法です。
手順1:SSH 設定を追加する
~/.ssh/config を編集します。
Host remote-gateway HostName <REMOTE_IP> User <REMOTE_USER> LocalForward 18789 127.0.0.1:18789 IdentityFile ~/.ssh/id_rsa<REMOTE_IP> と <REMOTE_USER> を実際の値に置き換えてください。
手順2:SSH キーをコピーする(初回のみ)
ssh-copy-id -i ~/.ssh/id_rsa <REMOTE_USER>@<REMOTE_IP>手順3:Gateway トークンを設定する
openclaw config set gateway.remote.token "<your-token>"リモート Gateway がパスワード認証を使用する場合は、代わりに gateway.remote.password を使用します。OPENCLAW_GATEWAY_TOKEN はシェルレベルのオーバーライドとして引き続き有効ですが、永続的なリモートクライアント構成には gateway.remote.token / gateway.remote.password を使用します。
手順4:LaunchAgent を作成する
~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist として保存します。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>ai.openclaw.ssh-tunnel</string> <key>ProgramArguments</key> <array> <string>/usr/bin/ssh</string> <string>-N</string> <string>remote-gateway</string> </array> <key>KeepAlive</key> <true/> <key>RunAtLoad</key> <true/></dict></plist>手順5:LaunchAgent を読み込む
launchctl bootstrap gui/$UID ~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plistトンネルはログイン時に自動的に開始し、クラッシュ時には再起動され、転送ポートを利用可能な状態に維持します。
トラブルシューティング
# Check if the tunnel is runningps aux | grep "ssh -N remote-gateway" | grep -v greplsof -i :18789 # Restart the tunnellaunchctl kickstart -k gui/$UID/ai.openclaw.ssh-tunnel # Stop the tunnellaunchctl bootout gui/$UID/ai.openclaw.ssh-tunnel| 設定項目 | 動作内容 |
|---|---|
LocalForward 18789 127.0.0.1:18789 |
ローカルポート 18789 をリモートポート 18789 に転送します |
ssh -N |
リモートコマンドを実行せずに SSH を使用します(ポート転送のみ) |
KeepAlive |
トンネルがクラッシュした場合に自動的に再起動します |
RunAtLoad |
ログイン時に LaunchAgent が読み込まれるとトンネルを開始します |