跳转至

为您的 Gateway 提供稳定的 HTTPS URL

Tailscale Serve 为您的 Gateway 提供一个 HTTPS URL,而无需在局域网或公共互联网上暴露 Gateway 端口。Gateway 继续在回环地址上监听,Tailscale 则使用有效证书终止 HTTPS 并将请求代理到该地址。

结果是 https://<host>.<tailnet>.ts.net,可从 tailnet 中获准的设备访问,而无法从公共互联网访问。对应的 WebSocket URL 是 wss://<host>.<tailnet>.ts.net。

如果您需要公共 URL,请改用 Tailscale Funnel。Funnel 是公开的,OpenClaw 要求其使用密码认证。

开始之前

您需要:

  • 为您的 tailnet 启用 MagicDNS。
  • 在 Tailscale 管理控制台的 DNS > HTTPS 证书 下启用 HTTPS 证书。
  • 在 Gateway 主机上安装并登录 Tailscale。
  • Gateway 已配置 token、密码或 trusted-proxy 认证。Serve 不能与 gateway.auth.mode: "none" 组合使用。

OpenClaw 会自动定位 Tailscale CLI。它会检查 PATH 中的 tailscale、位于 /Applications/Tailscale.app/Contents/MacOS/Tailscale 的 macOS 应用包、/Applications 下其他匹配的应用安装,以及系统 locate 数据库。您无需将 macOS 应用包二进制文件添加到 PATH。

1. 启用 Serve 并保持回环绑定

在 Gateway 主机上运行以下命令:

openclaw config set gateway.bind loopback
openclaw config set gateway.tailscale.mode serve
openclaw gateway restart

等效配置如下:

{
  gateway: {
    bind: "loopback",
    tailscale: {
      mode: "serve",
    },
  },
}

OpenClaw 会配置 Tailscale 在端口 443 上提供 HTTPS 服务,并将请求代理到 Gateway 拥有的私有临时回环监听器。默认情况下,普通 Gateway 监听器仍位于 127.0.0.1:18789,供本地客户端直接访问。

可选身份标头认证

要明确允许 Tailscale 身份标头用于 Control UI WebSocket 认证:

openclaw config set gateway.auth.allowTailscale true

对于使用 token 认证的 Serve,除非您将其设置为 false,否则 OpenClaw 默认启用此行为。密码和 trusted-proxy 模式保持其明确的认证边界,除非您选择启用。

此设置允许经过验证的 Tailscale 身份满足 Control UI WebSocket 的共享密钥检查。OpenClaw 使用 tailscale whois 验证转发的客户端地址,并将其与 tailscale-user-login 标头匹配。仅当请求通过 Serve 到达 OpenClaw 专门的受管 Tailscale 监听器并带有预期的转发标头时,此设置才生效。

它不会对 HTTP API 端点进行认证、移除浏览器设备身份要求、对节点角色连接进行认证,也不会绕过节点配对。完整约定请参阅 Tailscale 身份标头。

2. 在您的 tailnet 策略中允许 HTTPS

Tailscale 访问控制适用于 Serve。如果您的 tailnet 采用限制性策略,请允许客户端设备通过 TCP 端口 443 访问 Gateway 主机。

如果没有此授权,Serve URL 在 Gateway 主机上可以正常工作,但从其他任何设备访问都会静默超时。这种症状看起来像 Gateway 故障,而实际上是 tailnet 策略阻止了连接。

请使用与您的 tailnet 策略文件相匹配的形式。

现代 grants 策略

将以下对象添加到现有的 grants 数组中:

{
  "src": ["autogroup:member"],
  "dst": ["<gateway-host-or-ip>"],
  "ip": ["tcp:443"]
}

例如,将 <gateway-host-or-ip> 替换为策略中定义的主机别名(如 gateway-host),或替换为类似 100.x.y.z 的地址。

旧版 ACL 策略

将以下对象添加到现有的 acls 数组中:

{
  "action": "accept",
  "src": ["autogroup:member"],
  "dst": ["<gateway-host-or-ip>:443"]
}

autogroup:member 允许所有经过身份验证的 tailnet 成员。若要实施更严格的策略,请将其替换为范围更窄的用户、组、标签或设备选择器,使其仅覆盖需要访问 Gateway 的客户端。有关 grants 和 ACLs 的详情,请参阅 Tailscale 文档。

3. 验证路由和回环边界

在 Gateway 主机上,确认 Serve 已激活:

tailscale serve status

输出应显示一条 https://<host>.<tailnet>.ts.net 的 HTTPS 路由,代理到 Gateway 拥有的私有临时回环端口。

从同一 tailnet 上的另一台设备检查 HTTPS 响应:

curl -sS -o /dev/null -w '%{http_code}\n' https://<host>.<tailnet>.ts.net/

Control UI 根路径预期返回 200。如果此请求超时,但同一命令在 Gateway 主机上返回 200,请先检查上一步中的 TCP 443 授权。

最后,验证 Gateway 进程没有向网络开放自己的端口:

lsof -nP -iTCP:<port> -sTCP:LISTEN

对于默认端口,请将 <port> 替换为 18789。Gateway 监听器应位于 127.0.0.1:<port>,而不是 0.0.0.0:<port> 或某个局域网或 tailnet 地址。Tailscale 拥有 HTTPS 监听器和代理路径。

4. 从客户端使用 URL

macOS 应用

在 OpenClaw macOS 应用中:

  1. 打开 设置 > 连接。
  2. 将 OpenClaw 运行位置 设置为 远程(另一台主机)。
  3. 将 传输 设置为 直接(ws/wss)。
  4. 在 Gateway URL 中输入 wss://<host>.<tailnet>.ts.net。
  5. 选择 测试远程。

应用现在通过 Tailscale Serve 直接连接,因此不再需要每个客户端的 SSH 隧道。

iOS 和 Android 配套应用

iOS 和 Android 应用直接连接到 Gateway WebSocket,不管理 SSH 隧道传输。在配对或生成设置代码时,请使用相同的 wss://<host>.<tailnet>.ts.net 端点。这为移动客户端提供了一条可在 tailnet 内任意位置使用的安全路由。

有关配对步骤,请参阅 iOS 应用设置 和 Android 连接设置。

故障排除

其他设备访问 URL 超时

在 Gateway 主机上运行相同的 curl 命令。如果主机返回 200,而其他 tailnet 设备超时,请添加或缩小针对 TCP 443 的 tailnet 策略授权。

证书未签发或首次请求缓慢

确认 MagicDNS 和 HTTPS 证书已在 Tailscale 管理控制台中启用。首次签发证书可能会使第一个 HTTPS 请求耗时更长;请等待其完成,然后重试。

serve 命令不可用

更新 Tailscale,并确认你安装的客户端构建提供了当前的 tailscale serve 命令。Serve CLI 在 Tailscale 1.52 中发生了变化。请参阅 Tailscale Serve 命令参考。

Tailscale 身份标头不被接受

确认 gateway.auth.allowTailscale 为 true,并且请求是通过 Serve URL 到达的。直接回环、LAN、原始 tailnet-IP 以及自定义反向代理请求都不符合 Tailscale 身份标头认证的条件。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw