• 保持 192.168.114.4 本机 Chromium CDP 监听 127.0.0.1:9222(不改为 0.0.0.0)
  • 在 192.168.114.3 上通过 Claude Code / Codex 使用 chrome-devtools-mcp
  • 通过 SSH 反向转发实现:114.3:127.0.0.1:9222 -> 114.4:127.0.0.1:9222

方案选择

不采用“开放局域网端口”方案,采用 SSH 隧道方案,原因:

  1. CDP 仍仅绑定 loopback,暴露面更小
  2. 不需要改现有 /usr/local/bin/ungoogled-chromium-cdp
  3. SSH 会话断开后端口自动释放,生命周期清晰

网络与角色

  • 192.168.114.4:Chromium 实际运行主机(当前工作站)
  • 192.168.114.3:Claude/Codex 使用端
  • 操作习惯:从 114.4 主动 ssh 192.168.114.3

前置确认

在 114.4 上确认 CDP 监听:

ss -lntp | rg 9222

应看到类似:

LISTEN 0 10 127.0.0.1:9222 0.0.0.0:* users:(("chrome",pid=...,fd=...))

并确认启动脚本未修改为公网/局域网监听:

sed -n '1,80p' /usr/local/bin/ungoogled-chromium-cdp

关键参数应为:

--remote-debugging-address=127.0.0.1
--remote-debugging-port=9222

实施过程

1) 在 114.4 的 ~/.ssh/config 增加 RemoteForward

编辑 114.4 本机 ~/.ssh/config,在 Host 192.168.114.3 下增加:

Host 192.168.114.3
    User van
    ExitOnForwardFailure yes
    ServerAliveInterval 30
    ServerAliveCountMax 3
    RemoteForward 127.0.0.1:9222 127.0.0.1:9222

说明:

  • 左侧 127.0.0.1:9222 是远端(114.3)监听点
  • 右侧 127.0.0.1:9222 是本地(114.4)目标点

2) 建立会话并在 114.3 验证隧道

从 114.4 发起连接:

ssh 192.168.114.3

在 114.3 shell 内执行:

curl -sS http://127.0.0.1:9222/json/version

本次实测返回包含:

  • Browser: Chrome/146.0.7680.71
  • webSocketDebuggerUrl: ws://127.0.0.1:9222/devtools/browser/...

3) 在 114.3 配置 Claude Code MCP

先添加 server:

claude mcp add -s user chrome-devtools -- \
  npx -y chrome-devtools-mcp@latest \
  --browser-url http://127.0.0.1:9222

再在 ~/.claude.json 中补齐代理环境(本次环境需要):

{
  "mcpServers": {
    "chrome-devtools": {
      "env": {
        "HTTP_PROXY": "http://192.168.114.9:7890",
        "HTTPS_PROXY": "http://192.168.114.9:7890",
        "ALL_PROXY": "socks5://192.168.114.9:7890",
        "NO_PROXY": "127.0.0.1,localhost,192.168.114.0/24,192.168.3.0/24"
      }
    }
  }
}

原因:

  • 114.3 上直接 npx 拉取 npm 包出现 EAI_AGAIN(DNS/外网可达性问题)
  • 给 MCP 子进程加代理后恢复可用

4) 在 114.3 配置 Codex MCP

codex mcp add \
  --env HTTP_PROXY=http://192.168.114.9:7890 \
  --env HTTPS_PROXY=http://192.168.114.9:7890 \
  --env ALL_PROXY=socks5://192.168.114.9:7890 \
  --env NO_PROXY=127.0.0.1,localhost,192.168.114.0/24,192.168.3.0/24 \
  chrome-devtools -- \
  npx -y chrome-devtools-mcp@latest \
  --browser-url http://127.0.0.1:9222

验证记录

2026-06-17 KDE 任务栏入口改为 CDP 启动

背景

本次目标不是临时从命令行启动 CDP 浏览器,而是让本地 KDE 任务栏里已经固定的 ungoogled-chromium 图标每次点击都启动支持 CDP 的浏览器。

先确认当前面板固定项:

rg -n "launchers=.*ungoogled-chromium.desktop|ungoogled-chromium.desktop" \
  ~/.config/plasma-org.kde.plasma.desktop-appletsrc \
  ~/.config/kactivitymanagerd-statsrc

关键结果:

~/.config/plasma-org.kde.plasma.desktop-appletsrc:51:launchers=...,applications:ungoogled-chromium.desktop,...

说明 KDE 面板引用的是 applications:ungoogled-chromium.desktop。本机同时存在系统级和用户级 desktop 文件,用户级文件优先:

  • ~/.local/share/applications/ungoogled-chromium.desktop
  • /usr/share/applications/ungoogled-chromium.desktop

因此只修改用户级 desktop 文件,避免影响系统全局配置。

修改内容

修改文件:

~/.local/share/applications/ungoogled-chromium.desktop

关键字段修改为:

Name=Ungoogled Chromium (CDP)
Comment=Browse the web with local CDP on 127.0.0.1:9222
Exec=/usr/local/bin/ungoogled-chromium --ozone-platform=x11 --user-data-dir=/home/dev/.config/chromium-cdp-codex --remote-debugging-address=127.0.0.1 --remote-debugging-port=9222 --no-first-run --disable-default-apps %U
StartupWMClass=chromium-browser

这里显式使用独立 profile:

/home/dev/.config/chromium-cdp-codex

原因:

  • 如果复用默认 profile,而默认 ungoogled-chromium 已经运行,新的 --remote-debugging-port 参数可能被已有进程忽略。
  • 独立 profile 可以保证任务栏点击启动的是 CDP 专用实例。
  • CDP 继续绑定 127.0.0.1:9222,不开放 LAN 监听。

刷新 KDE 应用缓存:

kbuildsycoca6 --noincremental

输出:

kbuildsycoca6 running...

校验 desktop 文件:

desktop-file-validate ~/.local/share/applications/ungoogled-chromium.desktop

无输出表示校验通过。

临时启动与反向隧道

本次先用命令行启动了同一个 CDP profile,确保当前会话立即可用:

mkdir -p "$HOME/.config/chromium-cdp-codex" "$HOME/.local/state/codex-cdp"

setsid -f env DISPLAY=:1 WAYLAND_DISPLAY=wayland-0 XDG_SESSION_TYPE=wayland \
  /usr/local/bin/ungoogled-chromium \
  --ozone-platform=x11 \
  --user-data-dir="$HOME/.config/chromium-cdp-codex" \
  --remote-debugging-address=127.0.0.1 \
  --remote-debugging-port=9222 \
  --no-first-run \
  --disable-default-apps \
  --new-window about:blank \
  >"$HOME/.local/state/codex-cdp/ungoogled-chromium-cdp.log" 2>&1

建立到 192.168.114.3 的 SSH reverse tunnel:

ssh -f -N -T \
  -o ExitOnForwardFailure=yes \
  -o ServerAliveInterval=30 \
  -o ServerAliveCountMax=3 \
  -R 127.0.0.1:9222:127.0.0.1:9222 \
  192.168.114.3

注意:中途会话被中断后,后台 SSH tunnel 曾经消失,表现为 192.168.114.3 上 curl http://127.0.0.1:9222/json/version 返回连接失败。重新执行上面的 ssh -R 命令后恢复。

验证结果

本机验证:

ss -ltnp | rg ':9222\b'
curl -sS --max-time 3 http://127.0.0.1:9222/json/version

关键输出:

LISTEN 0 10 127.0.0.1:9222 0.0.0.0:* users:(("chrome",pid=414646,fd=97))
{
   "Browser": "Chrome/147.0.7727.101",
   "Protocol-Version": "1.3",
   "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/f7f111f1-057f-4d4b-817b-9db84711f754"
}

远端 192.168.114.3 验证:

ssh 192.168.114.3

ss -ltnp | grep -E "127\\.0\\.0\\.1:9222\\b|\\[::1\\]:9222\\b"
curl -sS --max-time 3 http://127.0.0.1:9222/json/version

关键输出:

LISTEN 0 128 127.0.0.1:9222 0.0.0.0:*
{
   "Browser": "Chrome/147.0.7727.101",
   "Protocol-Version": "1.3",
   "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/f7f111f1-057f-4d4b-817b-9db84711f754"
}

当前使用方式

  • 本机 Codex 使用:http://127.0.0.1:9222
  • 192.168.114.3 上的 Codex 使用:http://127.0.0.1:9222
  • 本地 KDE 任务栏点击 Ungoogled Chromium (CDP),会按上述 desktop 文件启动 CDP profile。
  • 若重启后远端 Codex 需要继续复用本机浏览器,仍需重新建立 ssh -R,除非后续改成 systemd user service 或 SSH config 常驻会话。

1) MCP 连接状态

在 114.3 上:

claude mcp get chrome-devtools
codex mcp get chrome-devtools --json

关键结果:

  • Claude:Status: ✓ Connected
  • Codex:args 指向 --browser-url http://127.0.0.1:9222

2) Codex 通过 CDP MCP 实测打开页面

在 114.3 上执行:

codex exec --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check -C /home/van \
  "使用 chrome-devtools MCP 打开 https://www.baidu.com ,并返回页面标题与最终 URL。"

实测返回:

  • 页面标题:百度一下,你就知道
  • 最终 URL:https://www.baidu.com/

常见问题

1) remote port forwarding failed for listen port 9222

原因:

  • 远端 114.3:9222 已被其他 SSH 隧道占用(通常是旧会话未断开)

处理:

  1. 断开旧 SSH 会话
  2. 或在 114.3 检查并释放占用后重连

2) npx 相关 MCP 启动失败(EAI_AGAIN)

原因:

  • npm registry 解析/访问异常

处理:

  • 在 Claude/Codex MCP 的 env 中显式设置代理变量(见上文)

日常使用建议

  1. 先在 114.4 启动 Chromium CDP(保持 127.0.0.1:9222)
  2. 从 114.4 执行 ssh 192.168.114.3 保持会话在线
  3. 在该 SSH 会话中启动 claude 或 codex,直接使用 chrome-devtools MCP
  4. 完成后断开 SSH,会自动回收转发

回滚

回滚 114.4 SSH 配置

删除 ~/.ssh/config 中 Host 192.168.114.3 下的:

  • ExitOnForwardFailure
  • ServerAliveInterval
  • ServerAliveCountMax
  • RemoteForward 127.0.0.1:9222 127.0.0.1:9222

回滚 114.3 MCP

claude mcp remove -s user chrome-devtools
codex mcp remove chrome-devtools

关联笔记

更早的本机部署与基础配置参考:ungoogled-chromium-作为-cdp-mcp-浏览器的部署与实践