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 server | Dal tuo computer | Causa probabile |
|---|---|---|
Nessuna riga sshd in ss | Rifiutata | sshd è fermo o fallisce |
| sshd su un'altra porta | Rifiutata sulla 22 | Porta sbagliata |
sshd solo su 127.0.0.1 | Rifiutata | ListenAddress |
sshd su 0.0.0.0:22 | Rifiutata | Il firewall rifiuta, o un ban |
sshd su 0.0.0.0:22 | Funziona da un'altra rete | Un 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
- sshd_config(5), manuale OpenBSD
- sshd(8), manuale OpenBSD
- sshd now uses socket-based activation, Ubuntu