乐于分享
好东西不私藏

OpenClaw 数据安全实践——为什么 bind: loopback 是唯一正确答案

OpenClaw 数据安全实践——为什么 bind: loopback 是唯一正确答案

修正版 | 事实核查通过

开篇:一个必须纠正的错误认知

之前有个说法流传很广:“家用电脑部署 OpenClaw 更安全,因为内网 IP 外网访问不到。”

这是片面的。

今天这篇文,只讲一个核心结论:为了数据安全,openclaw.json 必须配置 bind: "127.0.0.1"


事实一:云服务器公网裸部署 = 极高风险

OpenClaw 极度不推荐在云服务器上进行公网裸部署。

原因非常直接:

  • 云服务器自带固定公网 IP。
  • 端口极易被全网自动化扫描。
  • 24 小时内必然被爆破脚本命中

一旦泄露密钥 = 服务权限完全失守。这不是“可能”,是必然。全网扫描脚本从不休息,暴露的端口就像黑夜里的灯。


事实二:家用内网 ≠ 绝对安全

这才是关键纠正点。

很多人认为:“家用宽带是内网 IP,外网访问不到,所以安全。”

错。

  • 风险在于配置
    虽然 NAT 本身是隔离的,但如果你开启了 UPnP(路由器自动端口映射) 或手动配置了端口转发,内网服务就会直接暴露给公网。
  • 全网扫描无差别攻击
    Shodan、Censys 等搜索引擎以及各类僵尸网络脚本,24小时不间断扫描全网 IP。一旦 UPnP 生效,你的端口在几分钟内就会出现在黑客的雷达上,根本不存在“内网隐身”这回事。
  • 局域网威胁
    即使不暴露公网,绑定局域网 IP 也意味着同一 WiFi 下的其他设备(可能包含被入侵设备)也能直接访问。

内网 IP 不是护身符,除非你确定没有任何端口映射且局域网完全可信。


最佳实践:bind: "127.0.0.1"

安全标准的答案只有一条:在 openclaw.json 中强制配置绑定回环地址:

// openclaw.json
// ️只有 127.0.0.1 能让服务彻底“隐身”,拒绝一切外部连接
{  "gateway": {    "bind": "127.0.0.1",    "port": 18789  }}

(注:端口号请根据你的实际配置填写,此处以默认 18789 为例)

这意味着什么?

  • 仅本机可访问
    流量不经过物理网卡,只在操作系统内部流转。
  • 物理隔绝攻击
    无论外网还是局域网,都无法直接扫描或连接你的端口。
  • 架构级安全
    即使密钥泄露,攻击者若没有服务器登录权限(SSH/RDP),也无法远程连接。

为什么这是最优解?

绑定配置
谁能访问
安全等级
评价
0.0.0.0
所有网卡(公网+局域网)
❌ 极高风险
只要有端口映射,瞬间暴露全网。
192.168.x.x
局域网 + 本机
⚠️ 中等风险
局域网内其他设备可攻击,且易受 UPnP 误配置影响。
127.0.0.1仅本机
✅ 安全
操作系统级隔离,攻击面为零。

只要绑定 127.0.0.1

  • 云服务器上
     → 安全(外网连不进回环地址)
  • 家用电脑上
     → 安全(局域网也连不进回环地址)

需要远程访问怎么办?

如果你确实需要远程使用 OpenClaw,不要直接修改 bind 配置,请使用以下方案:

方案一:SSH 隧道(强烈推荐)利用 SSH 加密通道转发流量,安全且无需开放防火墙端口。

ssh -L 18789:127.0.0.1:18789 user@your-server

本地访问 127.0.0.1:18789,流量即通过 SSH 隧道安全转发。

方案二:VPN / Tailscale搭建私人网络,接入后如同在局域网内,再配合防火墙限制访问。

方案三:内网穿透 + 鉴权使用 frp/ngrok 等工具,但必须叠加额外的鉴权层(如 Basic Auth),且不要直接暴露原始端口。

特别提醒(反向代理用户必看):如果你必须使用 Nginx/Caddy 进行反向代理,请务必在 OpenClaw 的配置文件中正确设置 trustedProxies 字段。否则,攻击者可以通过伪造 IP 请求头,轻松绕过你的鉴权机制,让“127.0.0.1”的防护形同虚设。

别忘文件安全(本地防护):即使你把网络端口封死在 127.0.0.1,OpenClaw 的 openclaw.json 中仍可能包含明文存储的 API Key 和 Token。请务必保护好你的服务器文件系统,安装杀毒软件或定期扫描,防止恶意软件(如窃密木马)直接读取本地配置文件,窃取你的密钥。


实践清单

部署 OpenClaw 前,完成这三步:

  1. 检查配置文件

    • 确认 openclaw.json 中 bind 值为 "127.0.0.1"
    • 确认不是 0.0.0.0 或缺省(部分旧版本默认监听所有网卡,等价于 bind: 0.0.0.0)。
  2. 验证监听状态请在终端输入以下命令检查端口占用情况:

    正确结果:应看到 127.0.0.1:18789错误结果:看到 0.0.0.0:18789 或 :::18789

    • Windows 用户
      netstat -ano | findstr 18789
    • macOS / Linux 用户
      netstat -an | grep 18789或者使用更直观的命令:lsof -i :18789
  3. 测试外部连接

    • 本机测试
      curl http://127.0.0.1:18789 (应成功)
    • 外部测试
      从另一台设备或手机访问 http://你的IP:18789 (应失败或无法连接)
    • 手机浏览器“真机”验证(强烈推荐):为了彻底确认安全,请拿出连接同一 WiFi 的手机进行测试:

      如果手机能打开页面,说明你的配置失败!请立即检查 bind 设置。

      • 本机测试:在电脑浏览器访问 http://127.0.0.1:18789 → 应正常显示登录页
      • 外部测试:在手机浏览器访问 http://[你的电脑内网IP]:18789 → 应显示“无法访问”或“连接超时”

结语:安全是消除攻击面

之前说“家用电脑相对安全”,这个说法在工程上不够严谨。

安全没有绝对的 “更安全”,核心是对攻击面的有效管理。

  • 云服务器裸部署 → 攻击面最大
  • 家用电脑 0.0.0.0 监听 → 攻击面不可控(取决于路由器配置)
  • 任何环境 bind: 127.0.0.1
     → 攻击面为零

最好的安全,是让攻击者根本找不到入口。

本文根据《交大龙虾安全课》核心内容编写,已纠正早期技术表述。安全是持续迭代的过程,感谢所有指出问题的朋友。

📌 核心记忆点:openclaw.json 强制配置 bind: "127.0.0.1"仅本机回环地址可访问,从根源隔绝所有网络攻击。

  1. 内网不内:UPnP 和端口转发会让内网设备瞬间裸奔。
  2. bind 为王bind: "127.0.0.1" 是物理隔绝攻击面的唯一解。
  3. 隧道代劳:远程访问请用 SSH 隧道,别开防火墙端口。
  4. 文件也防:网络防住了,别忘了本地文件也是明文存储。