当 OpenClaw 网关进程只部署在加拿大远程 Mac M4,而你的日常操作机留在亚太或欧洲时,真正卡住人的往往不是「装没装上」,而是三层地址空间叠在一起:127.0.0.1 在网关机上、100.x 在 Tailnet 里、以及你笔记本上的浏览器标签页。Dashboard 与 Gateway 默认监听 18789(务必与文档、防火墙规则三方对齐,常见笔误 18879 会直接白忙活)。本文按先 loopback、再 Tailnet、最后才谈公网暴露的顺序,把 macOS 客户端上的 SSH Remote 与 Tailscale(文中称 Tailnet)组合成可审计工作流,并补上跨洋团队 token 分发与 LaunchAgent 持久化时最容易翻车的 PATH 分裂问题。预算与多席位并联视角可对照 2026 远程 Mac 团队预算与性能:加拿大节点、跨太平洋 SSH/VNC 与 M4 扩容并联怎么选;若你正处于整机搬迁窗口,可并行阅读 2026年 OpenClaw 从本地或旧节点迁移到加拿大远程 Mac M4 怎么做得稳:Gateway 18789 切换、Workspace 打包、LaunchDaemon 重建与跨洋 SSH/VNC 验收回滚(迁移教程+对照表+FAQ)。
场景定位:网关单点加拿大 M4 的三个硬前提
第一,唯一真相源在加东/加西那台机器上:所有通道握手、Dashboard 静态资源与 Gateway API 都以该机时钟与该机文件系统为准;你本地浏览器看到的任何「偶发 502」,要先区分是链路问题还是网关机自身 health 失败。第二,跨洋同事共享的是「操作权」而不是「同一套 shell 历史」:有人习惯纯 SSH,有人必须开 VNC 点系统对话框;工作流要允许两条路径同时成立且互不踩 plist。第三,token 与密钥不要与「个人笔记本重装」耦合:把轮换节奏绑定到网关机与工单系统,而不是绑定到某位工程师的周末重装。
在这三条前提下,「打通」一词应被翻译成可验收清单:curl 在网关机 loopback 上返回 200、Tailnet 成员从各自笔记本命中同一 health、Dashboard 在受控来源(SSH 转发或 tailnet-only 反代)下可加载且 WebSocket 不断连。缺任何一条,都不建议把 Dashboard 暴露到公网 IP。
loopback、18789 与 Dashboard:验收顺序与端口心智模型
OpenClaw Gateway 与内嵌 Dashboard 通常共享同一监听端口 18789。在网关机上,先用 127.0.0.1:18789 做健康检查,可以一次性排除「token 已过期但你还以为是 SSH 慢」这类误判。只有 loopback 稳定后,才在 Tailnet IP 或 MagicDNS 名字上重复同一探针;最后再考虑从公司笔记本经 SSH 本地转发访问。
Dashboard 若依赖 WebSocket,请注意中间层是否支持 Upgrade:某些零信任或企业代理会静默剥掉头信息,表现为「静态 HTML 能开、实时面板永远转圈」。跨洋链路下,优先用 SSH -L 直连网关机上的 loopback 做对照实验:若转发路径正常而 Tailscale 路径异常,问题在 tailnet ACL 或 MTU;若两条都挂,回到网关进程与磁盘日志。
curl -fsS "http://127.0.0.1:18789/health" && echo "OK"
ssh -N -L 18080:127.0.0.1:18789 user@ca-m4-host
浏览器打开 http://127.0.0.1:18080 时,流量路径是:本机浏览器 → SSH 加密隧道 → 远端 sshd → 远端 loopback → Gateway。该路径不经过 Tailscale,非常适合与 tailnet 路径做 A/B。验收通过后再把书签改成 Tailnet 主机名,避免团队里一半人走转发、一半人直连造成 cookie 与 CSRF 域混乱。
macOS 客户端:SSH Remote 与 Tailnet 的分工表
SSH 擅长「带 tty 的排障」与「一次性转发」;Tailscale 擅长「长期在线、多设备互访、ACL 以身份为中心」。网关只跑在加拿大 M4 时,推荐默认策略:日常维护与脚本化探针走 SSH;Dashboard 给非运维同事走 tailnet-only 主机名;紧急救火允许双开。不要把 SSH 公网暴露与 tailnet 混在同一组口令文化里——SSH 用密钥 + AllowUsers,Tailscale 用 ACL 分段。
| 路径 | 典型用途 | 优点 | 注意点 |
|---|---|---|---|
网关机 127.0.0.1:18789 |
健康检查、冷启动验证 | 零依赖、最快定位本机故障 | 不代表跨机可达 |
SSH -L 转发 |
临时打开 Dashboard、抓包对照 | 与企业笔记本策略兼容好 | 断线即失效;需控制本地端口冲突 |
Tailnet 主机名 / 100.x |
团队日常面板、跨洋共读 | 免反复敲端口;ACL 可审计 | 要检查 MagicDNS 与分尾出口;MTU 问题偶发 |
| 公网 IP / 云反代 | 外部 webhook(若必须) | 第三方易集成 | 必须叠 HTTPS、WAF、速率限制与 mTLS/token |
跨洋团队 token:环境面、轮换与「最小可读」
跨洋团队最容易在凌晨三点犯的错误,是把同一枚长期 token 贴在三个大洲的 slack 线程里。更稳妥的做法是按面拆分:Gateway 管理面(仅运维可写)、通道/上游回调面(可自动化轮换)、Tailscale API 或 OAuth 刷新面(与设备绑定)。每一面在 vault 或 KMS 里单独条目,工单里写清「本次变更触碰哪一面」,避免一次轮换把 Dashboard 与 channels 同时打断。
落地时,把 token 引用统一进网关机上的单一 env 文件或 launchd EnvironmentVariables,由 LaunchAgent 注入进程;亚太同事通过 SSH 编辑该文件并 kickstart,而不是各自 export。轮换后强制跑一轮 loopback health 与一条真实通道样本请求,把输出粘到工单闭环。
| 凭证类型 | 建议驻留位置 | 轮换触发 | 跨洋协作提示 |
|---|---|---|---|
| Gateway / Dashboard 会话或静态 token | 仅网关机;不入笔记本 dotfiles | 人员离职、疑似泄露 | 轮换窗口选双方重叠办公时段 |
| 上游 channel / webhook secret | 与配置同卷分区;权限 600 | 上游控制台支持滚动密钥时 | 新旧双密钥并行 ≥1 个心跳周期 |
| Tailscale auth key / API token | 设备首次登录后尽量走 OAuth | 标签策略变更、机器重装 | 预生成 reusable key 仅用于无人值守装机 |
| SSH host key 与 known_hosts | 各工程师本机 | 网关机重装或 IP 变更 | 用证书或更新公告避免 MITM 恐慌 |
0.0.0.0 并直接对公网开放。默认优先 tailnet-only 或 SSH 转发;公网暴露应视为独立变更单,含速率限制与审计日志留存周期。
LaunchAgent 持久化:UserName、WorkingDirectory 与 PATH 分裂
与 LaunchDaemon 相比,LaunchAgent 跑在用户 GUI 会话域,更适合「随登录用户拉起、可访问钥匙串与部分沙箱外资源」的网关场景;但若你的 OpenClaw 实际以 headless node 运行且无需桌面会话,也可改用系统级 LaunchDaemon——选型不在本文拍板,关键是plist 里显式写出 WorkingDirectory、日志路径与 PATH。launchd 子环境不会自动继承你在 .zshrc 里「顺手写过」的 nvm 或自定义 PATH,于是出现「SSH 手动启动正常、重启后失联」的经典症状。
推荐把 Node/OpenClaw 二进制路径写成绝对路径,或在 plist 的 EnvironmentVariables 中写入精简 PATH。日志务必 StandardOutPath / StandardErrorPath 落到独立目录,避免写爆用户桌面。加载顺序建议:先 bootout 再 bootstrap,最后用 kickstart -k;并在业务低峰安排一次整机重启冷验收,确认无人登录时仍能拉起(若不能,说明依赖了交互式钥匙串授权,需要提前用 security 或改走守护进程账户)。
launchctl bootout gui/$(id -u)/com.example.openclaw.gateway 2>/dev/null || true launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.openclaw.gateway.plist launchctl kickstart -k gui/$(id -u)/com.example.openclaw.gateway
诊断对照:把「慢」拆成 SSH、Tailnet 与 loopback 三层
跨洋团队报「Dashboard 卡」时,先问三个问题:网关机上 loopback 是否仍毫秒级返回?同机经 Tailscale IP 访问是否明显慢于 loopback?从亚太笔记本经 tailnet 访问是否比 SSH 转发更慢?若仅第三层慢,优先查国际出口、DNS 选择与 TCP 重传;若第二层就慢,查 tailnet 路径与设备分尾;若第一层慢,基本与网络无关,应看 CPU、GC、磁盘与日志锁竞争。
建议在仓库里维护三条一行命令探针(loopback / tailnet / ssh),由 on-call 手机也能复制执行;输出格式统一为时间戳 + HTTP 状态 + TTFB,减少截图往返。把「对照实验」写进值班手册后,亚太与北美交接班时不需要语音复述上下文,只看工单附件即可复现。
FAQ
Dashboard 与 API 一定都在 18789 吗?
OpenClaw 约定默认 18789;若你做过反代拆分,请以实际监听为准,但团队文档里要保留「默认端口」脚注,避免防火墙白名单与 curl 各写各的。
为什么先验 loopback 再验 Tailnet?
loopback 失败说明问题在进程或本机资源;此时去调 tailnet ACL 属于南辕北辙。顺序错了会浪费整晚跨洋会议。
SSH 转发和 Tailscale 会冲突吗?
不会天然冲突;冲突来自「同一本地端口被占用」或「浏览器缓存了错误的 Host 头」。给两种访问方式各用固定书签即可。
LaunchAgent 和 LaunchDaemon 怎么选?
需要用户登录上下文、钥匙串 GUI 授权时用 LaunchAgent;需要开机即起、与登录无关时用 LaunchDaemon。无论哪种,都要做冷启动验收而不是只看当前 SSH 会话。
跨洋轮换 token 的最佳时段?
选亚太与北美至少有 2 小时重叠的办公窗口;轮换后留 15 分钟只读观察期,禁止叠加大版本升级。
Tailnet 能访问但 SSH 不能,可能是什么?
常见是 sshd 未监听 tailnet 接口、AllowUsers 限制、或企业笔记本出站策略拦 22 端口。用 ssh -v 与 tailnet ping 分开验证。
要不要给 Dashboard 单独域名?
若走 HTTPS 终止在反代上,独立子域便于 cookie scope 与证书管理;纯 tailnet 内网名也可,但要统一团队书签避免混用 IP 与主机名。
网关机休眠会导致什么问题?
Mac 睡眠会打断长连接与部分 tailnet 路径;生产网关应关闭睡眠或使用 caffeinate 策略并由电源管理审计。云端 Mac 通常以「常电」形态交付,更适合 7×24。