Postmortem #002 · Cuando el puerto 22 estaba abierto pero SSH no funcionaba
El 16 de octubre de 2026 intentamos conectarnos por SSH a uno de nuestros servidores de producción y recibimos un error bastante poco tranquilizador:
kex_exchange_identification: read: Connection reset
Connection reset by <servidor> port 22
La primera impresión podía ser que el servidor estaba caído, que el firewall estaba bloqueando el acceso o que el servicio SSH había dejado de escuchar.
Pero ninguna de esas explicaciones encajaba del todo.
Las webs alojadas en el servidor seguían respondiendo correctamente.
El puerto 22 aparecía abierto.
Desde otro servidor de nuestra infraestructura también era posible establecer la conexión TCP al puerto SSH.
Y, aun así, ninguna sesión SSH conseguía llegar siquiera al intercambio inicial de claves.
La causa terminó siendo una combinación bastante peculiar:
- un proceso
sshdantiguo había quedado vivo fuera del estado normal gestionado por systemd; - ese proceso seguía ocupando el puerto 22;
- durante una operación automática de mantenimiento,
ssh.servicese detuvo; ssh.socketno pudo recuperar el puerto porque seguía ocupado;- systemd eliminó
/run/sshd, un directorio temporal ligado al ciclo de vida del servicio; - el listener antiguo siguió aceptando conexiones TCP, pero no podía completar nuevas sesiones SSH.
El resultado era engañoso:
servidor ✅
webs ✅
red ✅
puerto 22 ✅
SSH ❌
Y precisamente esa contradicción hizo interesante el incidente.
Nota de seguridad
Algunos nombres, direcciones IP, dominios y detalles concretos de la infraestructura han sido anonimizados o simplificados.
La secuencia técnica y la causa del incidente se mantienen fieles al caso real.
