Risolvere Velocemente gli Errori di Connessione SSH Rifiutata
Risolvi gli errori di connessione SSH rifiutata controllando lo stato di sshd, le porte, le regole del firewall, sshd_config, SELinux e i log del server.
Risolvere Velocemente gli Errori di Connessione SSH Rifiutata
SSH (Secure Shell) è la spina dorsale della gestione remota dei server, consentendo una comunicazione sicura e crittografata tra la tua macchina locale e un server remoto. Tuttavia, incontrare un errore ssh: connect to host <INDIRIZZO_IP> port 22: Connection refused può essere un ostacolo frustrante che ti impedisce di accedere ai tuoi sistemi cruciali.
Questo articolo fornisce una guida completa e passo-passo per diagnosticare e risolvere il comune errore 'Connection Refused'. Esploreremo le cause principali, dai demoni SSH inattivi a firewall mal configurati e impostazioni del server errate, fornendoti le conoscenze e i comandi per riconquistare rapidamente l'accesso ai tuoi server.
Comprendere l'Errore 'Connection Refused'
Quando ricevi un errore Connection refused, significa che il tuo client SSH ha raggiunto con successo il server remoto, ma il server ha esplicitamente rifiutato la connessione sulla porta specificata. Questo è diverso da un errore Connection timed out (dove il client non ha potuto raggiungere il server) o da un errore No route to host (dove il percorso di rete è interrotto).
Lo stato "rifiutato" indica direttamente un problema lato server che impedisce attivamente al servizio SSH di accettare connessioni. Ciò coinvolge tipicamente il demone SSH non in esecuzione, un firewall che blocca la connessione o una configurazione errata all'interno del servizio SSH stesso.
Cause Comuni del 'Connection Refused'
Diversi fattori possono portare al rifiuto di una connessione SSH. Comprenderli aiuta a restringere il processo di risoluzione dei problemi:
- Demone SSH (
sshd) Non in Esecuzione: La causa più comune. Il processo del server SSH potrebbe essersi bloccato, essere stato fermato o non essere riuscito ad avviarsi all'avvio. - Firewall che Blocca la Porta 22 (o porta personalizzata): Il firewall del server (es. UFW, firewalld, iptables) impedisce le connessioni in entrata sulla porta SSH.
- Configurazione Errata del Demone SSH: Il file
sshd_configpotrebbe essere configurato male, portando il demone SSH ad ascoltare su una porta diversa, su un'interfaccia di rete sbagliata o a rifiutare connessioni per utenti/metodi specifici. - Problemi di Connettività di Rete (Meno Comuni per 'Refused'): Sebbene meno probabile per un errore "rifiutato", un problema di rete fondamentale potrebbe talvolta manifestarsi inaspettatamente.
- Restrizioni SELinux o AppArmor: Miglioramenti della sicurezza come SELinux o AppArmor potrebbero impedire a
sshddi funzionare correttamente, specialmente dopo configurazioni personalizzate o modifiche al sistema.
Guida alla Risoluzione dei Problemi Passo-Passo
Immergiamoci nei passaggi pratici per diagnosticare e risolvere l'errore 'Connection Refused'.
Passo 1: Verificare lo Stato del Demone SSH sul Server
La prima cosa da controllare è se il demone del server SSH (sshd) è effettivamente in esecuzione sulla tua macchina remota. Di solito avrai bisogno dell'accesso alla console (es. tramite la console del provider cloud o una connessione fisica) per eseguire questi controlli se SSH è completamente inaccessibile.
- Controllare lo Stato del Demone SSH:
Sulla maggior parte delle distribuzioni Linux moderne (quelle che usano
systemdcome Ubuntu, CentOS 7+, Debian 8+):sudo systemctl status sshd
Su Debian/Ubuntu, il servizio potrebbe chiamarsi ssh:
sudo systemctl status ssh
```
Se sshd non è in esecuzione, l'output indicherà inactive (dead) o uno stato simile.
- Avviare il Demone SSH:
Se lo stato è inattivo, prova ad avviare il servizio:
sudo systemctl start sshd
Oppure su Debian/Ubuntu:
sudo systemctl start ssh ```
- Abilitare il Demone SSH all'Avvio:
Per assicurarti che SSH si avvii automaticamente dopo un riavvio, abilitalo:
sudo systemctl enable sshd
Oppure su Debian/Ubuntu:
sudo systemctl enable ssh ```
- Controllare i Log del Demone SSH:
Se
sshdnon riesce ad avviarsi, i suoi log possono fornire indizi cruciali. Per i sistemisystemd:sudo journalctl -u sshd --since "10 minutes ago"
Oppure, se la tua distribuzione usa l'unità ssh:
sudo journalctl -u ssh --since "10 minutes ago"
In alternativa, controlla i log di autenticazione generali: bash
sudo tail -f /var/log/auth.log
# Oppure per RHEL/CentOS:
sudo tail -f /var/log/secure
```
Passo 2: Controllare le Regole del Firewall
Un firewall lato server è spesso il colpevole dei rifiuti di connessione. Potrebbe bloccare la porta SSH predefinita (22) o una porta personalizzata che stai cercando di utilizzare. Devi assicurarti che il firewall permetta le connessioni in entrata sulla porta SSH.
Identificare il Tuo Firewall: I firewall comuni includono:
- UFW (Uncomplicated Firewall): Comune su Ubuntu/Debian.
- firewalld: Comune su CentOS/RHEL 7+.
- iptables: Il firewall sottostante per Linux, configurato direttamente o tramite interfacce.
Controllare Stato e Regole del Firewall:
- UFW:
Cerca regole che permettano il traffico sullasudo ufw status verboseporta 22(o sulla tua porta SSH personalizzata). Se SSH è elencato, assicurati che siaALLOW(consentito). - firewalld:
Controlla le sezionisudo firewall-cmd --list-allserviceseportspersshoporta 22/tcp. - iptables:
Questo output può essere complesso. Cerca regolesudo iptables -L -v -nDROPoREJECTrelative atcp dpt:22(o alla tua porta personalizzata) nella catenaINPUT.
- UFW:
Permettere la Porta SSH attraverso il Firewall:
- UFW:
sudo ufw allow ssh # Permette la porta 22 # Oppure, per una porta personalizzata (es. 2222): sudo ufw allow 2222/tcp sudo ufw enable # Se UFW è inattivo - firewalld:
sudo firewall-cmd --permanent --add-service=ssh # Oppure, per una porta personalizzata (es. 2222): sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --reload - iptables:
Aggiungere regole
iptablesdirettamente è più complesso e temporaneo a meno che non vengano salvate. Generalmente si consiglia di usarefirewalldoufwse disponibili. Per un test rapido (non persistente):sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Dovrai salvare queste regole se vuoi che persistano dopo i riavvii.
Attenzione: Fai attenzione quando modifichi le regole del firewall, specialmente quando ti connetti in SSH a un server remoto. Regole errate possono bloccarti permanentemente. Verifica sempre che le tue modifiche funzionino prima di chiudere la sessione SSH corrente, se ne hai una aperta.
- UFW:
Passo 3: Verificare la Configurazione SSH (sshd_config)
Il file di configurazione del demone SSH (/etc/ssh/sshd_config) determina come opera il servizio. Configurazioni errate qui possono portare al rifiuto delle connessioni.
Individuare
sshd_config: Il file di configurazione principale si trova solitamente in/etc/ssh/sshd_config.Ispezionare le Impostazioni Chiave: Apri il file con un editor di testo (es.
nano,vi):sudo nano /etc/ssh/sshd_configCerca le seguenti direttive:
Port: Specifica la porta su cuisshdascolta. Assicurati che corrisponda alla porta a cui stai cercando di connetterti dal tuo client. Se è commentata (#), il valore predefinito è la porta 22.ListenAddress: Se presente, specifica quali indirizzi IPsshddeve ascoltare. Se è impostato su un IP interno (es.127.0.0.1) e ti stai connettendo da una rete esterna, rifiuterà la connessione. Per ascoltare su tutte le interfacce, di solito è commentato o impostato su0.0.0.0o::(per IPv6).PermitRootLogin: Se impostato suno, non potrai accedere come root. Sebbene non sia un "connection refused" in senso stretto (spesso è un permesso negato dopo la connessione), può impedire tentativi di login riusciti.PasswordAuthentication: Se impostato suno, l'autenticazione tramite password è disabilitata, richiedendo l'autenticazione tramite chiave.
Consiglio: Dopo aver apportato modifiche a
sshd_config, devi riavviare il servizio SSH per farle effetto:sudo systemctl restart sshd
Passo 4: Connettività di Rete (Controllo di Base)
Sebbene un "connection refused" significhi tipicamente che il server è stato raggiunto, è sempre bene confermare rapidamente la raggiungibilità di rete di base dalla tua macchina client all'indirizzo IP del server.
Eseguire il Ping del Server: Dalla tua macchina client, prova a eseguire il ping dell'indirizzo IP o del nome host del server:
ping <INDIRIZZO_IP_O_NOME_HOST_SERVER>Se il ping fallisce (perdita di pacchetti al 100%), hai un problema di rete più fondamentale (es. IP errato, server offline, problema di routing di rete) che deve essere risolto prima di SSH.
Usare
ncotelnet(dal client): Per testare se la porta è aperta e in ascolto dal punto di vista del client:# Usando netcat (nc) nc -zv <INDIRIZZO_IP_SERVER> 22 # Usando telnet telnet <INDIRIZZO_IP_SERVER> 22Se
ncmostraConnection refusedotelnetesce immediatamente, conferma che il server sta rifiutando attivamente su quella porta, riconducendo al demone SSH o al firewall.
Passo 5: Controllare SELinux o AppArmor (Avanzato)
In alcuni ambienti hardened, o dopo configurazioni personalizzate, SELinux (Security-Enhanced Linux) o AppArmor potrebbero impedire a sshd di funzionare correttamente, specialmente se stai usando una porta SSH non standard.
Controllare lo Stato di SELinux:
sestatusSe SELinux è
enforcing, potresti dover regolare le sue policy per permettere asshdsu una porta personalizzata. Ad esempio, per permettere la porta 2222 per SSH:sudo semanage port -a -t ssh_port_t -p tcp 2222 sudo systemctl restart sshd(Installa
semanagese non disponibile:sudo apt install policycoreutils-python-utilssu Debian/Ubuntu,sudo yum install policycoreutils-python-utilso il pacchetto corrispondente per la tua release della famiglia RHEL).Controllare lo Stato di AppArmor:
sudo aa statusSe AppArmor è
enforcing, esamina i suoi log (/var/log/syslogodmesg) per eventuali rifiuti relativi asshd.
Passo 6: Rivedere i Log del Server (Ancora)
Dopo aver tentato i passaggi precedenti, ricontrolla sempre i log del server per eventuali nuovi messaggi di errore relativi a sshd. Questa è la tua fonte di verità definitiva su ciò che il server sta sperimentando.
sudo journalctl -u sshdsudo tail -f /var/log/auth.log(o/var/log/secure)
Cerca messaggi che indichino perché il servizio potrebbe non avviarsi, perché le connessioni vengono interrotte o qualsiasi altra informazione rilevante.
Migliori Pratiche per Prevenire Problemi Futuri
- Aggiornare Regolarmente il Tuo Sistema Operativo: Mantieni aggiornati il sistema operativo del server e i pacchetti, incluso
openssh-server. - Testare le Regole del Firewall: Dopo aver implementato o modificato le regole del firewall, testale sempre immediatamente.
- Eseguire il Backup di
sshd_config: Prima di apportare modifiche a/etc/ssh/sshd_config, esegui un backup (sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak). - Usare una Console di Gestione: Per le istanze cloud, sappi come accedere alla console del server (es. AWS EC2 Serial Console, Google Cloud Console) per risolvere i problemi di rete quando SSH non è disponibile.
- Monitorare i Log: Rivedi regolarmente i log
auth.logosecureper attività insolite o errori persistenti.
Conclusione Finale
Un errore di connessione SSH rifiutata di solito significa che il server è raggiungibile ma nulla sta accettando la tua connessione su quella porta. Controlla il nome del servizio SSH per la tua distribuzione, conferma che la porta sia in ascolto, apri il firewall, valida sshd_config e leggi i log prima di apportare modifiche più grandi. Se hai ancora una sessione di lavoro aperta, mantienila aperta finché un nuovo login non riesce.