网络层防御:用 Cloudflare Tunnel 给 OpenClaw 加把锁

很多 OpenClaw 用户都有远程访问的需求:出门在外,想用手机给家里的电脑下指令;在公司,想访问家里跑着的 Agent。

直接暴露端口太危险(OpenClaw 刚爆出的 RCE 漏洞就是明证)。配 VPN 又太麻烦,普通用户搞 WireGuard、OpenVPN 的配置文件头都大。

这时候,Cloudflare Tunnel (Zero Trust) 是一个非常好的平衡方案。它不需要你有公网 IP,不需要开任何入站端口,不需要复杂的 VPN 配置,还能自带一层身份验证。

这篇文章会详细讲解如何用 Cloudflare Tunnel 给你的 OpenClaw 加一把"锁"。

为什么 Cloudflare Tunnel 比直接暴露端口安全?

先理解一下传统方案的问题。

传统方案:端口转发

互联网 → 路由器公网 IP:3000 → 内网 192.168.1.100:3000 (OpenClaw)

问题:

  1. 你的家庭公网 IP 直接暴露,可以被扫描、被攻击
  2. 任何人都能尝试访问你的服务
  3. 如果 OpenClaw 有漏洞(比如刚爆出的 RCE),攻击者可以直接利用
  4. 没有任何身份验证(除非 OpenClaw 自己的验证,但它可能有漏洞)

Cloudflare Tunnel 方案:

你的设备 → Cloudflare 网络 → cloudflared (你家里) → OpenClaw

攻击者 → Cloudflare 网络 → Cloudflare Access (身份验证) → 被拦截

优点:

  1. 隐藏真实 IP:攻击者只能看到 Cloudflare 的 IP,扫不到你的家庭网络
  2. 不需要开端口:cloudflared 是主动连出去的,不需要入站连接
  3. 自带身份验证:Cloudflare Access 可以在流量到达你的服务之前进行身份验证
  4. 即使 OpenClaw 有漏洞,攻击者也触碰不到:因为要先通过 Cloudflare 的身份验证

这最后一点是关键。还记得 OpenClaw 的 RCE 漏洞吗?如果你有 Cloudflare Access 保护,攻击者发的恶意链接根本不起作用——因为在到达 OpenClaw 之前,就被 Cloudflare 的登录页面拦下来了。

开始配置

前提条件

  1. 一个 Cloudflare 账号(免费即可)
  2. 一个域名,并把 DNS 托管到 Cloudflare
  3. 你的 OpenClaw 已经在本地跑起来了

第一步:安装 cloudflared

cloudflared 是 Cloudflare 的隧道客户端,运行在你的内网里,负责把流量从 Cloudflare 转发到你的本地服务。

macOS:

brew install cloudflared

Ubuntu/Debian:

# 添加 Cloudflare 的 GPG key
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg > /dev/null

# 添加 apt 源
echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared focal main" | sudo tee /etc/apt/sources.list.d/cloudflared.list

# 安装
sudo apt update && sudo apt install cloudflared

Docker:

docker pull cloudflare/cloudflared:latest

第二步:登录 Cloudflare

cloudflared tunnel login

这会打开浏览器,让你授权。选择你要使用的域名,授权后会在本地生成一个证书文件(默认在 ~/.cloudflared/cert.pem)。

第三步:创建隧道

# 创建一个名为 "my-home-tunnel" 的隧道
cloudflared tunnel create my-home-tunnel

这会输出一个 Tunnel ID(类似 a1b2c3d4-e5f6-7890-abcd-ef1234567890),并在 ~/.cloudflared/ 下生成对应的凭证文件。

第四步:配置隧道

创建配置文件 ~/.cloudflared/config.yml

# ~/.cloudflared/config.yml

tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890  # 你的 Tunnel ID
credentials-file: /Users/yourname/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json

ingress:
  # OpenClaw 服务
  - hostname: openclaw.yourdomain.com
    service: http://localhost:3000
  
  # 可以添加其他服务
  # - hostname: another.yourdomain.com
  #   service: http://localhost:8080
  
  # 默认规则(必须放最后)
  - service: http_status:404

第五步:创建 DNS 记录

cloudflared tunnel route dns my-home-tunnel openclaw.yourdomain.com

这会在 Cloudflare DNS 里自动创建一条 CNAME 记录,指向你的隧道。

第六步:启动隧道

# 前台运行(测试用)
cloudflared tunnel run my-home-tunnel

# 或者作为服务运行
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared  # 开机自启

现在,访问 https://openclaw.yourdomain.com 应该就能看到你的 OpenClaw 了。

但等等,我们还没加身份验证!现在任何人访问这个地址都能看到你的 OpenClaw,只是 IP 被隐藏了而已。

第七步:配置 Cloudflare Access(关键!)

这是最重要的一步。Cloudflare Access 可以在流量到达你的服务之前,要求用户进行身份验证。

7.1 进入 Zero Trust 面板

  1. 登录 Cloudflare Dashboard
  2. 在左侧菜单找到 "Zero Trust" 或直接访问 one.dash.cloudflare.com

7.2 创建 Access 应用

  1. 左侧菜单:Access → Applications → Add an application
  2. 选择 "Self-hosted"
  3. 填写信息:
    • Application name: OpenClaw
    • Session Duration: 24 hours(或你想要的时长)
    • Application domain: openclaw.yourdomain.com

7.3 配置访问策略

这一步告诉 Cloudflare:谁可以访问这个应用。

最简单的方式:邮箱白名单

  1. Policy name: Allow my email
  2. Action: Allow
  3. Configure rules:
    • Include → Emails: your@email.com

这样只有 your@email.com 这个邮箱的主人才能访问。

验证方式

Cloudflare Access 支持多种身份验证方式:

  • One-time PIN(默认):输入邮箱后,发送一次性验证码到邮箱
  • Google / GitHub / 其他 OAuth:用已有的账号登录
  • SAML / OIDC:企业单点登录

推荐使用 GitHub 或 Google 登录,更方便:

  1. 左侧菜单:Settings → Authentication
  2. Add new → Login methods
  3. 选择 GitHub 或 Google,按提示完成 OAuth 配置
  4. 回到 Application 的 Policy,改为 "Include → Login Methods → GitHub"

7.4 保存并测试

保存配置后,访问 https://openclaw.yourdomain.com

你应该会看到 Cloudflare 的登录页面(带有 Cloudflare logo),而不是直接进入 OpenClaw。

只有通过身份验证后,才能看到 OpenClaw 的界面。

Docker Compose 完整配置

如果你想把所有东西都用 Docker Compose 管理:

# docker-compose.yml
version: '3.8'

services:
  openclaw:
    image: openclaw/openclaw:latest
    container_name: openclaw
    # 注意:只绑定到 localhost,不直接对外
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./data:/app/data
      - ./config:/app/config:ro
    environment:
      - AUTH_ENABLED=true  # 仍然建议开启应用级鉴权作为第二道防线
    restart: unless-stopped
  
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    command: tunnel --config /etc/cloudflared/config.yml run
    volumes:
      - ./cloudflared:/etc/cloudflared:ro
    depends_on:
      - openclaw
    restart: unless-stopped
    # 注意:cloudflared 需要能访问 openclaw:3000
    # 所以它们需要在同一个 Docker 网络里
    network_mode: host  # 或者配置 Docker network

对应的 cloudflared 配置(./cloudflared/config.yml):

tunnel: your-tunnel-id
credentials-file: /etc/cloudflared/your-tunnel-id.json

ingress:
  - hostname: openclaw.yourdomain.com
    service: http://localhost:3000  # 因为用了 host 网络,可以直接访问 localhost
  - service: http_status:404

记得把 Tunnel 的凭证文件也放到 ./cloudflared/ 目录下。

高级配置

添加更多安全层

1. IP 地理限制

在 Access Policy 中添加规则,只允许特定国家/地区的 IP:

Include:
  - Emails: your@email.com
  - Country: China, Japan, United States

2. 设备认证(需要 WARP 客户端)

让访问者必须使用安装了 WARP 客户端的设备:

Require:
  - Gateway Policy: Enrolled in your organization

3. 多因素认证

要求访问者必须通过 MFA:

Require:
  - Authentication Method: MFA - Any method

日志和审计

Cloudflare Access 会记录所有访问日志,你可以在 Zero Trust 面板的 Logs 里查看:

  • 谁在什么时间访问了
  • 从哪个 IP / 国家访问的
  • 使用了什么身份验证方式
  • 访问是被允许还是拒绝

这对于安全审计非常有价值。

自定义登录页面

你可以自定义登录页面的外观,让它看起来更像你的个人品牌:

  1. Zero Trust → Settings → Custom Pages
  2. 上传 logo,修改颜色和文案

费用说明

Cloudflare Zero Trust 有免费套餐,包含:

  • 最多 50 个用户
  • 无限的 Tunnel
  • 基本的 Access 功能

对于个人使用完全够用。只有需要更高级的功能(如设备姿态检查、SAML 集成等)才需要付费。

与 VPN 方案的对比

特性 Cloudflare Tunnel Tailscale WireGuard
设置复杂度 中等 简单 复杂
需要公网 IP 是(服务端)
需要开端口
身份验证 内置(Access) 内置 需自行配置
加密 TLS WireGuard WireGuard
访问控制 强大(基于身份/设备/地理) 中等 需自行配置
日志审计 内置 有限 需自行配置
性能 依赖 Cloudflare 网络 P2P,通常更快 P2P,最快
适用场景 对外暴露服务,需要精细访问控制 纯内部访问 技术能力强的用户

我的建议:

  • 如果你只是想在自己的设备上访问 OpenClaw,Tailscale 可能更简单
  • 如果你想让服务在某种程度上"对外可用"(比如演示给朋友),或者需要精细的访问控制,Cloudflare Tunnel 更合适
  • 如果你是老司机,追求最佳性能和完全控制,WireGuard 是最好的选择

总结

用 Cloudflare Tunnel 保护 OpenClaw 的核心步骤:

  1. 安装 cloudflared
  2. 创建隧道,配置域名指向本地服务
  3. 关键:配置 Cloudflare Access,要求身份验证
  4. 启动隧道作为服务运行

这个方案的精髓在于:即使你的 OpenClaw 有未知的安全漏洞,攻击者也没机会利用——因为他们首先要通过 Cloudflare Access 的身份验证,而这一层是由 Cloudflare 的安全团队维护的,比我们自己写的鉴权代码可靠得多。

这是目前个人用户能用上的性价比最高的安全方案。零成本(免费套餐),半小时配置完成,安全性大幅提升。

还在直接暴露端口的同学,是时候升级了。你的贾维斯值得一把更好的锁。

posted @ 2026-02-05 11:15  147API  阅读(27)  评论(0)    收藏  举报