让服务器上的 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       │
                                                              └──────────────────┘

关键设计点:

数据流向: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

几个要点:

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

  1. 登录 Cloudflare Dashboard
  2. 进入 Zero Trust → Access → Applications
  3. 点击 "Add application" → 选择 "Self-hosted"
  4. 填写应用名称(自定义即可)
  5. 填写应用域名(与 Tunnel 配置中的域名保持一致)

2.2 创建 Access Policy

  1. 策略名称:自定义
  2. Action 选择 Bypass
  3. Include 条件选择 "IP Ranges",填入 OpenClaw 所在服务器的公网 IP(CIDR 格式,如 x.x.x.x/32
  4. 保存

配置完成后,只有来自指定 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>"
      }
    }
  }
}

关键参数说明:

重启 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

如果返回了包含 BrowserProtocol-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 的服务器来说,这个方案足够安全且几乎零维护。