Acceso remoto (SSH, túneles y tailnets)
Este repositorio admite “remoto mediante SSH” manteniendo un único Gateway (el principal) en ejecución en un host dedicado (escritorio/servidor) y conectando los clientes a él.- Para operadores (tú / la app de macOS): el túnel SSH es el respaldo universal.
- Para nodos (iOS/Android y futuros dispositivos): conéctate al WebSocket del Gateway (LAN/tailnet o túnel SSH según sea necesario).
La idea central
- El WebSocket del Gateway se enlaza a loopback en tu puerto configurado (por defecto
18789). - Para uso remoto, reenvías ese puerto loopback mediante SSH (o usas una tailnet/VPN y dependes menos del túnel).
Configuraciones comunes de VPN/tailnet (donde vive el agente)
Piensa en el host del Gateway como “donde vive el agente”. Es propietario de las sesiones, perfiles de autenticación, canales y estado. Tu laptop/escritorio (y los nodos) se conectan a ese host.1) Gateway siempre activo en tu tailnet (VPS o servidor doméstico)
Ejecuta el Gateway en un host persistente y accede a él mediante Tailscale o SSH.- La mejor experiencia de usuario: mantén
gateway.bind: "loopback"y usa Tailscale Serve para la UI de Control. - Respaldo: mantén loopback + túnel SSH desde cualquier máquina que necesite acceso.
- Ejemplos: exe.dev (VM sencilla) o Hetzner (VPS de producción).
2) El Gateway se ejecuta en el escritorio de casa; la laptop solo controla de forma remota
La laptop no ejecuta el agente. Se conecta de forma remota:- Usa el modo Remote over SSH de la app de macOS (Settings → General → “OpenClaw runs”).
- La app abre y administra el túnel, de modo que WebChat + comprobaciones de estado “simplemente funcionan”.
3) El Gateway se ejecuta en la laptop; acceso remoto desde otras máquinas
Mantén el Gateway local, pero expónlo de forma segura:- Túnel SSH hacia la laptop desde otras máquinas, o
- Expón la UI de Control con Tailscale Serve y mantén el Gateway solo en loopback.
Flujo de comandos (qué se ejecuta dónde)
Un único servicio gateway es propietario del estado + canales. Los nodos son periféricos. Ejemplo de flujo (Telegram → nodo):- Llega un mensaje de Telegram al Gateway.
- El Gateway ejecuta el agente y decide si debe llamar a una herramienta del nodo.
- El Gateway llama al nodo a través del WebSocket del Gateway (
node.*RPC). - El nodo devuelve el resultado; el Gateway responde de vuelta a Telegram.
- Los nodos no ejecutan el servicio gateway. Solo debe ejecutarse un gateway por host, salvo que intencionalmente uses perfiles aislados (consulta Varios gateways).
- El “modo nodo” de la app de macOS es simplemente un cliente de nodo sobre el WebSocket del Gateway.
Túnel SSH (CLI + herramientas)
Crea un túnel local hacia el Gateway WS remoto:openclaw healthyopenclaw status --deepahora llegan al gateway remoto mediantews://127.0.0.1:18789.openclaw gateway status,openclaw gateway health,openclaw gateway probeyopenclaw gateway calltambién pueden apuntar a la URL reenviada mediante--urlcuando sea necesario.
18789 por tu gateway.port configurado (o --port/OPENCLAW_GATEWAY_PORT).
Nota: cuando pasas --url, la CLI no recurre a credenciales de configuración o entorno.
Incluye --token o --password explícitamente. La ausencia de credenciales explícitas es un error.
Valores predeterminados remotos de la CLI
Puedes conservar un destino remoto para que los comandos de la CLI lo usen de forma predeterminada:ws://127.0.0.1:18789 y abre primero el túnel SSH.
Precedencia de credenciales
La resolución de credenciales del Gateway sigue un único contrato compartido entre rutas de call/probe/status y la monitorización de aprobación de exec en Discord. El host del nodo usa el mismo contrato base con una excepción en modo local (intencionalmente ignoragateway.remote.*):
- Las credenciales explícitas (
--token,--passwordo la herramientagatewayToken) siempre tienen prioridad en las rutas call que aceptan autenticación explícita. - Seguridad de anulación de URL:
- Las anulaciones de URL de la CLI (
--url) nunca reutilizan credenciales implícitas de config/env. - Las anulaciones de URL por entorno (
OPENCLAW_GATEWAY_URL) pueden usar solo credenciales del entorno (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- Las anulaciones de URL de la CLI (
- Valores predeterminados en modo local:
- token:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(el respaldo remoto solo se aplica cuando no está definido el valor local del token de autenticación) - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(el respaldo remoto solo se aplica cuando no está definido el valor local de la contraseña de autenticación)
- token:
- Valores predeterminados en modo remoto:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- Excepción del host del nodo en modo local: se ignoran
gateway.remote.token/gateway.remote.password. - Las comprobaciones de token de probe/status remotas son estrictas de forma predeterminada: usan solo
gateway.remote.token(sin respaldo al token local) cuando apuntan al modo remoto. - Las anulaciones de entorno del Gateway usan solo
OPENCLAW_GATEWAY_*.
IU de chat mediante SSH
WebChat ya no usa un puerto HTTP independiente. La IU de chat SwiftUI se conecta directamente al WebSocket del Gateway.- Reenvía
18789mediante SSH (ver arriba), luego conecta los clientes aws://127.0.0.1:18789. - En macOS, prefiere el modo “Remote over SSH” de la app, que administra el túnel automáticamente.
App de macOS “Remote over SSH”
La app de barra de menús de macOS puede gestionar esta misma configuración de extremo a extremo (comprobaciones de estado remotas, WebChat y reenvío de Voice Wake). Runbook: acceso remoto en macOS.Reglas de seguridad (remoto/VPN)
Versión corta: mantén el Gateway solo en loopback salvo que estés seguro de que necesitas un bind.- Loopback + SSH/Tailscale Serve es la opción predeterminada más segura (sin exposición pública).
ws://en texto plano es solo loopback de forma predeterminada. Para redes privadas de confianza, estableceOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1en el proceso cliente como medida de emergencia.- Los binds fuera de loopback (
lan/tailnet/custom, oautocuando loopback no está disponible) deben usar autenticación del gateway: token, contraseña o un proxy inverso con conocimiento de identidad congateway.auth.mode: "trusted-proxy". gateway.remote.token/.passwordson orígenes de credenciales del cliente. No configuran por sí mismos la autenticación del servidor.- Las rutas call locales pueden usar
gateway.remote.*como respaldo solo cuandogateway.auth.*no está definido. - Si
gateway.auth.token/gateway.auth.passwordestán configurados explícitamente mediante SecretRef y no se pueden resolver, la resolución falla de forma cerrada (sin enmascaramiento por respaldo remoto). gateway.remote.tlsFingerprintfija el certificado TLS remoto cuando se usawss://.- Tailscale Serve puede autenticar el tráfico de la UI de Control/WebSocket mediante encabezados de identidad cuando
gateway.auth.allowTailscale: true; los endpoints de la API HTTP no usan esa autenticación de encabezado de Tailscale y en su lugar siguen el modo normal de autenticación HTTP del gateway. Este flujo sin token asume que el host del gateway es de confianza. Establécelo enfalsesi quieres autenticación con secreto compartido en todas partes. - La autenticación trusted-proxy es solo para configuraciones de proxy con conocimiento de identidad fuera de loopback.
Los proxies inversos en loopback en el mismo host no cumplen
gateway.auth.mode: "trusted-proxy". - Trata el control del navegador como acceso de operador: solo tailnet + emparejamiento deliberado de nodos.
macOS: túnel SSH persistente mediante LaunchAgent
Para clientes macOS que se conectan a un gateway remoto, la configuración persistente más sencilla usa una entradaLocalForward en la configuración de SSH más un LaunchAgent para mantener el túnel activo entre reinicios y fallos.
Paso 1: añadir configuración SSH
Edita~/.ssh/config:
<REMOTE_IP> y <REMOTE_USER> por tus valores.
Paso 2: copiar la clave SSH (una sola vez)
Paso 3: configurar el token del gateway
Guarda el token en la configuración para que persista entre reinicios:Paso 4: crear el LaunchAgent
Guarda esto como~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist:
Paso 5: cargar el LaunchAgent
com.openclaw.ssh-tunnel sobrante de una configuración anterior, descárgalo y elimínalo.
Solución de problemas
Comprueba si el túnel está en ejecución:| Entrada de configuración | Qué hace |
|---|---|
LocalForward 18789 127.0.0.1:18789 | Reenvía el puerto local 18789 al puerto remoto 18789 |
ssh -N | SSH sin ejecutar comandos remotos (solo reenvío de puertos) |
KeepAlive | Reinicia automáticamente el túnel si falla |
RunAtLoad | Inicia el túnel cuando el LaunchAgent se carga al iniciar sesión |