ssh: connect to host port 22: Operation timed out / Connection timed out, come risolvere

Il tuo tentativo di connessione non ha ricevuto alcuna risposta. Qualcosa lungo il percorso lo ha scartato in silenzio, di solito un firewall del cloud o un security group, oppure l'indirizzo è sbagliato o la macchina è spenta. Esegui nc -vz 203.0.113.10 22, poi controlla sul server se i pacchetti arrivano. macOS dice Operation timed out e Linux dice Connection timed out. Sono lo stesso errore.

Aggiornata il . Riprodotto con OpenSSH 10.3 su macOS verso un indirizzo di prova irraggiungibile, e con OpenSSH 10.0 su Debian 13 usando una regola iptables DROP.

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:

SituazioneMessaggioCosa ti dice
Regola del firewall impostata su dropConnection timed outNessuno ha risposto
Regola del firewall impostata su rejectConnection refusedQualcuno ha risposto no
Niente in ascolto sulla portaConnection refusedLa macchina ha risposto no
Nessuna rotta sul tuo computerNetwork is unreachableIl 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.

Fonti

Altro in Messaggi di errore

Tutte le guide