WSL2 + Windows + リモート Chrome CDP のトラブルシューティング
このガイドは、次のような一般的な分離ホスト構成を対象としています。- OpenClaw Gateway は WSL2 内で動作する
- Chrome は Windows 上で動作する
- ブラウザー制御は WSL2/Windows の境界をまたぐ必要がある
まず正しいブラウザーモードを選ぶ
有効なパターンは 2 つあります。オプション 1: WSL2 から Windows への生のリモート CDP
WSL2 から Windows の Chrome CDP エンドポイントを指すリモートブラウザープロファイルを使います。 次の場合に選んでください。- Gateway は WSL2 内に置いたままにする
- Chrome は Windows 上で動作する
- ブラウザー制御で WSL2/Windows の境界をまたぐ必要がある
オプション 2: host-local Chrome MCP
existing-session / user は、Gateway 自体が Chrome と同じホストで動作している場合にのみ使ってください。
次の場合に選んでください。
- OpenClaw と Chrome が同じマシン上にある
- ローカルのログイン済みブラウザー状態を使いたい
- ホスト間のブラウザー転送は不要
responsebody、PDF エクスポート、ダウンロードのインターセプト、バッチアクションのような、高度な managed/raw-CDP 専用ルートは不要
動作アーキテクチャ
参照構成:- 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 から到達可能なアドレスを指すブラウザープロファイルを使う
この構成が分かりにくい理由
複数の障害が重なって発生することがあります。- WSL2 から Windows の CDP エンドポイントに到達できない
- Control UI が安全でないオリジンから開かれている
gateway.controlUi.allowedOriginsがページのオリジンと一致しない- token または pairing が不足している
- ブラウザープロファイルが誤ったアドレスを指している
Control UI に関する重要なルール
UI を Windows から開く場合は、意図的に HTTPS を構成していない限り、Windows の localhost を使ってください。 使うもの:http://127.0.0.1:18789/
Control UI でデフォルトとして LAN IP を使わないでください。LAN または tailnet のアドレス上での平文 HTTP は、CDP 自体とは無関係な insecure-origin/device-auth の挙動を引き起こすことがあります。Control UI を参照してください。
層ごとに検証する
上から下へ進めてください。飛ばさないでください。レイヤー 1: Windows 上で Chrome が CDP を提供していることを確認する
リモートデバッグを有効にして Windows 上で Chrome を起動します。レイヤー 2: WSL2 からその Windows エンドポイントに到達できることを確認する
WSL2 から、cdpUrl で使う予定の正確なアドレスをテストします。
/json/versionは Browser / Protocol-Version メタデータを含む JSON を返す/json/listは JSON を返す(ページが開かれていなければ空配列でも可)
- Windows がまだそのポートを WSL2 に公開していない
- WSL2 側にとってアドレスが間違っている
- firewall / port forwarding / local proxying がまだ足りない
レイヤー 3: 正しいブラウザープロファイルを設定する
生のリモート CDP では、WSL2 から到達可能なアドレスを OpenClaw に指定します。- Windows 上でだけ動くものではなく、WSL2 から到達可能なアドレスを使ってください
- 外部管理ブラウザーでは
attachOnly: trueを維持してください cdpUrlにはhttp://、https://、ws://、wss://を使えます- OpenClaw に
/json/versionを検出させたい場合は HTTP(S) を使ってください - browser provider が直接の DevTools ソケット URL を提供する場合にのみ WS(S) を使ってください
- OpenClaw の成功を期待する前に、同じ URL を
curlでテストしてください
レイヤー 4: Control UI 層を別個に検証する
Windows から UI を開きます。http://127.0.0.1:18789/
そのうえで次を確認します。
- ページオリジンが
gateway.controlUi.allowedOriginsの期待と一致している - token 認証または pairing が正しく設定されている
- 実際は Control UI の認証問題なのに、ブラウザー問題としてデバッグしていない
レイヤー 5: エンドツーエンドのブラウザー制御を確認する
WSL2 から:- タブが Windows Chrome で開く
openclaw browser tabsが対象を返す- その後の操作(
snapshot、screenshot、navigate)が同じプロファイルから動作する
よくある誤解を招くエラー
各メッセージを、その層固有の手がかりとして扱ってください。control-ui-insecure-auth- UI オリジン / セキュアコンテキストの問題であり、CDP 転送の問題ではない
token_missing- 認証設定の問題
pairing required- デバイス承認の問題
Remote CDP for profile "remote" is not reachable- WSL2 から設定された
cdpUrlに到達できない
- WSL2 から設定された
Browser attachOnly is enabled and CDP websocket for profile "remote" is not reachable- HTTP エンドポイントは応答したが、DevTools WebSocket はまだ開けなかった
- リモートセッション後に viewport / dark-mode / locale / offline の上書き状態が残る
openclaw browser stop --browser-profile remoteを実行する- これにより、Gateway や外部ブラウザーを再起動せずに、アクティブな制御セッションを閉じて Playwright/CDP のエミュレーション状態を解放します
gateway timeout after 1500ms- 多くの場合、依然として CDP の到達性の問題か、遅い/到達不能なリモートエンドポイント
No Chrome tabs found for profile="user"- host-local のタブが利用できないのに、ローカル Chrome MCP プロファイルが選ばれている
迅速なトリアージチェックリスト
- Windows:
curl http://127.0.0.1:9222/json/versionは動きますか? - 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を使おうとしていませんか?
実践的な要点
この構成は、通常は成立します。難しいのは、ブラウザー転送、Control UI のオリジンセキュリティ、token/pairing のそれぞれが独立して失敗しうる一方で、ユーザー側からは似たように見えることです。 迷ったときは:- まず Windows の Chrome エンドポイントをローカルで確認する
- 次に同じエンドポイントを WSL2 から確認する
- その後で初めて OpenClaw の設定や Control UI 認証をデバッグする