Tailscale (Gateway dashboard)
OpenClaw can auto-configure Tailscale Serve (tailnet) or Funnel (public) for the Gateway dashboard and WebSocket port. This keeps the Gateway bound to loopback while Tailscale provides HTTPS, routing, and (for Serve) identity headers.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).
Auth
Setgateway.auth.mode to control the handshake:
token(default whenOPENCLAW_GATEWAY_TOKENis set)-
password(shared secret viaOPENCLAW_GATEWAY_PASSWORDor config)
tailscale.mode = "serve" and
gateway.auth.allowTailscale is
true, valid Serve proxy requests can authenticate via 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. To require explicit credentials, set
gateway.auth.allowTailscale: false or force
gateway.auth.mode: "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
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