El mensaje
En macOS:
ssh: connect to host 203.0.113.10 port 22: Operation timed out
En Linux:
ssh: connect to host 203.0.113.10 port 22: Connection timed out
Tu ordenador envió una petición para abrir una conexión y no oyó nada de vuelta. SSH ni siquiera empezó, así que las claves y las contraseñas no intervienen.
En qué se diferencia de Connection refused
Montamos cada caso en un servidor de pruebas, y esto es lo que mostró ssh:
| Situación | Mensaje | Qué te dice |
|---|---|---|
| Regla de firewall configurada para descartar | Connection timed out | Nada respondió |
| Regla de firewall configurada para rechazar | Connection refused | Algo respondió que no |
| Nada escuchando en el puerto | Connection refused | La máquina respondió que no |
| Sin ruta en tu propia máquina | Network is unreachable | Tu ordenador no tiene camino que probar |
Así que mira la red, no sshd. Si recibes un rechazo, ve a Connection refused.
Prueba rápida
Por defecto puedes esperar un minuto o más por cada fallo. ConnectTimeout acorta la espera:
ssh -o ConnectTimeout=5 user@203.0.113.10
Prueba solo el puerto, en Linux y luego en macOS:
nc -vz -w 5 203.0.113.10 22
nc -vz -G 5 203.0.113.10 22
Después comprueba qué usa realmente tu configuración para ese nombre:
ssh -G server | grep -E '^(hostname|port) '
Causas, de más a menos probable
1. Un firewall de la nube o un grupo de seguridad te bloquea
Los firewalls de la nube normalmente descartan lo que no permiten, sin dar respuesta. Comprueba que una regla de entrada permite el puerto TCP 22 desde tu dirección pública actual. Una trampa habitual es una regla para una sola dirección, después de que haya cambiado la de tu casa o tu oficina.
En AWS, revisa también la tabla de rutas de la subred, la ACL de red y si la instancia tiene una dirección pública, como describe la guía de AWS indicada abajo. Otros proveedores tienen ajustes parecidos con otros nombres.
2. La dirección es incorrecta o la máquina está apagada
dig +short server
ping -c 3 203.0.113.10
Compara el resultado con la dirección que muestra tu proveedor, que puede cambiar tras una parada y un arranque. Un ping por sí solo prueba poco: muchos servidores lo bloquean, así que la falta de respuesta no significa que el servidor esté caído. Comprueba el estado de la máquina en la consola del proveedor.
3. Un firewall en el servidor lo descarta
Esto muestra si tus paquetes llegan siquiera al servidor. Ejecútalo desde la consola del proveedor mientras intentas conectar:
sudo tcpdump -ni any 'tcp port 22'
- Ningún paquete: se bloquean antes del servidor, así que revisa el firewall de la nube, el router y la ruta.
- Llegan paquetes, sin respuesta: el propio firewall del servidor los descarta, o la respuesta sale por otro camino.
Lista las reglas del servidor con sudo iptables -L INPUT -n o sudo nft list ruleset, y busca una regla de descarte en el puerto 22.
4. Tu propia red bloquea el puerto 22
Hoteles, oficinas y algunas redes Wi-Fi públicas bloquean el SSH saliente. La pista es que falla en una red y funciona en otra. Prueba con el punto de acceso del móvil, o prueba otro servidor SSH desde la misma red.
5. Un problema de enrutamiento
traceroute -n 203.0.113.10
Los asteriscos en algunos saltos son normales, porque muchos routers no responden. Fíjate en dónde se detiene el camino definitivamente. En Linux, esta variante envía TCP al puerto 22, que atraviesa más firewalls, y necesita root:
sudo traceroute -n -T -p 22 203.0.113.10
Si el servidor no tiene dirección pública, no puedes llegar a él directamente desde fuera de su red privada. Usa una VPN o un jump host.
Timeout durante el handshake
Este mensaje es distinto:
Connection timed out during banner exchange
Connection to 203.0.113.10 port 22 timed out
El puerto aceptó la conexión, pero no llegó a tiempo ningún saludo SSH. Lo obtuvimos con un listener de pruebas que aceptaba la conexión y luego se quedaba callado, con ConnectTimeout configurado. O sea, el camino de red funciona. Mira el servidor: una máquina sobrecargada o bloqueada, un servicio que no es SSH en ese puerto, o un equipo intermedio que retiene la conexión. ConnectTimeout cubre también esta fase, así que un valor muy bajo puede causar el mensaje en un servidor lento.
Define un timeout en tu configuración
Esto no arregla nada, pero los fallos vuelven antes y los scripts no se quedan colgados:
Host *
ConnectTimeout 10
Para otros ajustes que conviene guardar por host, mira estos ejemplos de archivo ssh config.
Preguntas
¿Qué diferencia hay entre Connection timed out y Connection refused?
Timed out significa que nada respondió, normalmente un firewall que descarta paquetes. Refused significa que algo respondió que no: nada escucha en ese puerto, o un firewall rechaza.
¿Cómo hago que SSH falle más rápido?
Usa ssh -o ConnectTimeout=5 usuario@servidor, o pon ConnectTimeout 10 bajo Host * en ~/.ssh/config.
¿Por qué SSH da timeout en AWS?
Casi siempre el security group no tiene una regla de entrada para el puerto TCP 22 desde tu dirección actual. Revisa también la network ACL, la tabla de rutas y que la instancia tenga dirección pública.