Detrás de la frase «OpenClaw SSH» se esconden dos tareas distintas, y confundirlas es donde la gente se atasca. Una es llegar a OpenClaw en sí: su panel corre en localhost, así que lo abres por un túnel SSH. La otra es lo contrario — dejar que el agente de OpenClaw ejecute comandos en tus propios servidores. Este artículo hace las dos cosas, y para la segunda muestra una vía que nunca pone una clave SSH donde el agente pueda leerla.
Una aclaración por delante: nosotros hacemos Termalin, la opción sin claves de la Parte 2. OpenClaw es una pasarela de agentes de código abierto que autoalojas — corre en una máquina, sirve un panel web e instala «skills» desde su mercado, ClawHub. Describimos los demás enfoques con la misma justicia con la que querríamos que describieran el nuestro.
Dos cosas que la gente quiere decir con «OpenClaw SSH»
- Llegar a OpenClaw por SSH. El panel está enlazado a localhost, así que reenvías su puerto a tu máquina. Eso es la Parte 1.
- Dejar que OpenClaw llegue a tus servidores. Quieres que el agente ejecute comandos en otras máquinas. Eso es la Parte 2, y es la parte que vale la pena hacer con cuidado.
Parte 1 — abre el panel de OpenClaw por un túnel SSH
La pasarela de OpenClaw se enlaza a 127.0.0.1:18789 en el host donde corre, a propósito. El panel es un plano de control de administración, no un sitio web público. Desde tu portátil, reenvía ese puerto por tu inicio de sesión SSH ya existente:
ssh -N -o ServerAliveInterval=30 -L 18789:127.0.0.1:18789 user@vps
Luego abre http://127.0.0.1:18789 en tu navegador. -N significa «sin shell, solo el túnel»; ServerAliveInterval=30 evita que la conexión quede inactiva. El tráfico usa la sesión SSH en la que ya confías, así que no se expone nada nuevo a internet.
No enlaces la pasarela a 0.0.0.0 para saltarte el túnel. Eso pone el plano de control de tu agente en el internet público, y quien encuentre el puerto se queda con el agente. La propia documentación de OpenClaw dice lo mismo: usa un túnel SSH, no expongas el puerto de la pasarela. Mantenlo en 127.0.0.1 y llega a él por SSH.
Cuando el túnel no conecta
«Connection refused», «check failed» o una página en blanco suele significar una de estas cosas:
- La pasarela no está corriendo, o está en otro puerto. Compruébalo en la máquina con
ss -tlnp | grep 18789. - Tu puerto local 18789 ya está en uso. Elige otro puerto local:
-L 28789:127.0.0.1:18789, y luego abrehttp://127.0.0.1:28789. - Obtuviste una shell en lugar de un túnel. Te dejaste el
-N.
Más casos en SSH connection refused o timed out.
Mantén el túnel del panel activo
Un túnel ssh -L a secas se detiene cuando tu red se cae. Para un túnel siempre activo, usa autossh o un pequeño servicio systemd, o un gestor de túneles que reconecte por ti. La mecánica de los reenvíos locales y remotos está cubierta en reenvío de puertos y túneles SSH (en inglés).
Parte 2 — deja que OpenClaw ejecute comandos en tus otros servidores
Esta es la parte que quiere la mayoría: OpenClaw ve que un servicio está caído y lo arregla en la máquina de verdad. La forma habitual es darle al agente una clave SSH — una clave en ~/.ssh del host de la pasarela, o una skill de SSH de ClawHub. Funciona. También es el montaje que más riesgo acarrea, así que vale la pena entenderlo antes de recurrir a él.
La parte arriesgada: una clave en la pasarela
Un mercado de skills es código que no escribiste tú, corriendo junto a tu clave. A principios de 2026, la investigación «ClawHavoc» de Koi Security auditó 2.857 skills de ClawHub y marcó 341 como maliciosas. Varias estaban diseñadas para robar claves SSH y credenciales; la mayoría instalaba el ladrón AMOS a través de falsos «prerrequisitos», y algunas exfiltraban el propio archivo .env del agente.
Añade el modo de fallo que tiene todo agente — inyección de prompts desde una página web o un correo que lee — y la consecuencia es evidente. Una clave SSH en la pasarela es una shell completa en cada host que confía en ella, alcanzable por cualquier cosa que pueda dirigir al agente. Revocarla implica rotar esa clave en todos esos hosts.
Así que el objetivo de la Parte 2 es dejar que OpenClaw ejecute los comandos que quieres, sin una clave que él — o una skill maliciosa — pueda llevarse.
La vía sin claves: un Connector, y luego Termalin como servidor MCP remoto
Dos piezas.
Primero, instala un Connector de Termalin en cada servidor al que quieras que OpenClaw llegue. Es una instalación de una línea y solo de salida: nunca escucha en un puerto, así que funciona detrás de NAT o CGNAT y no hace falta abrir nada en tu cortafuegos. Al dar de alta el servidor, su sshd se configura para confiar en la autoridad de certificación SSH de Termalin, y cada inicio de sesión usa entonces un certificado de corta duración emitido para tu cuenta. Ninguna clave de larga duración queda en la máquina, y ninguna se le entrega jamás al agente.
Segundo, añade Termalin a OpenClaw como servidor MCP remoto. MCP (en inglés) es cómo OpenClaw habla con herramientas que no trae de serie. El endpoint alojado de Termalin expone como herramientas los servidores que diste de alta con un Connector: hosts_list, ssh_exec, ssh_exec_many, lecturas y escrituras SFTP, server_metrics, alerts_list, y más.
OpenClaw lee una configuración en JSON5 desde ~/.openclaw/openclaw.json y la recarga automáticamente. Primero, una trampa: si omites transport, la versión actual de OpenClaw (2026.10.x) usa SSE por defecto. Termalin habla Streamable HTTP, así que tienes que poner "transport": "streamable-http", o la conexión falla.
Hay dos formas de autenticarse.
Clave API — buena para una pasarela que corre en un VPS. Crea una clave en el panel web de Termalin, acótala a los servidores que este agente deba tocar, y pon el valor en el entorno como TERMALIN_API_KEY. Luego añade el servidor con un comando:
openclaw mcp set termalin '{"url":"https://termal.in/api/v1/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer ${TERMALIN_API_KEY}"}}'
O escribe lo mismo en ~/.openclaw/openclaw.json:
{
"mcp": {
"servers": {
"termalin": {
"url": "https://termal.in/api/v1/mcp",
"transport": "streamable-http",
"headers": {
"Authorization": "Bearer ${TERMALIN_API_KEY}"
}
}
}
}
}
Usa la referencia ${TERMALIN_API_KEY}, no la clave literal. openclaw mcp doctor avisa cuando encuentra un token escrito directamente en headers, y los valores de las cabeceras se ocultan en sus logs.
OAuth — buena cuando quien inicia sesión es una persona. Apunta el servidor a https://termal.in/mcp, pon auth en oauth, y luego inicia sesión:
openclaw mcp set termalin '{"url":"https://termal.in/mcp","transport":"streamable-http","auth":"oauth"}'
openclaw mcp login termalin
openclaw mcp doctor termalin --probe
openclaw mcp login imprime una URL de autorización y espera en una devolución de llamada por loopback (http://127.0.0.1:<port>/callback). El OAuth de Termalin acepta esas URI de redirección por loopback, así que apruebas el inicio de sesión en tu navegador y el token se guarda — no hay ninguna clave que pegar. Si OpenClaw corre en un VPS sin pantalla y tu navegador está en un portátil, termínalo a mano con openclaw mcp login termalin --code <code>. Ten en cuenta que, con auth: "oauth" activado, OpenClaw ignora cualquier cabecera Authorization estática para ese servidor, así que elige un solo método.
En cualquier caso, openclaw mcp doctor termalin --probe confirma que el servidor es alcanzable y lista sus herramientas, y las herramientas de Termalin aparecen entonces ante el agente. (También puedes añadir un servidor desde la Control UI: chat → + → Connectors → Add MCP server…, solo para administradores.)
Decide primero qué puede hacer, y registra todo
Un agente permanente debería empezar con poco. En la tarjeta de apps de IA de Termalin, dale a esta conexión una política de comandos: solo lectura, una lista de comandos permitidos exactos, o acceso completo. Empieza con solo lectura — «cómo van mis servidores», disco, servicios fallidos, las últimas líneas de un registro, a través de server_metrics y alerts_list. Luego amplía a una lista de permitidos estrecha, y después a escrituras, de un paso en uno. El razonamiento detrás de unas listas de comandos permitidos por host (en inglés) ajustadas aplica directamente aquí.
Todo lo que el agente ejecuta queda registrado. Cada comando aterriza en la grabación de la sesión, en el watch grid en vivo y en el registro de auditoría (en inglés), marcado como del agente. Como el secreto es una credencial de Termalin y no una clave SSH repartida por los hosts, apagar el agente es un interruptor, no una rotación de claves en cada servidor. Si varias personas comparten un mismo OpenClaw, OpenClaw puede dar a cada emisor una identidad separada (oauth.identity: "per-requester"), así que el rastro de auditoría se mantiene por persona.
Cuando el servidor MCP no conecta
- Conecta pero no muestra herramientas, o falla en el handshake. Omitiste
transporty OpenClaw recurrió a SSE. Pon"transport": "streamable-http". - 401 Unauthorized. Falta la clave API o está fuera de alcance, o estás en la URL de OAuth (
/mcp) sin haber ejecutadoopenclaw mcp login. El endpoint de la clave es/api/v1/mcp; el endpoint de OAuth es/mcp. ${TERMALIN_API_KEY}llega vacío. La variable no está definida en el entorno donde corre OpenClaw. Expórtala donde arranca la pasarela.- Un servidor que esperas no aparece en
hosts_list. Todavía no tiene Connector, o está fuera del alcance de la clave.
Ejecuta openclaw mcp status --verbose y openclaw mcp doctor termalin --probe para ver en qué fase falla.
Alternativas justas
La vía sin claves no es la única. Hay otras dos razonables, según lo que necesites.
Dale una clave al agente directamente. Pon una clave SSH en ~/.ssh del host de la pasarela, o instala una skill de SSH de ClawHub (ssh-executor, ssh-full, sshx y otras) que lea una clave, una contraseña o una entrada de una bóveda. Es lo más rápido de montar y no depende de nada alojado. El precio es exactamente el riesgo descrito arriba: la clave es legible por cualquier cosa que ejecute el agente, su alcance es cada host que confía en ella, y revocarla implica rotar claves en todos ellos. Si haces esto, usa una clave dedicada de bajo privilegio, restríngela a fondo con command= en authorized_keys, y nunca reutilices tu clave personal.
Ejecuta un servidor SSH-MCP independiente que guarde la clave. Un pequeño servidor MCP autoalojado con una herramienta ssh_exec guarda la clave en su propia configuración, fuera del contexto del modelo. Eso es una mejora real — una transcripción filtrada ya no contiene la credencial. Pero la mayoría de estos vienen sin política de comandos, sin vista en vivo y sin rastro de auditoría, así que cualquier llamada a una herramienta puede ejecutar cualquier cosa en cualquier host configurado, y tu registro de lo que pasó es lo que el agente diga. Clasificamos este y todos los demás montajes según lo que cuesta un compromiso en dar a un agente de IA acceso SSH, por radio de impacto (en inglés).
Preguntas frecuentes
¿OpenClaw admite MCP? Sí. La versión actual de OpenClaw (2026.10.x) se conecta a servidores MCP remotos por HTTP. Añade uno con openclaw mcp set o openclaw mcp add, o desde la Control UI (chat → + → Connectors → Add MCP server…, solo para administradores). Pon "transport": "streamable-http" para servidores como Termalin, porque si no el valor por defecto es SSE.
¿Puede OpenClaw entrar por SSH en mi servidor? Puede, de dos maneras. Directamente, si le das una clave a través de la herramienta de ejecución o una skill de SSH de ClawHub. O sin claves, conectándolo a un servidor MCP que guarde el acceso por él — el montaje de Connector más MCP de arriba, donde ninguna clave llega jamás al agente.
¿Es seguro darle a OpenClaw mi clave SSH? Trátalo como de alto riesgo. Una clave en la pasarela es legible por cualquier skill o instrucción inyectada que el agente siga, y ClawHub ha publicado skills hechas para robar justo eso (Koi Security marcó 341 skills maliciosas a principios de 2026). Si no te queda otra, usa una clave de usar y tirar de bajo privilegio con restricciones command= — nunca tu clave personal.
¿Cómo soluciono «openclaw ssh connection refused»? Para el túnel del panel, comprueba que la pasarela está corriendo y enlazada a 127.0.0.1:18789 (ss -tlnp | grep 18789 en la máquina), asegúrate de que tu puerto local está libre, y mantén el -N en el comando ssh -L. Más casos en SSH connection refused o timed out.
¿Tengo que abrir algún puerto? No. El túnel del panel usa tu conexión SSH existente, y un Connector de Termalin es solo de salida — nunca escucha en un puerto, así que funciona detrás de NAT y CGNAT sin nada abierto en tu cortafuegos.
Termalin es un cliente SSH multiplataforma con un servidor MCP alojado, un custodio de claves y política de agente por host. El endpoint alojado y el acceso basado en Connector están en Pro ($10/mes, o $8/mes facturado anualmente) y Team, con 14 días de Pro de prueba y sin tarjeta — mira MCP, el Connector, o SSH para agentes de IA.