把 OpenClaw Gateway 落在加拿大机房的 M4 远程 Mac 上时,「客户端怎么连」往往比「模型选谁」更先卡人:是 SSH 把本机端口钉到远端的 127.0.0.1:18789,还是让工具直连远端暴露的网关地址?本文按 2026 常见实践,把两种拓扑的适用边界、gateway.remote.token 与默认端口、以及 launchd 下 PATH 丢失的分步修法写在一起,并附一张现象对照表,方便你和团队共用同一份 runbook。
SSH 隧道与直连网关:怎么选
SSH 本地转发适合:只有你或少数人能登录该 Mac;希望 Gateway 只监听回环、不暴露在机房内网或公网;笔记本侧 IDE/CLI 通过 localhost 访问即可。典型写法(把远端回环映射到本机)示意:
ssh -N -L 18789:127.0.0.1:18789 [email protected]
保持隧道期间,你本机访问 http://127.0.0.1:18789 即落在远端网关。断线重连后要确认隧道仍在,否则客户端会报 ECONNREFUSED。
直连网关适合:已另有零信任或 mTLS 前置、或内网固定源 IP 白名单;需要多终端同时连且不想每人一条 SSH。代价是必须把监听面、防火墙与 token 轮换写成流程,而不是「默认只有 loopback」。跨洋访问时的延迟与链路稳定性可结合 2026 远程 Mac 团队预算与性能:加拿大节点、跨太平洋 SSH/VNC 与 M4 扩容并联怎么选 里的 SSH/VNC 与区域策略一起评估。
gateway.remote.token 与 18789 端口
Gateway 默认常在 127.0.0.1:18789 提供 HTTP 控制面;配置里与远端相关的 token 常映射为 gateway.remote.token(具体键名以你当前 OpenClaw 版本文档为准)。原则:token 等同长期口令,勿提交到 Git;轮换后同步所有客户端环境变量或配置文件。若日志出现 401 / invalid token,优先核对请求头、反向代理是否剥 header、以及本机是否残留旧 shell 导出的变量。
端口冲突用 lsof -i :18789 看占用者;改端口时须同时改 launchd plist、应用内配置与所有隧道/客户端目标端口,避免「一半旧一半新」。
PATH 与 launchd:分步对齐
launchd 拉起的服务不会继承你在终端里 export PATH=... 的那套交互式配置,这是「doctor 在 SSH 里全绿、守护进程一启动就找不到 node/openclaw」的根因。
步骤 1:在同一用户的登录 shell 里执行 which node、which openclaw,记下绝对路径。
步骤 2:在 LaunchAgent plist 的 EnvironmentVariables 中写入完整 PATH(把 Homebrew、fnm/nvm 的 shim 目录放在前部),或直接把 ProgramArguments 第一项改为 node/openclaw 的绝对路径。
步骤 3:launchctl bootout gui/$UID/… 卸载旧 job 后,再 launchctl bootstrap 加载新 plist,避免旧环境缓存。
步骤 4:用 openclaw doctor 与一次真实请求验证;若仍异常,读 Gateway stdout 是否仍有 command not found。
无人值守与中高配的磁盘、内存规划可参考 2026 加拿大远程 Mac M4 深度进阶:24GB 内存与 1TB 扩容的实战价值,避免网关与重型缓存抢同一 IO。
排障对照:现象 → 检查点
| 现象 / 关键字 | 优先怀疑 | 建议动作 |
|---|---|---|
本机 127.0.0.1:18789 连不上 |
SSH 隧道断开或端口写反 | 重连 -L;确认远端 Gateway 监听 127.0.0.1 而非仅内网 IP |
EADDRINUSE + 18789 |
僵尸进程或重复加载 plist | lsof 清理;bootout 后只保留一条 LaunchAgent |
401 / invalid token |
gateway.remote.token 不一致或未下发 |
重新 onboard;清代理与环境变量中的旧 token |
守护进程日志里 not found |
launchd 环境 PATH 过短 | plist 补全 PATH 或改用绝对路径 |
| 直连能通、隧道不通(或反之) | 监听地址与防火墙策略不一致 | 核对绑定 0.0.0.0 / 127.0.0.1 与安全组 |