Appearance
Tailscale(Gateway 控制台)
OpenClaw 可以自动配置 Tailscale Serve(内网)或 Funnel(公网)来托管 Gateway 控制台和 WebSocket 端口。这样 Gateway 本身可以继续绑定到本地回环地址,由 Tailscale 负责提供 HTTPS、路由,以及(Serve 模式下)身份验证 Header。
模式
serve:通过tailscale serve提供仅限内网的 Serve 访问,Gateway 保持绑定到127.0.0.1。funnel:通过tailscale funnel提供公网 HTTPS 访问,OpenClaw 需要配置共享密码。off:默认值,不启用 Tailscale 自动化。
认证
通过 gateway.auth.mode 控制握手方式:
token(设置了OPENCLAW_GATEWAY_TOKEN时的默认值)password(通过OPENCLAW_GATEWAY_PASSWORD或配置文件设置共享密钥)
当 tailscale.mode = "serve" 且 gateway.auth.allowTailscale 为 true 时,Control UI/WebSocket 认证可以使用 Tailscale 身份 Header(tailscale-user-login),无需提供 token 或密码。OpenClaw 会通过本地 Tailscale 守护进程(tailscale whois)解析 x-forwarded-for 地址,并与 Header 匹配后才接受请求。只有来自本地回环、且同时带有 Tailscale 的 x-forwarded-for、x-forwarded-proto、x-forwarded-host Header 的请求,才会被识别为 Serve 请求。
HTTP API 端点(如 /v1/*、/tools/invoke、/api/channels/*)仍然需要 token/password 认证。
这种无 token 流程前提是 Gateway 主机是可信的。如果同一主机上可能有不受信任的本地代码运行,请禁用 gateway.auth.allowTailscale 并改用 token/password 认证。
如需强制明确凭据,设置 gateway.auth.allowTailscale: false 或 gateway.auth.mode: "password"。
配置示例
仅限内网(Serve)
json5
{
gateway: {
bind: "loopback",
tailscale: { mode: "serve" },
},
}访问地址:https://<magicdns>/(或你配置的 gateway.controlUi.basePath)
直接绑定到内网 IP(无 Serve/Funnel)
当你想让 Gateway 直接监听 Tailnet IP 时使用,不经过 Serve/Funnel 代理。
json5
{
gateway: {
bind: "tailnet",
auth: { mode: "token", token: "your-token" },
},
}从另一台 Tailnet 设备连接:
- Control UI:
http://<tailscale-ip>:18789/ - WebSocket:
ws://<tailscale-ip>:18789
注意:此模式下回环地址(http://127.0.0.1:18789)不可用。
公网访问(Funnel + 共享密码)
json5
{
gateway: {
bind: "loopback",
tailscale: { mode: "funnel" },
auth: { mode: "password", password: "replace-me" },
},
}建议使用 OPENCLAW_GATEWAY_PASSWORD 环境变量,而不是把密码写进文件。
CLI 示例
bash
openclaw gateway --tailscale serve
openclaw gateway --tailscale funnel --auth password注意事项
- Tailscale Serve/Funnel 需要已安装并登录的
tailscaleCLI。 tailscale.mode: "funnel"如果认证模式不是password则拒绝启动,以防止公网暴露。- 设置
gateway.tailscale.resetOnExit可让 OpenClaw 在关闭时撤销tailscale serve或tailscale funnel配置。 gateway.bind: "tailnet"是直接绑定 Tailnet IP(无 HTTPS,无 Serve/Funnel)。gateway.bind: "auto"默认优先本地回环;如需 Tailnet 访问则使用tailnet。- Serve/Funnel 仅暴露 Gateway 控制台 + WebSocket。节点通过同一 Gateway WS 端点连接,因此 Serve 也可用于节点访问。
浏览器控制(远端 Gateway + 本地浏览器)
如果你在一台机器上运行 Gateway,而想驱动另一台机器上的浏览器,可以在浏览器所在机器上运行一个节点主机,并让两台机器都加入同一个内网。Gateway 会通过节点代理浏览器操作,无需单独的控制服务器或 Serve URL。
浏览器控制避免使用 Funnel;把节点配对当作运维人员访问来对待。
Tailscale 前提条件与限制
- Serve 需要为你的内网启用 HTTPS;CLI 会在缺少时提示。
- Serve 会注入 Tailscale 身份 Header;Funnel 不会。
- Funnel 需要 Tailscale v1.38.3+、MagicDNS、启用 HTTPS,以及一个 funnel 节点属性。
- Funnel 仅支持 TLS 端口
443、8443和10000。 - macOS 上的 Funnel 需要使用开源版 Tailscale 应用。
延伸阅读
- Tailscale Serve 概览:https://tailscale.com/kb/1312/serve
tailscale serve命令:https://tailscale.com/kb/1242/tailscale-serve- Tailscale Funnel 概览:https://tailscale.com/kb/1223/tailscale-funnel
tailscale funnel命令:https://tailscale.com/kb/1311/tailscale-funnel