Le message
Sur macOS :
ssh: connect to host 203.0.113.10 port 22: Operation timed out
Sur Linux :
ssh: connect to host 203.0.113.10 port 22: Connection timed out
Votre ordinateur a envoyé une demande d'ouverture de connexion et n'a rien entendu en retour. SSH n'a jamais démarré : les clés et les mots de passe ne sont donc pas en cause.
En quoi cela diffère de Connection refused
Nous avons mis en place chaque cas sur un serveur de test, et voici ce que ssh a affiché :
| Situation | Message | Ce que cela vous apprend |
|---|---|---|
| Règle de pare-feu réglée sur ignorer (drop) | Connection timed out | Rien n'a répondu |
| Règle de pare-feu réglée sur rejeter | Connection refused | Quelque chose a répondu non |
| Rien n'écoute sur le port | Connection refused | La machine a répondu non |
| Aucune route sur votre propre machine | Network is unreachable | Votre ordinateur n'a aucun chemin à essayer |
Regardez donc le réseau, pas sshd. Si vous obtenez un refus, allez à Connection refused.
Tester rapidement
Par défaut, vous pouvez attendre une minute ou plus à chaque échec. ConnectTimeout raccourcit l'attente :
ssh -o ConnectTimeout=5 user@203.0.113.10
Testez uniquement le port, sur Linux puis sur macOS :
nc -vz -w 5 203.0.113.10 22
nc -vz -G 5 203.0.113.10 22
Vérifiez ensuite ce que votre configuration utilise réellement pour ce nom :
ssh -G server | grep -E '^(hostname|port) '
Les causes, par ordre de probabilité
1. Un pare-feu cloud ou un groupe de sécurité vous bloque
Les pare-feu cloud abandonnent normalement, sans réponse, ce qu'ils n'autorisent pas. Vérifiez qu'une règle entrante autorise le port TCP 22 depuis votre adresse publique actuelle. Un piège courant : une règle pour une seule adresse, alors que l'adresse de votre domicile ou de votre bureau a changé.
Sur AWS, vérifiez aussi la table de routage du sous-réseau, la liste de contrôle d'accès réseau (network ACL) et si l'instance a une adresse publique, comme décrit dans le guide AWS ci-dessous. D'autres hébergeurs ont des réglages similaires sous d'autres noms.
2. L'adresse est fausse, ou la machine est éteinte
dig +short server
ping -c 3 203.0.113.10
Comparez le résultat avec l'adresse indiquée par votre hébergeur, qui peut changer après un arrêt et un redémarrage. Le ping seul prouve peu : de nombreux serveurs le bloquent, donc une absence de réponse ne veut pas dire que le serveur est arrêté. Vérifiez l'état de la machine dans la console de l'hébergeur.
3. Un pare-feu sur le serveur l'abandonne
Ceci montre si vos paquets arrivent jusqu'au serveur. Lancez-le depuis la console de l'hébergeur pendant que vous essayez de vous connecter :
sudo tcpdump -ni any 'tcp port 22'
- Aucun paquet : ils sont bloqués avant le serveur, vérifiez donc le pare-feu cloud, le routeur et la route.
- Des paquets arrivent, sans réponse : le pare-feu du serveur les abandonne, ou la réponse part par un autre chemin.
Listez les règles du serveur avec sudo iptables -L INPUT -n ou sudo nft list ruleset, et cherchez une règle drop sur le port 22.
4. Votre propre réseau bloque le port 22
Les hôtels, les bureaux et certains Wi-Fi publics bloquent le SSH sortant. L'indice : cela échoue sur un réseau et fonctionne sur un autre. Essayez un point d'accès de téléphone, ou essayez un autre serveur SSH depuis le même réseau.
5. Un problème de routage
traceroute -n 203.0.113.10
Des étoiles sur quelques sauts sont normales, car de nombreux routeurs ne répondent pas. Regardez où le chemin s'arrête pour de bon. Sous Linux, cette variante envoie du TCP vers le port 22, ce qui traverse plus de pare-feu, et elle demande root :
sudo traceroute -n -T -p 22 203.0.113.10
Si le serveur n'a pas d'adresse publique, vous ne pouvez pas l'atteindre directement depuis l'extérieur de son réseau privé. Utilisez un VPN ou un hôte de rebond.
Délai dépassé pendant la négociation
Ce message est différent :
Connection timed out during banner exchange
Connection to 203.0.113.10 port 22 timed out
Le port a accepté la connexion, mais aucun message d'accueil SSH n'est revenu à temps. Nous l'avons obtenu avec un écouteur de test qui acceptait la connexion puis restait silencieux, avec ConnectTimeout réglé. Le chemin réseau fonctionne donc. Regardez le serveur : une machine surchargée ou bloquée, un autre service que SSH sur ce port, ou un équipement intermédiaire qui retient la connexion. ConnectTimeout couvre aussi cette étape : une valeur très basse peut donc provoquer ce message sur un serveur lent.
Régler un délai dans votre configuration
Cela ne corrige rien, mais les échecs reviennent plus vite et les scripts ne restent pas bloqués :
Host *
ConnectTimeout 10
Pour d'autres réglages à garder par hôte, voyez ces exemples de fichier ssh config.
Questions
Quelle différence entre Connection timed out et Connection refused ?
Timed out signifie que rien n'a répondu, en général un pare-feu qui ignore les paquets. Refused signifie que quelque chose a répondu non : rien n'écoute sur ce port, ou un pare-feu rejette.
Comment faire échouer SSH plus vite ?
Utilisez ssh -o ConnectTimeout=5 utilisateur@serveur, ou ajoutez ConnectTimeout 10 sous Host * dans ~/.ssh/config.
Pourquoi SSH expire-t-il sur AWS ?
Le plus souvent, le groupe de sécurité n'a pas de règle entrante pour le port TCP 22 depuis votre adresse actuelle. Vérifiez aussi la network ACL, la table de routage et que l'instance a une adresse publique.