Erreur SSH « ssh: connect to host port 22: Connection refused »

Votre ordinateur a atteint l'adresse, et l'autre côté a répondu que rien n'accepte de connexions sur ce port. Le plus souvent, sshd ne tourne pas, il écoute sur un autre port ou une autre adresse, ou un pare-feu vous rejette. Sur le serveur, sudo ss -tlnp montre ce qui écoute réellement, sur quelle adresse et quel port.

Mis à jour le . Chaque cause a été reproduite sur un conteneur Debian 13 jetable avec OpenSSH 10.0, en utilisant ListenAddress, iptables REJECT, ufw et un bannissement fail2ban, avec OpenSSH 10.3 sur macOS et le client Debian.

Ce que cela signifie

ssh: connect to host 203.0.113.10 port 22: Connection refused

La connexion n'est jamais allée jusqu'à SSH. Les clés, les mots de passe et les utilisateurs ne jouent encore aucun rôle : ne les changez donc pas. Un refus est une réponse rapide et active, ce qui vous apprend quelque chose d'utile : une machine ou un pare-feu sur ce chemin répond. Si rien ne répond du tout, vous obtenez une autre erreur, traitée dans Connection timed out.

D'abord : tester le port depuis votre ordinateur

nc -vz 203.0.113.10 22
ssh -G server | grep -E '^(hostname|port) '

La première ligne teste le port sans SSH. La seconde montre l'adresse et le port que votre ~/.ssh/config donne réellement pour ce nom, ce qui révèle une faute de frappe ou une ancienne entrée. Si votre serveur utilise un autre port, essayez celui-là :

ssh -p 2222 user@203.0.113.10

Les causes, par ordre de probabilité

1. sshd ne tourne pas ou n'est pas installé

Pour cette vérification et les suivantes, il vous faut une autre voie d'accès : la console de votre hébergeur, ou un accès physique.

sudo systemctl status ssh     # Debian, Ubuntu
sudo systemctl status sshd    # Red Hat family, most others
sudo ss -tlnp | grep -E 'sshd|:22 '

Si ss n'affiche aucune ligne sur le port SSH, rien n'écoute. Sous Ubuntu, la ligne peut afficher systemd au lieu de sshd : c'est ssh.socket qui attend les connexions, tout va bien. Un résultat sain ressemble à ceci :

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))

Une raison courante pour laquelle sshd ne démarre pas est une erreur dans sa configuration. Vérifiez le fichier, puis démarrez-le :

sudo sshd -t
sudo systemctl enable --now ssh

sshd -t n'affiche rien quand le fichier est valide. Si le service n'existe pas, installez-le, par exemple avec sudo apt install openssh-server.

2. sshd écoute sur un autre port

sudo sshd -T | grep -iE '^(port|listenaddress) '

Comparez le port avec celui auquel vous vous connectez. sshd -T affiche la configuration après lecture de tous les fichiers, y compris ceux de /etc/ssh/sshd_config.d/.

Sur Ubuntu 22.10 et suivants, sshd peut être démarré par ssh.socket : le port d'écoute est alors géré par systemd. Après avoir changé Port, lancez sudo systemctl daemon-reload et sudo systemctl restart ssh.socket, puis vérifiez avec ss que le changement a pris effet.

3. sshd écoute sur une autre adresse

Avec ListenAddress 127.0.0.1, nous avons obtenu exactement ce comportement : le port fonctionne depuis le serveur lui-même et il est refusé de partout ailleurs.

LISTEN 0 128   127.0.0.1:22  0.0.0.0:*  users:(("sshd",pid=1,fd=6))

Regardez l'adresse locale dans la sortie de ss. 0.0.0.0 et [::] signifient toutes les adresses. Une seule adresse privée ou de bouclage signifie que vous ne pouvez vous connecter que par cette adresse. Pour la changer, modifiez ou supprimez la ligne ListenAddress et redémarrez sshd.

Depuis l'extérieur, vous pouvez quand même l'atteindre via une machine du même réseau : voyez comment utiliser ProxyJump et un hôte de rebond.

4. Un pare-feu rejette la connexion

Une règle de pare-feu réglée sur rejeter donne le même message qu'un port fermé. Nous l'avons testé avec une règle iptables REJECT pendant que sshd tournait, et ssh a affiché Connection refused. Une règle réglée sur ignorer (drop) donne plutôt un délai dépassé.

sudo ufw status verbose
sudo iptables -L INPUT -n --line-numbers
sudo nft list ruleset

Utilisez celle que votre système possède. Pour autoriser SSH avec ufw :

sudo ufw allow 22/tcp

Si ss semble correct et que les connexions locales fonctionnent, c'est la cause la plus probable. Vérifiez aussi le pare-feu de votre hébergeur ou de votre routeur.

5. Votre adresse est bannie

Un bannissement fail2ban ressemble exactement à cette erreur. Sur un serveur de test Debian 13, un client banni a reçu Connection refused de ssh comme de nc. Un bon indice : le serveur fonctionne depuis un autre réseau, comme le point d'accès d'un téléphone. Vérifiez et levez le bannissement depuis le serveur :

sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 203.0.113.20

Voir le guide fail2ban pour la configuration.

6. Vous atteignez une autre machine

Si le DNS est périmé, ou si un routeur redirige le port ailleurs, vous interrogez peut-être le mauvais hôte. Comparez dig +short server avec l'adresse indiquée par l'hébergeur. Sur le serveur, ceci montre si votre connexion arrive seulement :

sudo tcpdump -ni any 'tcp port 22'

Si aucun paquet n'apparaît pendant que vous vous connectez, le refus vient d'un point situé avant ce serveur.

Lire les résultats ensemble

Depuis le serveurDepuis votre ordinateurCause probable
Aucune ligne sshd dans ssRefusésshd est arrêté ou en échec
sshd sur un autre portRefusé sur 22Mauvais port
sshd sur 127.0.0.1 uniquementRefuséListenAddress
sshd sur 0.0.0.0:22RefuséLe pare-feu rejette, ou un bannissement
sshd sur 0.0.0.0:22Fonctionne depuis un autre réseauUn bannissement ou un blocage sur votre réseau

Si vous modifiez les réglages de sshd ou du pare-feu sur un serveur que vous n'atteignez que par SSH, gardez votre session actuelle ouverte et testez avec une seconde avant de vous déconnecter.

Questions

Que signifie Connection refused en SSH ?

Votre ordinateur a atteint l'adresse, et la machine ou un pare-feu a répondu que rien n'accepte de connexion sur ce port. SSH n'a jamais démarré : clés et mots de passe ne sont pas en cause.

Comment vérifier que sshd tourne ?

Sur le serveur, lancez sudo systemctl status ssh (sshd sur les systèmes Red Hat), puis sudo ss -tlnp pour voir les adresses et ports sur lesquels il écoute. Sous Ubuntu, la ligne peut afficher systemd au lieu de sshd, c'est normal.

fail2ban peut-il provoquer Connection refused ?

Oui. Son bannissement par défaut rejette les nouvelles connexions de votre adresse. Si le serveur répond depuis un autre réseau, vérifiez sudo fail2ban-client status sshd.

Sources

Autres guides : Messages d'erreur

Tous les guides