Il messaggio
Su macOS:
ssh: connect to host 203.0.113.10 port 22: Operation timed out
Su Linux:
ssh: connect to host 203.0.113.10 port 22: Connection timed out
Il tuo computer ha inviato una richiesta di apertura della connessione e non ha sentito nulla in risposta. SSH non è mai partito, quindi chiavi e password non c'entrano.
Come si distingue da Connection refused
Abbiamo preparato ogni caso su un server di prova, ed ecco cosa ha stampato ssh:
| Situazione | Messaggio | Cosa ti dice |
|---|---|---|
| Regola del firewall impostata su drop | Connection timed out | Nessuno ha risposto |
| Regola del firewall impostata su reject | Connection refused | Qualcuno ha risposto no |
| Niente in ascolto sulla porta | Connection refused | La macchina ha risposto no |
| Nessuna rotta sul tuo computer | Network is unreachable | Il tuo computer non ha un percorso da provare |
Quindi guarda la rete, non sshd. Se ottieni un rifiuto, vai a Connection refused.
Prova rapida
Per impostazione predefinita puoi aspettare un minuto o più per ogni fallimento. ConnectTimeout accorcia l'attesa:
ssh -o ConnectTimeout=5 user@203.0.113.10
Prova solo la porta, prima su Linux e poi su macOS:
nc -vz -w 5 203.0.113.10 22
nc -vz -G 5 203.0.113.10 22
Poi controlla cosa usa davvero la tua configurazione per quel nome:
ssh -G server | grep -E '^(hostname|port) '
Cause, in ordine di probabilità
1. Un firewall del cloud o un security group ti blocca
I firewall del cloud normalmente scartano ciò che non consentono, senza rispondere. Controlla che una regola in ingresso consenta la porta TCP 22 dal tuo indirizzo pubblico attuale. Una trappola comune è una regola per un solo indirizzo, dopo che il tuo indirizzo di casa o dell'ufficio è cambiato.
Su AWS, controlla anche la tabella di routing della subnet, la network ACL e se l'istanza ha un indirizzo pubblico, come descritto nella guida AWS qui sotto. Gli altri provider hanno impostazioni simili con altri nomi.
2. L'indirizzo è sbagliato o la macchina è spenta
dig +short server
ping -c 3 203.0.113.10
Confronta il risultato con l'indirizzo mostrato dal tuo provider, che può cambiare dopo uno stop e uno start. Il solo ping prova poco: molti server lo bloccano, quindi nessuna risposta non significa che il server sia spento. Controlla lo stato della macchina nella console del provider.
3. Un firewall sul server lo scarta
Questo mostra se i tuoi pacchetti arrivano al server. Eseguilo dalla console del provider mentre provi a connetterti:
sudo tcpdump -ni any 'tcp port 22'
- Nessun pacchetto: sono bloccati prima del server, quindi controlla il firewall del cloud, il router e la rotta.
- I pacchetti arrivano, nessuna risposta: il firewall del server li scarta, oppure la risposta esce da un'altra strada.
Elenca le regole del server con sudo iptables -L INPUT -n o sudo nft list ruleset e cerca una regola drop sulla porta 22.
4. La tua rete blocca la porta 22
Hotel, uffici e alcune reti Wi-Fi pubbliche bloccano l'SSH in uscita. L'indizio è che fallisce su una rete e funziona su un'altra. Prova l'hotspot del telefono, o prova un altro server SSH dalla stessa rete.
5. Un problema di routing
traceroute -n 203.0.113.10
Gli asterischi su alcuni salti sono normali, perché molti router non rispondono. Guarda dove il percorso si ferma definitivamente. Su Linux, questa variante invia TCP alla porta 22, che passa attraverso più firewall, e richiede root:
sudo traceroute -n -T -p 22 203.0.113.10
Se il server non ha un indirizzo pubblico, non puoi raggiungerlo direttamente da fuori dalla sua rete privata. Usa una VPN o un jump host.
Timeout durante l'handshake
Questo messaggio è diverso:
Connection timed out during banner exchange
Connection to 203.0.113.10 port 22 timed out
La porta ha accettato la connessione, ma il saluto SSH non è arrivato in tempo. L'abbiamo ottenuto da un listener di prova che accettava la connessione e poi restava in silenzio, con ConnectTimeout impostato. Quindi il percorso di rete funziona. Guarda il server: una macchina sovraccarica o bloccata, un servizio diverso da SSH su quella porta, o un dispositivo intermedio che trattiene la connessione. ConnectTimeout copre anche questa fase, quindi un valore molto basso può causare il messaggio su un server lento.
Imposta un timeout nella tua configurazione
Non risolve nulla, ma i fallimenti arrivano più in fretta e gli script non si bloccano:
Host *
ConnectTimeout 10
Per altre impostazioni da tenere per ogni host, guarda questi esempi di file ssh config.
Domande
Che differenza c'è tra Connection timed out e Connection refused?
Timed out vuol dire che non ha risposto nessuno, di solito un firewall che scarta i pacchetti. Refused vuol dire che qualcosa ha risposto di no: nessun servizio su quella porta, o un firewall che rifiuta.
Come faccio fallire SSH più in fretta?
Usa ssh -o ConnectTimeout=5 utente@server, oppure metti ConnectTimeout 10 sotto Host * in ~/.ssh/config.
Perché SSH va in timeout su AWS?
Quasi sempre il security group non ha una regola in entrata per la porta TCP 22 dal tuo indirizzo attuale. Controlla anche la network ACL, la tabella di routing e che l'istanza abbia un indirizzo pubblico.