你已经把 OpenClaw Gateway 跑在 VPS 或家里服务器上,却不想把 18789 端口暴露到公网;又希望笔记本、另一台 Linux 或手机节点像访问内网服务一样连上 CLI/WebSocket。本文用 Tailscale 私网隧道 + 默认回环绑定讲清拓扑边界、令牌与环境变量、远程 CLI 检查清单,并专门拆「隧道通但 RPC/会话不正常」的分流排错。读完你会知道与站内 Cloudflare Tunnel + systemd 篇如何分工,以及在重负载场景如何自然衔接 独占远程 Mac 算力。
OpenClaw Gateway 默认把控制面绑在 127.0.0.1,本质是把攻击面压在操作系统已承诺的边界里:只有本机进程能直接碰 WebSocket/HTTP 控制面。很多初次部署者为了「远程也能 openclaw」直接把监听地址改成 0.0.0.0,再用手写防火墙规则补短板——这在演示环境可行,在生产上会把未授权扫描、Token 泄露、误配 CORS一次性放大。
扫描面指数级上升:一旦端口对公网可达,自动化扫描会在数小时内命中;即使你暂时用了强 Token,日志里也会充满噪声,SOC 告警难以收敛。
与「最小暴露面」安全篇冲突:站内《Gateway 安全加固》强调回环、Token 轮换与执行审批;把 bind 打开到全网相当于自废第一层门槛。
排错信号被污染:公网路径上还有 CDN、运营商 NAT、公司代理;你把问题误归因为 OpenClaw,实际上 half-close 与 MTU 问题会反复出现。
合规审计难过:「谁从哪个公网 IP 连进了 Agent 控制面」很难映射到自然人;私网 tailnet 身份(机器用户 + ACL)更好写进制度。
多 Gateway 拓扑更难收敛:当你在同一主机跑第二实例试验时,端口碰撞与 Token 混用概率陡增。
与远程 Mac 场景不匹配:真正需要长期算力的是 Xcode、模拟器与大缓存;Gateway 更适合保持轻量,把重活调度到独占节点。
正确的心智是:保持 Gateway 在 loopback,用受控网络层(Tailscale 等)解决可达性。这与把数据库只绑 127.0.0.1 再通过 SSH 隧道访问是同一类工程习惯。若你更熟悉 Cloudflare Tunnel,可先对照 Linux VPS + systemd + Cloudflare Tunnel 篇理解「边缘入口」与本文「纯 tailnet」的差异。
| 维度 | Loopback + Tailscale | 裸 bind 公网 | Cloudflare Tunnel |
|---|---|---|---|
| 信任模型 | 基于 tailnet 身份 + ACL,默认私网 | 依赖防火墙 + Token,暴露面大 | 基于边缘身份与 Tunnel 凭证,偏公网入口 |
| 运维复杂度 | 中:要维护 ACL 与主机名 | 低起步,高长期风险 | 中高:DNS、证书、回源策略 |
| 与 OpenClaw 默认配置契合度 | 高:无需改 bind | 低:常诱导改 bind | 中:Tunnel 指回 loopback 端口 |
| 典型用户 | 个人与小型团队内网编排 | 不推荐生产 | 需要从公网安全入口的场景 |
「隧道解决的是路由问题,不是鉴权问题;Token 与执行审批仍然必须全开。」
Tailscale 的价值在于把多台设备放进同一信任域,让你可以用稳定主机名访问 100.x 地址段;它不会自动替代 Gateway 侧的 Token。若你把 ACL 配得过宽(例如 *:*),等价于在 tailnet 内部复制了一个「小公网」。
在 2026 年的常见拓扑里,还会遇到子网路由(subnet router)与 exit node:前者让未装 Tailscale 的局域网段也能被 tailnet 访问,后者让指定设备的出口流量经另一台机转发。若 Gateway 与数据库同处一个 VPC,而你的笔记本只连 tailnet,就要认真画「哪些 src 能进到 DB 端口」——否则会出现「Gateway 能 curl 通数据库、远程 CLI 却间歇 500」的错觉,本质是 ACL 或路由不对称。
另一个高频细节是 MagicDNS 与搜索域:某些企业网络会把 *.ts.net 解析劫持到内网 DNS;排障时可在笔记本上同时用 dig 指向公共解析与 tailnet 内置解析对照,避免把「DNS 混用」误判成 OpenClaw 会话异常。把结论写进运维手册后,新同事 onboarding 会省掉大量重复试错。
在 Gateway 主机上安装并登录 Tailscale 后,先在同一 tailnet 的笔记本上验证 ping 与 tailscale ping 的 RTT;再打开 Admin 控制台核对:该节点是否打上正确的 tag、是否启用了 MagicDNS、以及 ACL 是否显式允许 TCP 18789(或你自定义端口)从运维子网到 Gateway 角色。
// ACL 片段示例:仅允许带 tag:ops 的机器访问 Gateway 节点的 18789
{
"groups": { "group:ops": ["alice@github", "bob@github"] },
"tagOwners": { "tag:gateway": ["group:ops"] },
"acls": [
{
"action": "accept",
"src": ["tag:ops"],
"dst": ["tag:gateway:18789"]
}
]
}
注意:示例仅说明形状。真实 ACL 还要覆盖 exit node、子网路由与手机节点的最小权限;变更后务必在测试设备上重连 tailnet 再验。
验收清单建议写进变更单:① Gateway 进程仍监听 127.0.0.1:18789;② 从运维机 curl -v http://127.0.0.1:18789 在远端通过 SSH 本地转发之外,应能通过 tailnet IP 访问到同一健康检查端点(具体路径以你部署版本为准);③ 关闭公网安全组上所有对 18789 的入站。若你希望把「渠道消息进不来」类问题与本文对照,可读 channels 探测与 dmPolicy 门控 专题。
以下步骤假设 Gateway 已在本机 openclaw doctor 全绿;若尚未完成首跑,请先读 全平台安装与首跑排错 再回本文。
确认监听地址:在服务器上 lsof -nP -iTCP:18789 -sTCP:LISTEN,应看到绑定在 127.0.0.1。若看到 *:18789,先回退配置再谈隧道。
固定 Token 来源:优先使用环境变量 OPENCLAW_GATEWAY_TOKEN 注入,避免把长期密钥写进可被同步的配置仓库。
在笔记本配置 remote:在客户端 ~/.openclaw/openclaw.json 增加指向 tailnet 主机名与端口的 remote 段(字段名以你当前 CLI 版本帮助为准),确保 WebSocket URL 使用 ws:// 或 wss:// 与内网策略一致。
显式导出端口环境变量:若使用非默认端口,保证 OPENCLAW_GATEWAY_PORT 在服务端与客户端会话中一致,避免「doctor 通过、远程 CLI 连错口」。
验证 TLS 终止位置:若你在 tailnet 内又套了本地反向代理,确认 WebSocket 升级头未被中间件剥掉。
记录一次成功会话的日志指纹:把 gateway status、doctor 与一次失败会话放在同一工单,便于以后升级 Gateway 版本时对照。
// 客户端 ~/.openclaw/openclaw.json 示意(字段以官方 CLI 为准)
{
"gateway": {
"remote": {
"url": "ws://openclaw-gateway.tailnet-1234.ts.net:18789",
"token": "use-env-or-osx-keychain-instead-of-plaintext"
}
}
}
提示:不要把 Gateway 与重型文件编译绑在同一台小内存 VPS 上;当 Agent 需要常驻 xcodebuild 或大型依赖缓存时,更稳妥的是把执行平面放到独占远程 Mac,Gateway 只做会话与工具编排。选型可先打开 租赁价格说明 对照磁盘与地区档位。
| 现象 | 优先怀疑 | 建议动作 |
|---|---|---|
| tailscale ping 通但 CLI 超时 | 端口未进 ACL、或本机防火墙未放行回环转发链 | 先在服务器本机 loopback 验证,再逐级向外 |
| HTTP 401 / 鉴权失败 | Token 不一致、环境变量未导入 systemd 单元 | 对齐 unit 的 Environment= 与当前 shell |
| WebSocket 立即断开 / gateway closed(1000) | 版本升级后 scope 或会话不兼容 | 对照站内 gateway closed 排错篇做 Token 与 scope 收敛 |
| 通道在线但消息不进 | 渠道未配对 / dmPolicy 拦截 | 跑 channels 探测子命令并对照策略表 |
若你在升级 Gateway 小版本后突然出现「同一 ACL、同一 Token,却只在远程 CLI 复现」的故障,优先比对发行说明里的破坏性变更与默认端口表,再回滚到上一个已知良好版本做二分;不要在未确认监听矩阵前反复改 ACL,否则工单里会堆满假阳性。
18789 作为多路复用控制面端口(具体以发行说明为准);任意端口漂移都必须在 systemd、Docker Compose、客户端 remote 三处同步,否则排障会陷入「一半进程读旧口」。tag:gateway 一类标签后,ACL 行数可随团队线性增长;应在运维手册写明「离职即删机 + 吊销 tailnet 设备」的固定动作。仅依赖 裸公网 bind 或过度宽松的 tailnet ACL,都会在 2026 年把 Agent 控制面推向不可审计状态;而把所有重计算压在 Gateway 同一台小 VPS 上,则会遇到内存与磁盘的双重天花板。前者缺少身份与网络层的纵深,后者缺少像云主机一样可横向扩容的执行平面。
更稳妥的组合是:Gateway 轻量常驻 + tailnet 收敛访问面 + 重任务卸载到独占 macOS 节点。在需要稳定 Xcode 工具链、长期在线会话与可合同化磁盘水位时,NodeMini 的 Mac Mini 云端租赁通常是更优解。
数据包从 tailnet 进入目标主机的协议栈后,由本机进程把流量转到 127.0.0.1:18789;你不需要把 Gateway 改成监听全网口。关键是 ACL、本机防火墙与 Token。若同时要评估 Mac 算力档位,可先打开租赁价格说明。
Tunnel 篇解决「从公网安全进入内网服务」的边缘路由;本文解决「只在 tailnet 内访问、保持 loopback」的私网模型。按场景二选一或分层组合,不要在未理解鉴权链的情况下叠床架屋。
可在博客 OpenClaw 分类列表按主题筛选;连接与账号类问题也可对照帮助中心中与 SSH/远程算力相关的章节。