Acceso Remoto
Este repositorio admite el "acceso remoto por SSH" manteniendo un único Gateway (el maestro) ejecutándose en un host dedicado (escritorio/servidor) y conectando clientes a él.
- Para operadores (tú / la aplicación de macOS): el túnel SSH es el respaldo universal.
- Para nodos (iOS/Android y dispositivos futuros): conéctate al WebSocket del Gateway (LAN/tailnet o túnel SSH según sea necesario).
La idea central
- El WebSocket del Gateway se vincula a loopback en el puerto configurado (por defecto 18789).
- Para uso remoto, reenvías ese puerto loopback a través de SSH (o usas una tailnet/VPN y reduces el túnel).
Configuraciones comunes de VPN/tailnet (donde vive el agente)
Piensa en el host del Gateway como "donde vive el agente". Es dueño de las sesiones, perfiles de autenticación, canales y estado. Tu portátil/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 a través de Tailscale o SSH.
- Mejor experiencia de usuario: mantén
gateway.bind: "loopback"y usa Tailscale Serve para la Interfaz de Control. - Respaldo: mantén loopback + túnel SSH desde cualquier máquina que necesite acceso.
- Ejemplos: exe.dev (VM fácil) o Hetzner (VPS de producción).
Esto es ideal cuando tu portátil se suspende a menudo pero quieres que el agente esté siempre activo.
2) El escritorio doméstico ejecuta el Gateway, el portátil es control remoto
El portátil no ejecuta el agente. Se conecta de forma remota:
- Usa el modo Remoto por SSH de la aplicación de macOS (Configuración → General → "OpenClaw runs").
- La aplicación abre y gestiona el túnel, por lo que WebChat + comprobaciones de estado "simplemente funcionan".
Procedimiento: Acceso remoto en macOS.
3) El portátil ejecuta el Gateway, acceso remoto desde otras máquinas
Mantén el Gateway local pero exponlo de forma segura:
- Túnel SSH al portátil desde otras máquinas, o
- Usa Tailscale Serve para la Interfaz de Control y mantén el Gateway solo en loopback.
Guía: Tailscale y Vista general web.
Flujo de comandos (qué se ejecuta dónde)
Un servicio de gateway posee el estado + canales. Los nodos son periféricos. Ejemplo de flujo (Telegram → nodo):
- El mensaje de Telegram llega al Gateway.
- El Gateway ejecuta el agente y decide si llamar a una herramienta del nodo.
- El Gateway llama al nodo a través del WebSocket del Gateway (RPC
node.*). - El nodo devuelve el resultado; el Gateway responde de vuelta a Telegram.
Notas:
- Los nodos no ejecutan el servicio de gateway. Solo un gateway debe ejecutarse por host a menos que ejecutes perfiles aislados intencionalmente (ver Múltiples gateways).
- El "modo nodo" de la aplicación de macOS es solo un cliente nodo sobre el WebSocket del Gateway.
Túnel SSH (CLI + herramientas)
Crea un túnel local al WebSocket del Gateway remoto:
ssh -N -L 18789:127.0.0.1:18789 user@host
Con el túnel activo:
openclaw healthyopenclaw status --deepahora alcanzan el gateway remoto a través dews://127.0.0.1:18789.openclaw gateway {status,health,send,agent,call}también pueden apuntar a la URL reenviada mediante--urlcuando sea necesario.
Nota: reemplaza 18789 con tu gateway.port configurado (o --port/OPENCLAW_GATEWAY_PORT). Nota: cuando pasas --url, la CLI no recurre a las credenciales de configuración o entorno. Incluye --token o --password explícitamente. La falta de credenciales explícitas es un error.
Valores predeterminados remotos de la CLI
Puedes persistir un destino remoto para que los comandos de la CLI lo usen por defecto:
{
gateway: {
mode: "remote",
remote: {
url: "ws://127.0.0.1:18789",
token: "your-token",
},
},
}
Cuando el gateway es solo loopback, mantén la URL en ws://127.0.0.1:18789 y abre primero el túnel SSH.
Precedencia de credenciales
La resolución de credenciales para llamadas/sondeos del Gateway ahora sigue un contrato compartido:
- Las credenciales explícitas (
--token,--password, ogatewayTokende la herramienta) siempre ganan. - Valores predeterminados del modo local:
- token:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password
- token:
- Valores predeterminados del modo remoto:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- Las comprobaciones de token para sondeos/estado remotos son estrictas por defecto: usan solo
gateway.remote.token(sin recurrir al token local) cuando se apunta al modo remoto. - Las variables de entorno heredadas
CLAWDBOT_GATEWAY_*solo son usadas por rutas de llamada de compatibilidad; la resolución de sondeo/estado/autenticación usa soloOPENCLAW_GATEWAY_*.
Interfaz de chat sobre SSH
WebChat ya no usa un puerto HTTP separado. La interfaz de chat SwiftUI se conecta directamente al WebSocket del Gateway.
- Reenvía
18789a través de SSH (ver arriba), luego conecta clientes aws://127.0.0.1:18789. - En macOS, prefiere el modo "Remoto por SSH" de la aplicación, que gestiona el túnel automáticamente.
Aplicación de macOS "Remoto por SSH"
La aplicación de la barra de menús de macOS puede impulsar la misma configuración de extremo a extremo (comprobaciones de estado remotas, WebChat y reenvío de Voice Wake). Procedimiento: Acceso remoto en macOS.
Reglas de seguridad (remoto/VPN)
Versión corta: mantén el Gateway solo en loopback a menos que estés seguro de que necesitas un enlace.
- Loopback + SSH/Tailscale Serve es el valor predeterminado más seguro (sin exposición pública).
- El texto plano
ws://es solo loopback por defecto. Para redes privadas confiables, estableceOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1en el proceso cliente como medida de emergencia. - Los enlaces no loopback (
lan/tailnet/custom, oautocuando loopback no está disponible) deben usar tokens/contraseñas de autenticación. gateway.remote.token/.passwordson fuentes de credenciales del cliente. Por sí solas no configuran la autenticación del servidor.- Las rutas de llamada local pueden usar
gateway.remote.*como respaldo cuandogateway.auth.*no está establecido. gateway.remote.tlsFingerprintfija el certificado TLS remoto cuando se usawss://.- Tailscale Serve puede autenticar el tráfico de la Interfaz de Control/WebSocket a través de cabeceras de identidad cuando
gateway.auth.allowTailscale: true; los endpoints de la API HTTP aún requieren autenticación por token/contraseña. Este flujo sin token asume que el host del gateway es confiable. Establécelo enfalsesi quieres tokens/contraseñas en todas partes. - Trata el control del navegador como acceso de operador: solo tailnet + emparejamiento deliberado de nodos.
Profundización: Seguridad.