Modes
serve: Tailnet-only Serve viatailscale serve. The gateway stays on127.0.0.1.funnel: Public HTTPS viatailscale funnel. OpenClaw requires a shared password.off: Default (no Tailscale automation).
off means OpenClaw is not managing Serve or Funnel; it does not mean the
local Tailscale daemon is stopped or logged out.
Auth
Setgateway.auth.mode to control the handshake:
none(private ingress only)token(default whenOPENCLAW_GATEWAY_TOKENis set)password(shared secret viaOPENCLAW_GATEWAY_PASSWORDor config)trusted-proxy(identity-aware reverse proxy; see Trusted Proxy Auth)
tailscale.mode = "serve" and gateway.auth.allowTailscale is true,
Control UI/WebSocket auth can use Tailscale identity headers
(tailscale-user-login) without supplying a token/password. OpenClaw verifies
the identity by resolving the x-forwarded-for address via the local Tailscale
daemon (tailscale whois) and matching it to the header before accepting it.
OpenClaw only treats a request as Serve when it arrives from loopback with
Tailscale’s x-forwarded-for, x-forwarded-proto, and x-forwarded-host
headers.
For Control UI operator sessions that include browser device identity, this
verified Serve path also skips the device-pairing round trip. It does not bypass
browser device identity: device-less clients are still rejected, and node-role
or non-Control UI WebSocket connections still follow the normal pairing and
auth checks.
HTTP API endpoints (for example /v1/*, /tools/invoke, and /api/channels/*)
do not use Tailscale identity-header auth. They still follow the gateway’s
normal HTTP auth mode: shared-secret auth by default, or an intentionally
configured trusted-proxy / private-ingress none setup.
This tokenless flow assumes the gateway host is trusted. If untrusted local code
may run on the same host, disable gateway.auth.allowTailscale and require
token/password auth instead.
To require explicit shared-secret credentials, set gateway.auth.allowTailscale: false
and use gateway.auth.mode: "token" or "password".
Config examples
Tailnet-only (Serve)
https://<magicdns>/ (or your configured gateway.controlUi.basePath)
Tailnet-only (bind to Tailnet IP)
Use this when you want the Gateway to listen directly on the Tailnet IP (no Serve/Funnel).- Control UI:
http://<tailscale-ip>:18789/ - WebSocket:
ws://<tailscale-ip>:18789
Loopback (
http://127.0.0.1:18789) will not work in this mode.Public internet (Funnel + shared password)
OPENCLAW_GATEWAY_PASSWORD over committing a password to disk.
CLI examples
Notes
- Tailscale Serve/Funnel requires the
tailscaleCLI to be installed and logged in. tailscale.mode: "funnel"refuses to start unless auth mode ispasswordto avoid public exposure.- Set
gateway.tailscale.resetOnExitif you want OpenClaw to undotailscale serveortailscale funnelconfiguration on shutdown. gateway.bind: "tailnet"is a direct Tailnet bind (no HTTPS, no Serve/Funnel).gateway.bind: "auto"prefers loopback; usetailnetif you want Tailnet-only.- Serve/Funnel only expose the Gateway control UI + WS. Nodes connect over the same Gateway WS endpoint, so Serve can work for node access.
Browser control (remote Gateway + local browser)
If you run the Gateway on one machine but want to drive a browser on another machine, run a node host on the browser machine and keep both on the same tailnet. The Gateway will proxy browser actions to the node; no separate control server or Serve URL needed. Avoid Funnel for browser control; treat node pairing like operator access.Tailscale prerequisites + limits
- Serve requires HTTPS enabled for your tailnet; the CLI prompts if it is missing.
- Serve injects Tailscale identity headers; Funnel does not.
- Funnel requires Tailscale v1.38.3+, MagicDNS, HTTPS enabled, and a funnel node attribute.
- Funnel only supports ports
443,8443, and10000over TLS. - Funnel on macOS requires the open-source Tailscale app variant.
Learn more
- Tailscale Serve overview: https://tailscale.com/kb/1312/serve
tailscale servecommand: https://tailscale.com/kb/1242/tailscale-serve- Tailscale Funnel overview: https://tailscale.com/kb/1223/tailscale-funnel
tailscale funnelcommand: https://tailscale.com/kb/1311/tailscale-funnel