ssh: connect to host port 22: Connection refused, come risolvere

Il tuo computer ha raggiunto l'indirizzo, e l'altra parte ha risposto che su quella porta nessuno accetta connessioni. Di solito sshd non è in esecuzione, ascolta su un'altra porta o un altro indirizzo, oppure un firewall ti respinge. Sul server, sudo ss -tlnp mostra cosa è davvero in ascolto, su quale indirizzo e porta.

Aggiornata il . Ogni causa è stata riprodotta su un container Debian 13 usa e getta con OpenSSH 10.0, usando ListenAddress, iptables REJECT, ufw e un ban di fail2ban, con OpenSSH 10.3 su macOS e il client di Debian.

Cosa significa

ssh: connect to host 203.0.113.10 port 22: Connection refused

La connessione non è mai arrivata fino a SSH. Chiavi, password e utenti non c'entrano ancora, quindi non cambiarli. Un rifiuto è una risposta rapida e attiva, che ti dice qualcosa di utile: una macchina o un firewall su quel percorso sta rispondendo. Se non risponde nessuno, ottieni un errore diverso, trattato in Connection timed out.

Prima cosa: prova la porta dal tuo computer

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

La prima riga prova la porta senza SSH. La seconda mostra l'indirizzo e la porta che il tuo ~/.ssh/config assegna davvero a quel nome, e intercetta un errore di battitura o una voce vecchia. Se il tuo server usa un'altra porta, prova quella:

ssh -p 2222 user@203.0.113.10

Cause, in ordine di probabilità

1. sshd non è in esecuzione o non è installato

Per questo e per i controlli successivi serve un altro modo di entrare: la console del tuo provider, o l'accesso fisico.

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

Se ss non mostra nessuna riga sulla porta SSH, nulla è in ascolto. Su Ubuntu la riga può mostrare systemd invece di sshd: è ssh.socket che attende le connessioni, ed è tutto a posto. Un risultato sano è così:

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 comune per cui sshd non parte è un errore nella sua configurazione. Controlla il file, poi avvialo:

sudo sshd -t
sudo systemctl enable --now ssh

sshd -t non stampa nulla quando il file è valido. Se il servizio non esiste, installalo, per esempio con sudo apt install openssh-server.

2. sshd ascolta su un'altra porta

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

Confronta la porta con quella a cui ti connetti. sshd -T stampa la configurazione dopo aver letto tutti i file, compreso ciò che sta in /etc/ssh/sshd_config.d/.

Su Ubuntu 22.10 e successive, sshd può essere avviato da ssh.socket, quindi la porta di ascolto è impostata da systemd. Dopo aver cambiato Port, esegui sudo systemctl daemon-reload e sudo systemctl restart ssh.socket, poi verifica con ss che abbia effetto.

3. sshd ascolta su un altro indirizzo

Con ListenAddress 127.0.0.1 abbiamo ottenuto esattamente questo comportamento: la porta funziona dal server stesso ed è rifiutata da qualsiasi altro posto.

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

Guarda l'indirizzo locale nell'output di ss. 0.0.0.0 e [::] significano tutti gli indirizzi. Un solo indirizzo privato o di loopback significa che puoi connetterti solo attraverso quell'indirizzo. Per cambiarlo, modifica o rimuovi la riga ListenAddress e riavvia sshd.

Da fuori puoi raggiungerlo comunque passando da una macchina della stessa rete: vedi come usare ProxyJump e un jump host.

4. Un firewall rifiuta la connessione

Una regola del firewall impostata su reject dà lo stesso messaggio di una porta chiusa. L'abbiamo provato con una regola iptables REJECT mentre sshd era in esecuzione, e ssh ha stampato Connection refused. Una regola impostata su drop dà invece un timeout.

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

Usa quello che ha il tuo sistema. Per consentire SSH con ufw:

sudo ufw allow 22/tcp

Se ss sembra a posto e le connessioni locali funzionano, questa è la causa più probabile. Controlla anche il firewall del tuo provider o del router.

5. Il tuo indirizzo è bannato

Un ban di fail2ban è identico a questo errore. Su un server di prova Debian 13, un client bannato ha ricevuto Connection refused sia da ssh sia da nc. Un buon indizio è che il server funziona da un'altra rete, come l'hotspot del telefono. Controlla e togli il ban dal server:

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

Vedi la guida a fail2ban per la configurazione.

6. Raggiungi una macchina diversa

Se il DNS è vecchio, o un router inoltra la porta altrove, potresti star chiedendo all'host sbagliato. Confronta dig +short server con l'indirizzo mostrato dal provider. Sul server, questo mostra se la tua connessione arriva davvero:

sudo tcpdump -ni any 'tcp port 22'

Se non compare alcun pacchetto mentre ti connetti, il rifiuto viene da qualche parte prima di questo server.

Leggere insieme i risultati

Dal serverDal tuo computerCausa probabile
Nessuna riga sshd in ssRifiutatasshd è fermo o fallisce
sshd su un'altra portaRifiutata sulla 22Porta sbagliata
sshd solo su 127.0.0.1RifiutataListenAddress
sshd su 0.0.0.0:22RifiutataIl firewall rifiuta, o un ban
sshd su 0.0.0.0:22Funziona da un'altra reteUn ban o un blocco sulla tua rete

Se stai cambiando le impostazioni di sshd o del firewall su un server che raggiungi solo via SSH, tieni aperta la sessione attuale e prova con una seconda prima di uscire.

Domande

Cosa significa Connection refused in SSH?

Il tuo computer ha raggiunto l'indirizzo, e la macchina o un firewall ha risposto che su quella porta nessuno accetta connessioni. SSH non è mai partito, quindi chiavi e password non c'entrano.

Come controllo se sshd è in esecuzione?

Sul server esegui sudo systemctl status ssh (sshd sui sistemi Red Hat), poi sudo ss -tlnp per vedere indirizzi e porte su cui ascolta. Su Ubuntu la riga può mostrare systemd invece di sshd, ed è normale.

fail2ban può causare Connection refused?

Sì. Il suo blocco predefinito rifiuta le nuove connessioni dal tuo indirizzo. Se il server funziona da un'altra rete, controlla sudo fail2ban-client status sshd.

Fonti

Altro in Messaggi di errore

Tutte le guide