まず適切なブラウザーモードを選ぶ
オプション 1: WSL2 から Windows への生のリモート CDP
WSL2 から Windows Chrome の CDP エンドポイントを指すリモートブラウザープロファイルを使用します。Gateway が WSL2 内にとどまり、Chrome が Windows 上で実行され、ブラウザー制御が WSL2/Windows の境界をまたぐ必要がある場合は、これを選びます。オプション 2: ホストローカル Chrome MCP
Gateway が Chrome と同じホスト上で実行され、ローカルのサインイン済みブラウザー状態を使いたい場合で、クロスホストのブラウザートランスポートが不要であり、responsebody、
PDF エクスポート、ダウンロードのインターセプト、またはバッチアクションが不要な場合にのみ、existing-session ドライバー(user プロファイル)を使用します(Chrome MCP プロファイルは
これらをサポートしていません)。
WSL2 Gateway + Windows Chrome では、生のリモート CDP を使用します。Chrome MCP は
ホストローカルであり、WSL2 から Windows へのブリッジではありません。
動作するアーキテクチャ
- WSL2 が
127.0.0.1:18789で Gateway を実行する - Windows が通常のブラウザーで
http://127.0.0.1:18789/の Control UI を開く - Windows Chrome がポート
9222で CDP エンドポイントを公開する - WSL2 がその Windows CDP エンドポイントに到達できる
- OpenClaw が WSL2 から到達可能なアドレスをブラウザープロファイルに指定する
Control UI の重要なルール
UI を Windows から開く場合は、意図的な HTTPS 構成がない限り Windows localhost を使用します。レイヤーごとに検証する
上から下へ進め、飛ばさないでください。1 つのレイヤーを修正しても、さらに下のレイヤーから 別のエラーが見えることがあります。レイヤー 1: Chrome が Windows で CDP を提供していることを確認する
portproxy を変更する前に IPv4 と IPv6 を診断する
Chromium は remote debugging をまず127.0.0.1 にバインドしようとし、IPv4 バインドが失敗した場合にのみ
[::1] へフォールバックします。127.0.0.1:9222 で待ち受ける永続的な v4tov4 ルールがあると、
Chrome の起動前にそのエンドポイントを占有できます。その場合 Chrome は
[::1]:9222 にフォールバックし、一方で古いルールは IPv4 トラフィックを
自身のリスナーへ転送し、空の応答を返します。
Chrome のバージョンから推測するのではなく、Windows から実際のリスナーとプロキシルールを確認します。
netstat の各 PID について tasklist /fi "PID eq <PID>" を使用します。
-
chrome.exeが127.0.0.1で応答する場合は、同じく127.0.0.1:9222で待ち受ける portproxy ルールをすべて削除します。WSL2 から到達可能な Windows アダプター アドレスだけを127.0.0.1に転送します。 -
chrome.exeが[::1]でのみ応答する場合は、未使用の IPv4 アドレスへ転送するのではなく、v4tov6を使って WSL2 から到達可能なリスナーを::1に向けます。
0.0.0.0、LAN アドレス、または tailnet アドレスで公開しないでください。CDP は
ブラウザーセッションの制御権を与えます。
レイヤー 2: WSL2 がその Windows エンドポイントに到達できることを確認する
WSL2 から、cdpUrl で使う予定の正確なアドレスをテストします。
/json/versionが Browser / Protocol-Version メタデータを含む JSON を返す/json/listが JSON を返す(ページが開いていなければ空配列でも問題ありません)
レイヤー 3: 正しいブラウザープロファイルを設定する
WSL2 から到達可能なアドレスを OpenClaw に指定します。- Windows 上でだけ動作するものではなく、WSL2 から到達可能なアドレスを使用する
- 外部管理ブラウザーでは
attachOnly: trueを維持する cdpUrlはhttp://、https://、ws://、またはwss://にできる- OpenClaw に
/json/versionを検出させたい場合は HTTP(S) を使用する - ブラウザープロバイダーが直接の DevTools ソケット URL を提供する場合にのみ WS(S) を使用する
- OpenClaw の成功を期待する前に、同じ URL を
curlでテストする
レイヤー 4: Control UI レイヤーを別に確認する
Windows からhttp://127.0.0.1:18789/ を開き、次を確認します。
- ページのオリジンが
gateway.controlUi.allowedOriginsの期待と一致している - トークン認証またはペアリングが正しく設定されている
- ブラウザーの問題のように見せかけて Control UI 認証問題をデバッグしていない
レイヤー 5: エンドツーエンドのブラウザー制御を確認する
WSL2 から:- タブが Windows Chrome で開く
browser tabsがターゲットを返す- 後続のアクション(
snapshot、screenshot、navigate)が同じ プロファイルから動作する
よくある紛らわしいエラー
| メッセージ | 意味 |
|---|---|
control-ui-insecure-auth | CDP トランスポートの問題ではなく、UI オリジン/セキュアコンテキストの問題 |
token_missing | 認証設定の問題 |
pairing required | デバイス承認の問題 |
Remote CDP for profile "remote" is not reachable | WSL2 が設定済みの cdpUrl に到達できない |
空の CDP 応答 / portproxy 経由の other side closed | Windows リスナーの不一致または自己ループ。両方のループバックファミリーと netsh interface portproxy show all を確認する |
Browser attachOnly is enabled and CDP websocket for profile "remote" is not reachable | HTTP エンドポイントは応答したが、DevTools WebSocket を開けなかった |
| リモートセッション後に viewport / dark-mode / locale / offline overrides が古い | Gateway や外部ブラウザーを再起動せずに、セッションを閉じてキャッシュ済み Playwright/CDP 接続を解放するには openclaw browser --browser-profile remote stop を実行する |
remoteCdpTimeoutMs(デフォルト 1500ms)周辺のタイムアウト | 通常は依然として CDP 到達性、または低速/到達不能なリモートエンドポイント |
Playwright page enumeration timed out after 3000ms | リモート CDP は接続されたが、永続タブの読み取りが停止した。期限は remoteCdpTimeoutMs と remoteCdpHandshakeTimeoutMs の大きい方 |
No Chrome tabs found for profile="user" | ホストローカルのタブが利用できない場所でローカル Chrome MCP プロファイルが選択されている |
高速トリアージチェックリスト
- Windows:
127.0.0.1と[::1]のどちらが/json/versionに応答し、 そのリスナーはchrome.exeに属しているか? - WSL2:
curl http://WINDOWS_HOST_OR_IP:9222/json/versionは動作するか? - OpenClaw 設定:
browser.profiles.<name>.cdpUrlは、その正確な WSL2 から到達可能なアドレスを使用しているか? - Control UI: LAN IP ではなく
http://127.0.0.1:18789/を開いているか? - 生のリモート CDP ではなく、WSL2 と Windows をまたいで
existing-sessionを使おうとしていないか?