从外部安全访问家里的 OpenClaw:拓扑、数据流与排障
本文是面向家庭服务器读者的原创指南,与家庭服务器运行 OpenClaw衔接;命令与配置键以 2026-11-06 检出的官方文档固定快照为准核对,步骤未在本站实机运行。完整的键与命令参考见远程访问参考页,本文不重复其全文。
家里跑着 OpenClaw,人在公司、通勤路上或被窝里想用——这件事的本质是:Gateway 在家里某台机器的 127.0.0.1:18789(默认端口,可配置)上,你的设备在外面。把两者接起来的每种方法,都是一次"暴露范围 vs 运维成本"的取舍。
一、先想清楚你在保护什么
Gateway 是 OpenClaw 的控制面:它持有会话历史、模型 Provider 凭据、聊天渠道账号和全部状态。把权限拆开看:网络可达(能建立连接)≠ Gateway 认证(token/password/tailnet 身份)≠ 节点配对 ≠ 角色与 scopes 授予的实际权限——网络可达本身不赋予任何操作员能力,但每多一层可达就多一分被凭据攻击面接触的机会。所以远程访问的安全目标是:链路加密 + 只有你和你的设备可达 + Gateway 认证把关,三者缺一不可。
二、四层拓扑,按暴露范围从小到大选
| 拓扑 | 适合 | 代价 |
|---|---|---|
| 仅本机(loopback 默认) | 只在那台机器上用 | 出门就用不了 |
家庭局域网(bind 到 LAN 地址 + 认证) | 只在家里其他设备用 | 出门仍不可达 |
| Tailnet / Tailscale Serve(推荐的外出方案) | 你自己的手机/笔记本/平板,任意网络 | 每台设备装 Tailscale |
| 公网暴露(Funnel 或自建反向代理,均需 TLS) | 需要任意外网设备到达 | 攻击面最大;认证按方案而异:Funnel 按官方要求配共享密码,反向代理按 trusted-proxy / token / password 契约配置(详见下文"公网暴露") |
选择判据(作者建议):先问"需要访问的设备是不是都能进同一个 tailnet"——能,就用 Serve,这是暴露面最小的外出方案;不能且该设备能 SSH 登录你的服务器(有可达的 SSH 服务与有效登录身份,借来的公共电脑通常不满足),退到 SSH 隧道;确实要任意外网设备到达,再在 Funnel 与自建反向代理之间选,并接受公网暴露。
两条硬规则(官方):Gateway 保持 loopback 除非你确定要绑定;任何非 loopback 绑定必须配 Gateway 认证(token/password/trusted-proxy)。
三、每层的链路与信任边界
Tailnet / Serve:流量走 Tailscale 的 WireGuard 加密,gateway.tailscale.mode: "serve" 让 Gateway 保持 loopback、由 Tailscale 提供 HTTPS 与路由;allowTailscale: true 时可用 Tailscale 身份 header 认证——注意该 header 认证只覆盖 Control UI/WebSocket 流量,HTTP API 端点仍走 Gateway 正常 HTTP 认证模式;这个免 token 流程假设 Gateway 主机本身受信。信任边界不止"是不是 tailnet 成员":tailnet 的 ACL/grants、设备与节点配对状态、Gateway 自身的认证与角色仍然各自生效——Serve 缩小的是网络暴露面,不是授权模型。
SSH 隧道:在你外出设备上执行
ssh -N -L 18789:127.0.0.1:18789 user@gateway-host(18789 为默认端口 gateway.port,可配置;远程端口不同时目的端口写 127.0.0.1:<远程端口>。)本地 18789 经你家服务器(SSH 服务)转发到 Gateway。前提是该设备能通过网络到达你的 SSH 服务并持有效登录身份;流量加密依赖 SSH;信任边界=能登录你家服务器 SSH 的密钥。注意 openclaw 的 --url 参数绝不回退到配置里的凭据——显式带 --token/--password,否则目标要求认证时直接失败(这是安全特性,不是 bug)。
公网暴露,两种做法要分开评估:
- Tailscale Funnel:官方要求配置共享密码——这是 Funnel 模式自身的约束,不要泛化到其他方案。
- 自建反向代理:按官方 trusted-proxy 契约配置(
gateway.auth.mode: "trusted-proxy",代理注入身份 header),或保留 token/password 认证;同主机 loopback 反代还需显式trustedProxy.allowLoopback = true。
信任边界=知道凭据的任何人,含扫描器——公网是最后选项。
四、检查顺序:从链路到服务
“连不上"按这个顺序查,每步都有确定性命令(说明性示例,未实机运行):
- 隧道/网络通不通:SSH 场景先确认隧道进程在(
ps aux | grep "ssh -N");Tailscale 场景tailscale status确认两台设备都在线且同一 tailnet。 - 端口对不对:本地
curl http://127.0.0.1:18789应有响应(哪怕 401);没有就查-L的本地端口与gateway.port是否一致(远程端口不同时隧道目的端口要写成127.0.0.1:<远程端口>)。 - 凭据对不对:
openclaw gateway status --url ws://127.0.0.1:18789 --token <your-token>——能通就是链路+认证都好;报认证失败就核对 token(凭据解析优先级见参考页"凭据优先级"节)。 - Gateway 本身健康吗:
openclaw health、openclaw status --deep。
五、失败与恢复
- 隧道断开(网络切换/休眠):macOS 可用 LaunchAgent 常驻隧道(
KeepAlive崩溃自动重启,完整 plist 与命令见远程访问参考页);手动重启用完整标签launchctl kickstart -k gui/$UID/ai.openclaw.ssh-tunnel。 - 端口漂移/被占:
lsof -i :18789查占用;换本地端口时记得同步改客户端 URL。 - 凭据作用域变化:SSH 别名重新指到另一台 Gateway 时,旧别名缓存的设备凭据可能被发往新目的地——连不同 Gateway 用新别名(官方语义)。
- 远程端口与本地不同:隧道写
-L 18789:127.0.0.1:<远程端口>,客户端仍连ws://127.0.0.1:18789,无需改配置。
与其他页面的分工
- 全部配置键、凭据优先级契约、Cloudflare Access 等企业场景:远程访问参考页
- 服务器侧部署(安装、常驻服务、备份):家庭服务器运行 OpenClaw
- 模型 Provider 认证(与连接认证相区分):认证