远程访问(SSH、隧道和 tailnet)

OpenClaw 支持”远程 SSH 访问”:在一台专用主机(桌面/服务器)上保持单一网关(主节点)运行,其他客户端远程连接。

  • 操作员(你自己 / macOS 应用):SSH 隧道是通用的兜底方案。
  • 节点(iOS/Android 及未来设备):通过局域网/tailnet 或 SSH 隧道连接网关 WebSocket

核心思路

  • 网关 WebSocket 绑定在配置端口的回环地址上(默认 18789)。
  • 远程使用时,通过 SSH 转发该回环端口(或使用 tailnet/VPN 减少隧道需求)。

常见的 VPN/tailnet 部署方案(agent 运行的位置)

网关主机理解为”agent 住的地方”。它管理会话、认证 profile、通道和状态。你的笔记本/桌面(和节点)连接到这台主机。

1)tailnet 中的常驻网关(VPS 或家用服务器)

在持久化主机上运行网关,通过 Tailscale 或 SSH 访问。

  • 最佳体验: 保持 gateway.bind: "loopback",用 Tailscale Serve 暴露控制 UI。
  • 备选方案: 保持回环 + 从其他机器 SSH 隧道。
  • 示例: exe.dev(轻量虚拟机)或 Hetzner(生产 VPS)。

笔记本经常休眠、但你想让 agent 持续在线时,这是理想方案。

2)家用桌面运行网关,笔记本当遥控器

笔记本不运行 agent,只远程连接:

  • 使用 macOS 应用的远程 SSH 模式(设置 → 通用 → “OpenClaw 运行位置”)。
  • 应用自动建立和管理隧道,WebChat + 健康检查直接可用。

操作指南:macOS 远程访问

3)笔记本运行网关,其他机器远程访问

网关留在本地,但安全暴露:

  • 从其他机器 SSH 隧道到笔记本,或
  • Tailscale Serve 暴露控制 UI,网关保持回环。

指南:TailscaleWeb 概览

命令流转(什么在哪里运行)

一个网关服务管理状态和通道,节点是外设。

流程示例(Telegram → 节点):

  • Telegram 消息到达网关
  • 网关运行 agent,判断是否需要调用节点工具。
  • 网关通过 WebSocket(node.* RPC)调用节点
  • 节点返回结果,网关回复到 Telegram。

说明:

  • 节点不运行网关服务。 除非你刻意运行隔离的 profile,否则每台主机只需一个网关(参见 多网关部署)。
  • macOS 应用的”节点模式”只是通过网关 WebSocket 连接的节点客户端。

SSH 隧道(CLI + 工具)

创建到远程网关 WS 的本地隧道:

ssh -N -L 18789:127.0.0.1:18789 user@host

隧道建立后:

  • openclaw healthopenclaw status --deep 通过 ws://127.0.0.1:18789 访问远程网关。
  • openclaw gateway {status,health,send,agent,call} 也可以在需要时通过 --url 指定转发后的地址。

注意:将 18789 替换为你配置的 gateway.port(或 --port/OPENCLAW_GATEWAY_PORT)。 注意:使用 --url 时,CLI 不会回退到配置或环境变量中的凭证。需要显式传入 --token--password,否则会报错。

CLI 远程默认值

可以持久化远程目标,让 CLI 命令默认使用:

{
  gateway: {
    mode: "remote",
    remote: {
      url: "ws://127.0.0.1:18789",
      token: "your-token",
    },
  },
}

如果网关只监听回环地址,URL 保持 ws://127.0.0.1:18789,先开 SSH 隧道再用。

凭证优先级

网关凭证解析遵循统一规则,适用于 call/probe/status 路径和 Discord exec-approval 监控。节点主机使用相同的基础规则,但有一个本地模式例外(它故意忽略 gateway.remote.*):

  • 显式凭证(--token--password 或工具的 gatewayToken)在接受显式认证的调用路径上始终优先。
  • URL 覆盖安全性:
    • CLI URL 覆盖(--url)不复用隐式配置/环境变量凭证。
    • 环境变量 URL 覆盖(OPENCLAW_GATEWAY_URL)只使用环境变量凭证(OPENCLAW_GATEWAY_TOKEN / OPENCLAW_GATEWAY_PASSWORD)。
  • 本地模式默认值:
    • token:OPENCLAW_GATEWAY_TOKEN -> gateway.auth.token -> gateway.remote.token(远程回退仅在本地 auth token 未设置时生效)
    • password:OPENCLAW_GATEWAY_PASSWORD -> gateway.auth.password -> gateway.remote.password(远程回退仅在本地 auth password 未设置时生效)
  • 远程模式默认值:
    • token:gateway.remote.token -> OPENCLAW_GATEWAY_TOKEN -> gateway.auth.token
    • password:OPENCLAW_GATEWAY_PASSWORD -> gateway.remote.password -> gateway.auth.password
  • 节点主机本地模式例外:gateway.remote.token / gateway.remote.password 被忽略。
  • 远程 probe/status 的 token 检查默认是严格的:针对远程模式时只使用 gateway.remote.token(不回退到本地 token)。
  • 旧版 CLAWDBOT_GATEWAY_* 环境变量仅在兼容调用路径中使用;probe/status/auth 解析只用 OPENCLAW_GATEWAY_*

通过 SSH 使用聊天 UI

WebChat 不再使用独立的 HTTP 端口。SwiftUI 聊天 UI 直接连接网关 WebSocket。

  • 通过 SSH 转发 18789(见上文),然后客户端连接 ws://127.0.0.1:18789
  • macOS 上推荐使用应用的”远程 SSH 模式”,自动管理隧道。

macOS 应用”远程 SSH 模式”

macOS 菜单栏应用可以端到端管理远程访问(远程状态检查、WebChat 和语音唤醒转发)。

操作指南:macOS 远程访问

安全准则(远程/VPN)

一句话:除非确实需要,否则保持网关只监听回环地址

  • 回环 + SSH/Tailscale Serve 是最安全的默认方案(不暴露公网)。
  • 明文 ws:// 默认仅限回环。受信私有网络场景下,可在客户端进程上设置 OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 作为紧急开关。
  • 非回环绑定lan/tailnet/custom,或 auto 且回环不可用时)必须使用 auth token/密码。
  • gateway.remote.token / .password 是客户端凭证来源,它们不会单独保护服务端本地 WS 访问。
  • 本地调用路径仅在 gateway.auth.* 未设置时才可能回退到 gateway.remote.*
  • 如果 gateway.auth.token / gateway.auth.password 通过 SecretRef 配置但解析失败,系统会直接报错(不会用远程凭证掩盖)。
  • 使用 wss:// 时,可通过 gateway.remote.tlsFingerprint 固定远程 TLS 证书。
  • Tailscale Serve 可以在 gateway.auth.allowTailscale: true 时通过身份 header 认证控制 UI/WebSocket 流量;HTTP API 端点仍需 token/密码认证。这种免 token 流程假设网关主机是受信的。如需全面使用 token/密码,设为 false
  • 浏览器控制应等同于操作员访问:仅 tailnet + 明确的节点配对。

深入了解:安全