Cómo evitar que SSH se desconecte por tiempo de espera en tu MacBook

Para evitar que SSH se desconecte en Mac, añade ServerAliveInterval 60 y ServerAliveCountMax 3 bajo Host * en ~/.ssh/config. Así el cliente SSH de tu Mac envía un pequeño paquete de keepalive antes de que el router Wi-Fi, un firewall corporativo o el temporizador de inactividad del servidor remoto cierren la conexión. Eso sí, no sobrevive a la suspensión ni a un cambio de Wi-Fi. Más abajo verás cuál de los cuatro tiempos de espera te está afectando.
Configura keepalive de SSH global en ~/.ssh/config
Abre (o crea) ~/.ssh/config y añade un bloque Host * con dos directivas: ServerAliveInterval 60 y ServerAliveCountMax 3. Las apps de terminal que ejecutan tu shell, MXterm Pro incluida, usan el ssh que está en tu PATH, normalmente el OpenSSH que viene con macOS.
Ese cliente envía ahora al servidor un paquete nulo de "¿sigues ahí?" cada 60 segundos. Si tres seguidos (180 segundos) quedan sin respuesta, SSH cierra la conexión limpiamente en lugar de quedarse colgado en un socket muerto.
Pon tu bloque general Host * al final del archivo. OpenSSH usa "gana el primer valor obtenido" para cada opción. Si ya tienes bloques Host específicos para servidores concretos (un jump host, un equipo de la VPN del trabajo con su propia configuración), un bloque Host * colocado encima ya fijó ServerAliveInterval antes de que OpenSSH lea el bloque específico.
Un intervalo de 60 segundos con 3 intentos tarda hasta tres minutos en detectar una conexión muerta, un punto de partida razonable. Si un firewall corporativo o un Wi-Fi público cortan las conexiones inactivas más o menos al minuto, baja a ServerAliveInterval 30 y ServerAliveCountMax 2. Detectas la caída en un minuto en vez de tres, a cambio de un paquetito más cada 30 segundos.
Para comprobar que funciona, deja una sesión inactiva más tiempo del que antes bastaba para desconectarla y verifica que sigue ahí. En las preguntas frecuentes de abajo verás cómo observar los propios paquetes de keepalive.
El cliente SSH de macOS ya trae TCPKeepAlive yes por defecto, pero es una comprobación a nivel TCP que puede tardar hasta dos horas en notar un socket realmente muerto. No hace nada frente a un firewall o dispositivo NAT que sigue reenviando paquetes pero ya decidió que tu conexión inactiva terminó. ServerAliveInterval actúa en cambio a nivel del protocolo SSH, por eso es el ajuste que lo resuelve.
Qué tiempo de espera te afecta de verdad (y por qué los MacBook lo sufren más)
No todas las desconexiones de SSH tienen la misma causa, y la solución correcta depende de cuál es la tuya.
Tiempo de espera por inactividad en el firewall o NAT: algo entre tú y el servidor (un firewall corporativo, el router de casa, un gateway de VPN) decide que una conexión sin tráfico durante unos minutos está muerta y descarta su estado. ServerAliveInterval lo arregla directamente, siempre que sea más corto que la ventana de ese dispositivo.
Tiempo de espera por inactividad en el servidor: el sshd remoto está configurado para desconectar clientes inactivos, o un shell de login tiene su propio TMOUT. Tu ServerAliveInterval local ayuda en el caso de sshd, porque tu cliente ya no parece inactivo desde el lado del servidor.
Cambio de red: cambiar de red Wi-Fi, conectarte a una VPN o pasar de casa a un hotspot cambia tu IP en plena sesión. La conexión TCP de SSH no sobrevive a eso, y ningún ajuste de keepalive arregla un cambio de IP. Solo un protocolo pensado para ello (Mosh) puede, y a cambio sacrifica algunas funciones de la terminal por esa resistencia.
Suspensión: el caso específico de los MacBook. Cuando cierras la tapa o la Mac se suspende, deja de ejecutar tu cliente SSH, así que no sale ningún paquete de keepalive durante ese intervalo. Al despertar, el servidor suele haber abandonado la conexión y SSH informa de un tiempo de espera agotado o de un broken pipe.
Si una sesión tiene que sobrevivir al cierre de la tapa, ejecuta el trabajo remoto dentro de tmux o screen para que no le importe que tu conexión local se haya caído (más detalles en las preguntas frecuentes).
Arréglalo también en el servidor, si puedes
Si administras la máquina remota, también puedes evitar los cortes de SSH por tiempo de espera desde ese lado. Añade ClientAliveInterval 60 y ClientAliveCountMax 3 a /etc/ssh/sshd_config y reinicia sshd. Es el equivalente en el servidor del ajuste del cliente, y evita que sea el servidor quien corte la conexión.
Si no controlas el servidor (un host compartido, la VM de un cliente, una máquina en la nube que administra otra persona), no estás atascado. ServerAliveInterval en tu propio ~/.ssh/config funciona de forma independiente, porque tu cliente envía el tráfico de keepalive y el sshd remoto no tiene que cooperar.
Qué pasa dentro de MXterm Pro cuando se agota el tiempo de espera de una sesión
Cada panel de terminal de MXterm Pro es un PTY real que ejecuta tu shell de login habitual, construido con Tauri y portable-pty en Rust. No es una pestaña del navegador haciéndose pasar por terminal.
Una conexión SSH que abres dentro usa el mismo cliente OpenSSH que ya tiene tu Mac. En un panel normal, ssh lee tu ~/.ssh/config exactamente igual que en Terminal.app o iTerm2, así que las líneas de keepalive de esta guía se aplican sin cambios.
Un panel abierto desde un host guardado es distinto. MXterm Pro inicia ssh con -o ServerAliveInterval=30 -o ServerAliveCountMax=3 en la línea de comandos, así que detecta una conexión muerta en unos 90 segundos. OpenSSH toma el primer valor que obtiene, y las opciones de la línea de comandos van antes que el archivo de configuración. Por eso los valores de tu ~/.ssh/config para esas dos opciones no se aplican a ese panel.
Lo que ves cuando se cae una sesión depende de cómo la abriste. Si escribes ssh tú mismo en un panel normal, el proceso que termina es ssh, no el shell de abajo. Vuelves al prompt local de tu Mac en el mismo panel, con todo lo ya impreso aún en pantalla. Reconecta volviendo a escribir el comando o pulsando ↑.
Un panel abierto desde un host guardado se comporta distinto. Lanza ssh directamente, así que no hay un shell al que volver. Cuando la sesión termina con el código 255, que es lo habitual en una caída, el panel imprime su propia línea atenuada que empieza con SSH connection failed or dropped (exit 255) y termina con press Enter to reconnect. Enter vuelve a abrir la conexión.
Con cualquier otro código de salida, el panel imprime Disconnected (exit N) seguido de press Enter to reconnect.
El SSH Host Manager (⌘⇧H) ayuda antes y después de una caída, no durante ella. Conectarte con un host guardado reutiliza la propia multiplexación de conexiones de OpenSSH (ControlMaster=auto, ControlPersist=10m). Si abres el panel de archivos SFTP de un host al que ya estás conectado, reutiliza esa conexión y se salta el handshake. La conexión compartida sigue abierta 10 minutos después de que se cierre la última sesión que la usa. Hay más sobre hosts guardados en la documentación de SSH y SFTP.
La conexión compartida se cierra antes si cambias los ajustes de conexión del host guardado o lo eliminas, y el panel de archivos tiene un botón Restablecer conexión para un servidor que rechaza el inicio de sesión o fuerza un cambio de contraseña.
Una nota sobre planes para quien maneja más de un par de servidores: por defecto el plan Free guarda hasta 5 hosts SSH en ese gestor, y el plan Pro de pago quita ese tope.
MXterm Pro frente a iTerm2, Warp, Termius y MobaXterm en sesiones SSH largas
Termius admite Mosh, que sobrevive a cambios de IP y a la suspensión de la Mac, algo que SSH simple no puede hacer por diseño. Para una comparación más completa, consulta los mejores clientes SSH para Mac.
MXterm Pro ejecuta varias sesiones SSH y agentes de código con IA (Claude Code, Codex, Gemini CLI) uno junto a otro en un mismo espacio de trabajo. Si marcas el aislamiento con worktree en el Composer de nueva pestaña (desactivado por defecto, solo en repositorios git), cada panel de agente recibe su propio git worktree, lo que reduce la probabilidad de que los cambios de un agente choquen con los de otro. No reemplaza los ajustes de keepalive de arriba, así que configúralos uses la app de terminal que uses.
SSH con varios paneles, Command Recipes (Cmd+J) y una Control Room (antes War Room) multiagente: gratis para empezar.
¿Ya tienes MXterm Pro? Lee la guía de configuración →
¿Nuevo en MXterm Pro? Mira los precios →
Preguntas frecuentes
ServerAliveInterval es un ajuste del lado del cliente, en el ~/.ssh/config de tu propia Mac. Le dice a tu equipo que haga ping al servidor. ClientAliveInterval es su espejo en el servidor, definido en /etc/ssh/sshd_config de la máquina remota. Le dice al servidor que haga ping a tu cliente. Basta con un lado para que el keepalive funcione. Configurar ambos no hace daño, y sirve cuando no sabes qué extremo está cortando la conexión.
Sí, para todo lo que deba sobrevivir a una desconexión real y no solo a un tiempo de espera por inactividad. ServerAliveInterval solo evita que maten la conexión por parecer inactiva. No puede salvar un trabajo si tu MacBook se suspende, se cae el Wi-Fi o cierras la tapa. Una compilación o migración dentro de tmux o screen en el servidor remoto sigue adelante pase lo que pase con tu conexión local. Vuelve a entrar en la sesión con tmux attach cuando recuperes la red.
Normalmente porque el MacBook se suspendió, no porque fallara el keepalive. Una Mac suspendida no ejecuta ningún cliente SSH, así que no sale ningún paquete de keepalive. SSH informa de la caída en cuanto despiertas.
La comprobación más simple es dejar una sesión inactiva más tiempo del que antes bastaba para desconectarla y confirmar que sigue ahí. Para ver los paquetes en sí, ejecuta sudo tcpdump -i en0 host <server-ip> and port 22 en una segunda ventana. Busca paquetes pequeños que salgan cada ServerAliveInterval segundos, incluso con la sesión inactiva. Un panel abierto desde un host guardado los envía cada 30 segundos.