Qué significa
ssh: connect to host 203.0.113.10 port 22: Connection refused
La conexión no llegó ni a SSH. Las claves, las contraseñas y los usuarios aún no intervienen, así que no los cambies. Un rechazo es una respuesta rápida y activa, y eso te dice algo útil: una máquina o un firewall en ese camino está respondiendo. Si no responde nada, obtienes otro error, que se trata en Connection timed out.
Primero: prueba el puerto desde tu ordenador
nc -vz 203.0.113.10 22
ssh -G server | grep -E '^(hostname|port) '
La primera línea prueba el puerto sin SSH. La segunda muestra la dirección y el puerto que tu ~/.ssh/config da realmente para ese nombre, lo que detecta una errata o una entrada antigua. Si tu servidor usa otro puerto, prueba con ese:
ssh -p 2222 user@203.0.113.10
Causas, de más a menos probable
1. sshd no está en marcha o no está instalado
Para esta comprobación y las siguientes necesitas otra vía de entrada: la consola de tu proveedor o acceso físico.
sudo systemctl status ssh # Debian, Ubuntu
sudo systemctl status sshd # Red Hat family, most others
sudo ss -tlnp | grep -E 'sshd|:22 '
Si ss no muestra ninguna línea en el puerto SSH, nada está escuchando. En Ubuntu la línea puede mostrar systemd en lugar de sshd: es ssh.socket esperando conexiones, y está bien. Un resultado sano se ve así:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1,fd=6))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1,fd=7))
Un motivo habitual de que sshd no arranque es un error en su configuración. Comprueba el archivo y luego arráncalo:
sudo sshd -t
sudo systemctl enable --now ssh
sshd -t no muestra nada cuando el archivo es válido. Si el servicio no existe, instálalo, por ejemplo con sudo apt install openssh-server.
2. sshd escucha en otro puerto
sudo sshd -T | grep -iE '^(port|listenaddress) '
Compara el puerto con aquel al que te conectas. sshd -T muestra la configuración una vez leídos todos los archivos, incluido lo que haya en /etc/ssh/sshd_config.d/.
En Ubuntu 22.10 y posteriores, sshd puede ser iniciado por ssh.socket, de modo que el puerto de escucha lo configura systemd. Tras cambiar Port, ejecuta sudo systemctl daemon-reload y sudo systemctl restart ssh.socket, y comprueba con ss que surtió efecto.
3. sshd escucha en otra dirección
Con ListenAddress 127.0.0.1 obtuvimos exactamente este comportamiento: el puerto funciona desde el propio servidor y se rechaza desde cualquier otro sitio.
LISTEN 0 128 127.0.0.1:22 0.0.0.0:* users:(("sshd",pid=1,fd=6))
Mira la dirección local en la salida de ss. 0.0.0.0 y [::] significan todas las direcciones. Una única dirección privada o de loopback significa que solo puedes conectarte a través de esa dirección. Para cambiarlo, edita o quita la línea ListenAddress y reinicia sshd.
Desde fuera puedes llegar igualmente a través de una máquina de la misma red: mira cómo usar ProxyJump y un jump host.
4. Un firewall rechaza la conexión
Una regla de firewall configurada para rechazar da el mismo mensaje que un puerto cerrado. Lo probamos con una regla REJECT de iptables mientras sshd estaba en marcha, y ssh mostró Connection refused. Una regla configurada para descartar da un timeout en su lugar.
sudo ufw status verbose
sudo iptables -L INPUT -n --line-numbers
sudo nft list ruleset
Usa el que tenga tu sistema. Para permitir SSH con ufw:
sudo ufw allow 22/tcp
Si ss se ve bien y las conexiones locales funcionan, esta es la causa más probable. Revisa también el firewall de tu proveedor o de tu router.
5. Tu dirección está bloqueada
Un bloqueo de fail2ban se ve exactamente como este error. En un servidor de pruebas Debian 13, un cliente bloqueado recibió Connection refused tanto de ssh como de nc. Una buena pista es que el servidor funciona desde otra red, como el punto de acceso del móvil. Compruébalo y límpialo desde el servidor:
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 203.0.113.20
Consulta la guía de fail2ban para la configuración.
6. Llegas a otra máquina
Si el DNS está desactualizado, o un router reenvía el puerto a otro sitio, puede que estés preguntando al host equivocado. Compara dig +short server con la dirección que muestra el proveedor. En el servidor, esto muestra si tu conexión llega siquiera:
sudo tcpdump -ni any 'tcp port 22'
Si no aparece ningún paquete mientras te conectas, el rechazo viene de algún punto anterior a este servidor.
Lectura conjunta de los resultados
| Desde el servidor | Desde tu ordenador | Causa probable |
|---|---|---|
Sin línea de sshd en ss | Rechazado | sshd está detenido o falla |
| sshd en otro puerto | Rechazado en el 22 | Puerto equivocado |
sshd solo en 127.0.0.1 | Rechazado | ListenAddress |
sshd en 0.0.0.0:22 | Rechazado | El firewall rechaza, o un bloqueo |
sshd en 0.0.0.0:22 | Funciona desde otra red | Un bloqueo o una restricción en tu red |
Si cambias ajustes de sshd o del firewall en un servidor al que solo llegas por SSH, mantén abierta tu sesión actual y prueba con una segunda antes de cerrar sesión.
Preguntas
¿Qué significa Connection refused en SSH?
Tu ordenador llegó a la dirección, y la máquina o un firewall respondió que nada acepta conexiones en ese puerto. SSH ni siquiera empezó, así que las claves y contraseñas no son la causa.
¿Cómo compruebo si sshd está en marcha?
En el servidor ejecuta sudo systemctl status ssh (sshd en sistemas Red Hat), y luego sudo ss -tlnp para ver en qué direcciones y puertos escucha. En Ubuntu la línea puede mostrar systemd en lugar de sshd, y es normal.
¿Puede fail2ban causar Connection refused?
Sí. Su bloqueo por defecto rechaza las conexiones nuevas desde tu dirección. Si el servidor funciona desde otra red, revisa sudo fail2ban-client status sshd.
Fuentes
- sshd_config(5), manual de OpenBSD
- sshd(8), manual de OpenBSD
- sshd ahora usa activación basada en sockets, Ubuntu