Saltar al contenido principal
OpenClaw puede configurar automáticamente Tailscale Serve (tailnet) o Funnel (público) para el panel del Gateway y el puerto WebSocket. Esto mantiene el gateway enlazado a loopback mientras Tailscale proporciona HTTPS, enrutamiento y, en el caso de Serve, encabezados de identidad.

Modos

gateway.tailscale.mode:
ModoComportamiento
serveServe solo para tailnet mediante tailscale serve. El gateway permanece en 127.0.0.1.
funnelHTTPS público mediante tailscale funnel. Requiere una contraseña compartida.
off (predeterminado)Sin automatización de Tailscale.
La salida de estado y auditoría usa exposición de Tailscale para este modo Serve/Funnel de OpenClaw. off significa que OpenClaw no está gestionando Serve ni Funnel; no significa que el demonio local de Tailscale esté detenido o haya cerrado sesión.

Ejemplos de configuración

Solo tailnet (Serve)

{
  gateway: {
    bind: "loopback",
    tailscale: { mode: "serve" },
  },
}
Abrir: https://<magicdns>/ (o tu gateway.controlUi.basePath configurado) Para exponer la interfaz de control a través de un Service de Tailscale con nombre en lugar del nombre de host del dispositivo, establece gateway.tailscale.serviceName en el nombre del Service:
{
  gateway: {
    bind: "loopback",
    tailscale: { mode: "serve", serviceName: "svc:openclaw" },
  },
}
El inicio informa entonces la URL del Service como https://openclaw.<tailnet-name>.ts.net/ en lugar del nombre de host del dispositivo. Los Services de Tailscale requieren que el host sea un nodo etiquetado aprobado en tu tailnet: configura la etiqueta y aprueba el Service en Tailscale antes de habilitar esto; de lo contrario, tailscale serve --service=... falla durante el inicio del gateway.

Solo tailnet (enlazar a la IP de Tailnet)

Usa esto para que el gateway escuche directamente en la IP de Tailnet, sin Serve/Funnel:
{
  gateway: {
    bind: "tailnet",
    auth: { mode: "token", token: "your-token" },
  },
}
Conéctate desde otro dispositivo Tailnet:
  • Interfaz de control: http://<tailscale-ip>:18789/
  • WebSocket: ws://<tailscale-ip>:18789
Loopback (http://127.0.0.1:18789) no funcionará en este modo.

Internet pública (Funnel + contraseña compartida)

{
  gateway: {
    bind: "loopback",
    tailscale: { mode: "funnel" },
    auth: { mode: "password", password: "replace-me" },
  },
}
Prefiere OPENCLAW_GATEWAY_PASSWORD antes que confirmar una contraseña en disco.

Ejemplos de CLI

openclaw gateway --tailscale serve
openclaw gateway --tailscale funnel --auth password

Autenticación

gateway.auth.mode controla el handshake:
ModoCaso de uso
noneSolo ingreso privado
token (predeterminado cuando OPENCLAW_GATEWAY_TOKEN está definido)Token compartido
passwordSecreto compartido mediante OPENCLAW_GATEWAY_PASSWORD o configuración
trusted-proxyProxy inverso con identidad; consulta Autenticación de proxy de confianza

Encabezados de identidad de Tailscale (solo Serve)

Cuando tailscale.mode: "serve" y gateway.auth.allowTailscale es true, la autenticación de la interfaz de control/WebSocket puede usar encabezados de identidad de Tailscale (tailscale-user-login) en lugar de un token/contraseña. OpenClaw verifica el encabezado resolviendo la dirección x-forwarded-for de la solicitud mediante el demonio local de Tailscale (tailscale whois) y comparándola con el login del encabezado antes de aceptarla. Una solicitud solo califica para esta ruta cuando llega desde loopback con los encabezados x-forwarded-for, x-forwarded-proto y x-forwarded-host de Tailscale. Este flujo sin token asume que el host del gateway es de confianza. Si puede ejecutarse código local no confiable en el mismo host, establece gateway.auth.allowTailscale: false y exige autenticación con token/contraseña en su lugar. Alcance de la omisión:
  • Se aplica solo a la superficie de autenticación WebSocket de la interfaz de control. Los endpoints de API HTTP (/v1/*, /tools/invoke, /api/channels/*, etc.) nunca usan autenticación por encabezado de identidad de Tailscale; siempre siguen el modo normal de autenticación HTTP del gateway.
  • Para sesiones de operador de la interfaz de control que ya llevan identidad de dispositivo del navegador, una identidad de Tailscale verificada omite el viaje de ida y vuelta de emparejamiento con token de arranque/QR.
  • No omite la identidad del dispositivo en sí: los clientes sin dispositivo siguen siendo rechazados, y las conexiones con rol de nodo siguen pasando por el emparejamiento y las comprobaciones de autenticación normales.

Notas

  • Tailscale Serve/Funnel requiere que la CLI tailscale esté instalada y con sesión iniciada.
  • tailscale.mode: "funnel" se niega a iniciar a menos que el modo de autenticación sea password, para evitar la exposición pública.
  • gateway.tailscale.serviceName se aplica solo al modo Serve y se pasa a tailscale serve --service=<name>. El valor debe usar el formato svc:<dns-label> de Tailscale, por ejemplo svc:openclaw. Tailscale requiere que los hosts de Service sean nodos etiquetados, y el Service puede necesitar aprobación en la consola de administración antes de que Serve pueda publicarlo.
  • gateway.tailscale.resetOnExit revierte la configuración de tailscale serve/tailscale funnel al apagar.
  • gateway.tailscale.preserveFunnel: true mantiene activa una ruta tailscale funnel configurada externamente entre reinicios del gateway. Con mode: "serve", OpenClaw comprueba tailscale funnel status antes de volver a aplicar Serve y lo omite cuando una ruta Funnel ya cubre el puerto del gateway. La política de Funnel gestionada por OpenClaw de solo contraseña no cambia.
  • gateway.bind: "tailnet" es un enlace directo a Tailnet (sin HTTPS, sin Serve/Funnel).
  • gateway.bind: "auto" prefiere loopback; usa tailnet para enlazar solo a Tailnet.
  • Serve/Funnel solo exponen la interfaz de control del Gateway + WS. Los nodos se conectan mediante el mismo endpoint WS del Gateway, por lo que Serve también funciona para el acceso de nodos.

Requisitos previos y límites de Tailscale

  • Serve requiere HTTPS habilitado para tu tailnet; la CLI lo solicita si falta.
  • Serve inyecta encabezados de identidad de Tailscale; Funnel no.
  • Funnel requiere Tailscale v1.38.3+, MagicDNS, HTTPS habilitado y un atributo de nodo funnel.
  • Funnel solo admite los puertos 443, 8443 y 10000 sobre TLS.
  • Funnel en macOS requiere la variante de código abierto de la app de Tailscale.

Control del navegador (Gateway remoto + navegador local)

Para ejecutar el Gateway en una máquina pero controlar un navegador en otra, ejecuta un host de nodo en la máquina del navegador y mantén ambos en la misma tailnet. El Gateway proxifica las acciones del navegador al nodo; no se necesita un servidor de control separado ni una URL de Serve. Evita Funnel para el control del navegador; trata el emparejamiento de nodos como acceso de operador.

Más información

Relacionado