让服务器上的 OpenClaw 控制本地浏览器:通过 Cloudflare Tunnel 安全连接
以下内容是 AI 总结的,注意准确性,推荐使用 AI 来帮忙配置。
引言
OpenClaw 支持通过 Chrome DevTools Protocol(CDP)控制真实浏览器,完成网页浏览、数据采集、表单填写等任务。当 OpenClaw 部署在远程服务器上时,它默认会在服务器本地启动浏览器实例。但如果你希望它控制你本地电脑上的浏览器——比如 Mac 上的 Brave——就需要解决一个问题:如何安全地将本地浏览器的 CDP 端口暴露给远程服务器?直接开放端口到公网是极其危险的,因为 CDP 拥有对浏览器的完全控制权限,任何能连上这个端口的人都可以随意操作你的浏览器。
本文介绍如何利用 Cloudflare Tunnel + Zero Trust Access,让 OpenClaw 安全地远程控制你 Mac 上的 Brave 浏览器,无需开放任何公网端口。
架构概览
整体架构分为三个部分:
远程服务器 Cloudflare 本地 Mac
┌──────────────┐ HTTPS ┌───────────────────┐ Tunnel ┌──────────────────┐
│ OpenClaw │─────────────▶│ Edge + Access │─────────▶│ cloudflared │
│ │ │ (IP 白名单) │ │ │ │
└──────────────┘ └───────────────────┘ │ ▼ │
│ Brave Browser │
│ CDP :9222 │
└──────────────────┘
关键设计点:
- Cloudflare Tunnel 负责安全传输,本地无需暴露任何端口
- Cloudflare Access 通过 IP 白名单限制访问,只允许 OpenClaw 所在服务器连接
- Host Header 重写解决 CDP 的 localhost 校验问题
数据流向:OpenClaw 发起 HTTPS 请求 → Cloudflare 边缘节点校验来源 IP → 通过 Tunnel 转发到本地 Mac → cloudflared 将请求送达 Brave 的 CDP 端口 → 响应原路返回。
第一部分:本地 Mac 配置
1.1 安装 Cloudflare Tunnel 客户端
brew install cloudflare/cloudflare/cloudflared
cloudflared tunnel login
执行 login 后会自动打开浏览器,登录你的 Cloudflare 账号并完成授权。
1.2 创建 Tunnel
cloudflared tunnel create <tunnel-name>
创建成功后会输出 Tunnel ID 和凭证文件路径,请记下这两个信息,后续配置需要用到。
1.3 配置 Tunnel
创建配置文件 ~/.cloudflared/config.yml:
tunnel: <tunnel-name>
credentials-file: <凭证文件路径>
ingress:
- hostname: <your-domain>
service: http://localhost:9222
originRequest:
httpHostHeader: localhost:9222
- service: http_status:404
这里有一个关键配置:httpHostHeader: localhost:9222。Brave/Chrome 的 CDP 服务会校验请求的 Host 头,如果不是 localhost 就会拒绝连接。这个配置让 Cloudflare 在转发请求时将 Host 头重写为 localhost:9222,从而绕过这个限制。
1.4 配置 DNS 路由
cloudflared tunnel route dns <tunnel-name> <your-domain>
这会在 Cloudflare DNS 中自动创建一条 CNAME 记录,将你的域名指向这条 Tunnel。
1.5 编写 Brave 启动脚本
创建 start-brave-cdp.sh:
#!/bin/bash
sleep 1
# 以 CDP 模式启动 Brave,使用独立的用户配置目录
/Applications/Brave\ Browser.app/Contents/MacOS/Brave\ Browser \
--remote-debugging-port=9222 \
--user-data-dir=~/browser-ai-profile \
--no-first-run \
--no-default-browser-check
几个要点:
--remote-debugging-port=9222:启用 CDP,监听 9222 端口--user-data-dir:使用独立的配置目录,与日常浏览完全隔离,AI 的操作不会影响你的个人浏览数据--no-first-run:跳过首次运行向导
1.6 编写 Tunnel 启动脚本
创建 start-tunnel.sh:
#!/bin/bash
echo "Starting Cloudflare Tunnel..."
cloudflared tunnel run <tunnel-name>
给两个脚本添加执行权限:
chmod +x start-brave-cdp.sh start-tunnel.sh
第二部分:Cloudflare Access 配置(IP 白名单)
这是整个方案安全性的核心。我们需要确保只有 OpenClaw 所在的服务器能访问浏览器的 CDP 端口。
2.1 创建 Access Application
- 登录 Cloudflare Dashboard
- 进入 Zero Trust → Access → Applications
- 点击 "Add application" → 选择 "Self-hosted"
- 填写应用名称(自定义即可)
- 填写应用域名(与 Tunnel 配置中的域名保持一致)
2.2 创建 Access Policy
- 策略名称:自定义
- Action 选择
Bypass - Include 条件选择 "IP Ranges",填入 OpenClaw 所在服务器的公网 IP(CIDR 格式,如
x.x.x.x/32) - 保存
配置完成后,只有来自指定 IP 的请求能通过,其他所有请求都会被 Cloudflare 拦截并返回 403。
这个方案的安全性基于 TCP 握手机制——源 IP 无法被伪造,因为 Cloudflare 在边缘节点验证的是 TCP 连接的源地址。
第三部分:OpenClaw 服务器配置
编辑 OpenClaw 配置文件 ~/.openclaw/openclaw.json,添加远程浏览器配置:
{
"browser": {
"enabled": true,
"defaultProfile": "remote",
"remoteCdpTimeoutMs": 5000,
"remoteCdpHandshakeTimeoutMs": 10000,
"profiles": {
"remote": {
"cdpUrl": "https://<your-domain>"
}
}
}
}
关键参数说明:
cdpUrl:直接使用 HTTPS 域名,不要用localhost或127.0.0.1remoteCdpTimeoutMs/remoteCdpHandshakeTimeoutMs:适当增大超时时间,因为请求需要经过 Cloudflare 中转,延迟会比本地连接高defaultProfile:设为远程配置的名称,这样 OpenClaw 默认就会使用远程浏览器
重启 OpenClaw
openclaw gateway restart
openclaw gateway status
第四部分:启动与验证
4.1 在 Mac 上启动服务
需要两个终端窗口:
终端 1 — 启动浏览器(会阻塞当前终端):
./start-brave-cdp.sh
终端 2 — 启动 Tunnel(同样会阻塞终端):
./start-tunnel.sh
4.2 从 OpenClaw 服务器验证连接
curl -s https://<your-domain>/json/version
如果返回了包含 Browser、Protocol-Version 等字段的 JSON 数据,说明整条链路已经打通。
4.3 在 OpenClaw 中使用
配置完成后,OpenClaw 会自动通过远程 CDP 连接控制你 Mac 上的 Brave 浏览器。正常使用浏览器工具即可,无需额外操作。
备注:为什么用 IP 白名单而不是 Cloudflare Access 认证头
你可能会想:Cloudflare Access 支持通过 Service Token 认证,为什么不用更标准的认证头(CF-Access-Client-Id / CF-Access-Client-Secret)方式,而是选择了 IP 白名单?
原因是 OpenClaw 目前不支持在 CDP 连接中附加自定义请求头。这意味着它无法携带 Cloudflare Access 所需的认证信息。
一个自然的想法是在 OpenClaw 服务器上用 Nginx 做反向代理:OpenClaw 连接本地 Nginx,Nginx 注入认证头后转发到 Cloudflare。但这条路也走不通——OpenClaw 在连接 CDP 端点之前会检查目标地址的端口是否已被占用,如果 cdpUrl 指向 localhost,而该端口已经被 Nginx 监听,OpenClaw 就会拒绝连接。这很可能是一个 bug:OpenClaw 作为 CDP 客户端,不应该要求它要连接的端口处于空闲状态。
所以 IP 白名单是目前最可行的方案。好在对于固定 IP 的服务器来说,这个方案足够安全且几乎零维护。