2026 OpenClaw × Tailscale 尾网:`gateway.bind`、ACL 与不暴露公网的 CLI/通道验证 Runbook

约 16 分钟阅读 · MACCOME

谁会遇到问题:已能跑起 OpenClaw Gateway,但不想让 18789 挂在公网,又希望笔记本、CI 与常驻机都在同一可信小网里用 CLI/通道完成握手。本文结论:gateway.bind收敛到 tailnet 语义,并用 Tailscale ACL 明确谁可对谁开放 18789;验证顺序遵循 openclaw gateway status → 尾网 ping → 最小对话。结构与分工:与《Nginx/Caddy 反代与 TLS》《Cloudflare Tunnel + systemd》形成三角——分别覆盖公网 TLS 入口、出站隧道、以及纯尾网零公网暴露;Compose 内细节仍回《Docker Compose 配对》《远程 Mac 零信任接入》。

只开尾网却仍踩坑的五类原因(不是「关了公网就万事大吉」)

  1. ACL 留白过大*:* 或宽泛 tag 让每台节点都能扫描 18789,等于只是把攻击面搬进尾网——尾网同样需要最小权限。
  2. 绑定模式与期望值不一致:Upstream 网关绑定枚举包含 tailnet 等模式;若在文档外混用loopback/lan/tailnet而不更新 CLI 侧的 GATEWAY_URL,会出现tailscale ping 成功但握手仍走旧地址
  3. MagicDNS/Split DNS 混用 corporate VPN:双隧道并存时同名解析可指向非公网侧的「黑洞」——症状像随机超时。
  4. MTU 与 WebSocket:DSR、额外封装或链路 MTU 不足时大包拆片失败会先表现为偶发 TLS 卡住,不要急于改 token。
  5. Subnet Router 误判:把整块 RFC1918 advertise 进来却未设 exit node 策略时,容易让非预期路径绕开你想要的 Gateway 拓扑。

白板检查:尾网拓扑不是「省了防火墙」,而是把防火墙搬进 ACL hujson;《安全加固/CVE 响应》里的端口集合与密钥轮换纪律仍然适用——只是收口对象从 iptables/Nginx 换成了 tailnet。

暴露模型 适用前提 主要权衡
公网 + 反向代理与 TLS 需要外部 SaaS webhook、移动办公跨网且无统一 agent。 WAF/Cert/Let’s Encrypt/限流复杂度上升;参阅《反代清单》。
Cloudflare Tunnel 等出站隧道 要隐藏源站 IP、又不想开入站端口映射。 依赖第三方 POP 与控制面;《Tunnel Runbook》。
tailnet-only + gateway.bind=tailnet 团队已全员 tailnet enrolled;Gateway 运行在六国独占 Mac或可装 tailscale 的 Linux。 ACL/tag 要写清;无 tailnet Client 的机器天然不可达不安全。
warning

别把 tailnet 当「隐性 VPN 任意门」:一旦把网关设备 tag 设为过于通用的 group:dev 又允许全盘互 ping,复盘时你无法回答「那晚到底是谁连上过 18789」——每条 ACL 都应能对应到工单号

推荐拓扑 sketch:网关节点、操作员与可选 subnet

最小闭环:**G**ateway 常驻节点(常为远程独占 Mac)、**O**perator 笔记本、必要时 **SR**subnet router。G 上 tailscale up 后仅向白名单 tags 通告 TCP 18789O 侧 CLI 配置的 OPENCLAW_GATEWAY_URL 应写成 MagicDNS 名或 tailnet IPv4/v6,禁止使用已废弃的局域网入口如果你已声明「仅 tailnet」。

若 CI Runner 也需直连 Gateway,可把 Runner enrollment 在同一个 tailnet tag(例如tag:ci),并在 ACL 只允许 tag:ci -> tag:gateway单列端口;不要把 Runner 扔进「全能 dev」分组。

与六国远程基础设施组合时,《零信任 Tailscale/SSH 接入》提供 SSH/Tunnel 侧的决策矩阵;本条只在OpenClaw 网关端口语义上向前推进一步。

落地六步:从 tailscale up 到「尾网内有意义的首包」

  1. 冻结节点身份tailscale status记下 Hostname/IP;工单里只允许这些名字出现在 Runbook——避免口述「就是那台大阪机」。
  2. 写 ACL 先于改 OpenClaw:在 hujson(或等价)里显式放行 UDP 41641(NAT 穿透)需求内的 TCP(含 18789);默认拒绝兜底必须存在。
  3. 收敛 gateway 绑定:在配置文件(常见于 ~/.openclaw/openclaw.json,容器则挂载同源卷)中将 gateway.bind 设为 tailnet 并复核 gateway.mode 是否与官方文档对齐;调整后只允许尾网前缀访问监听面。字段层级若随版本微调,请以当前发行日志为准。
  4. TOKEN 仍为单一真源OPENCLAW_GATEWAY_TOKEN 与文件内gateway.auth.token择一并记录指纹;可参考《Compose 配对》中的双源对照表。
  5. 跑 OpenClaw 自检链openclaw gateway statusopenclaw doctor;失败时截取尾网与控制面两侧同时间日志。
  6. 端到端冒烟:自 Operator 主机对 MagicDNS名执行curl -v --max-time 5 https://...或文档推荐的 WS 握手路径,再用最小对话脚本验证上下文未截断;《doctor 第一站》可辅助分诊。
json
{
  "gateway": {
    "mode": "local",
    "bind": "tailnet",
    "port": 18789,
    "auth": {
      "mode": "token",
      "token": "${OPENCLAW_GATEWAY_TOKEN}"
    }
  }
}
// ⚠️ 以上为示意:请用你的发行版的 schema 逐项校验;调整后务必重启网关进程或容器。
HuJSON
// ACL 示意:只允许 operator 访问 gateway 上的 Control/Gateway 端口 —— 请将 tag 改成你方命名规范
{
  "groups": { "group:ops": ["[email protected]"] },
  "tagOwners": { "tag:gateway": ["autogroup:admin"], "tag:ops": ["autogroup:admin"] },
  "acls": [
    {
      "action": "accept",
      "src": ["tag:ops"],
      "dst": ["tag:gateway:18789"],
      "proto": "tcp"
    }
  ]
}

三条应写入变更评审与审计附件的技术事实

  • 尾网并不等于零信任默认值:若设备被盗且仍持有 Tailscale identity,未及时 revoke与宽松 ACL 等价的长期暴露。
  • WebSocket 对 MTU/中间盒极敏感:链路出现「偶发几秒卡死」,优先跑 ICMP 大号 ping + tailscale ping 组合实验,再上抓包——避免直接扩大 bind。
  • DNS 竞态会先污染 OpenClaw 通道:若 webhook/模型 endpoint 在同机解析失败,可先表现为 gateway healthy 但通道无响应——把MagicDNS 分流策略写进工单附录。

为什么「长期把 Gateway 挂在自己笔记本 tailnet exit」往往不是生产方案

睡眠、合盖、补丁重启与家用上行抖动会破坏可预测的 18789 SLA;同时个人隐私盘与网关日志混载增加取证难度。相对之下,独占、可巡检的六国 Apple Silicon远端 Mac更适合作为OpenClaw 常驻神经中枢

Nginx 公钥暴露、Tunnel 出站、尾网收口三条路线可以同时存在不同环境档位,但每一条都必须有 RACI:MACCOME提供与远程 Mac/弹性租期匹配的硬件与出口稳定度,可把 tailnet ACL 条目写进和业务节点一致的工单——先对齐公开租赁价格帮助中心,再回到绑定与冒烟。

收束:先画尾网信息流,再动 JSON

若不能在白板上三分钟画清「谁对谁放通 18789」,就不值得直接改配置文件——否则下一任值班只能依赖 Magic。「tailnet-only」的目标是可复述的链路,不是口号。

下一跳:按需回到《Compose 配对》《反代 TLS》《Tunnel》《安全加固》;当你需要把 SLA 与地面节点绑定时再评估六国独占算力与经济租期。

常见问题

必须放弃 Docker 吗?

不必。容器只是把监听搬进了 netns,《Compose 配对篇》仍可复用——只要宿主 tailnet IP/DNS 与容器 publish 逻辑一致。

尾网就绪后仍能混用 SSH 跳板吗?

可以;《零信任远程 Mac 接入》给 SSH/Tunnel/直连决策;OpenClaw 层请保持TCP18789 ACL 独立条目不要与 22/tcp 混在一起写糊涂账。