Error SSH "ssh: connect to host port 22: Connection refused": causas y solución

Tu ordenador llegó a la dirección, y el otro lado respondió que nada acepta conexiones en ese puerto. Normalmente sshd no está en marcha, escucha en otro puerto o dirección, o un firewall te rechaza. En el servidor, sudo ss -tlnp muestra qué escucha de verdad, en qué dirección y puerto.

Actualizada el . Cada causa se reprodujo en un contenedor Debian 13 desechable con OpenSSH 10.0, usando ListenAddress, iptables REJECT, ufw y un bloqueo de fail2ban, con OpenSSH 10.3 en macOS y el cliente de Debian.

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 servidorDesde tu ordenadorCausa probable
Sin línea de sshd en ssRechazadosshd está detenido o falla
sshd en otro puertoRechazado en el 22Puerto equivocado
sshd solo en 127.0.0.1RechazadoListenAddress
sshd en 0.0.0.0:22RechazadoEl firewall rechaza, o un bloqueo
sshd en 0.0.0.0:22Funciona desde otra redUn 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

Más en Mensajes de error

Todas las guías