Quando provo a connettermi all’istanza EC2 con SSH ricevo gli errori "Connection refused" o "Connection timed out". Come posso risolvere questo problema?

Ultimo aggiornamento: 08/10/2021

Quando provo a connettermi all'istanza Amazon Elastic Compute Cloud (Amazon EC2) tramite SSH, ricevo gli errori "Connessione rifiutata" o "Connessione scaduta". Come posso risolvere questo problema?

Breve descrizione

Messaggio di errore: "ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connessione scaduta". Questo messaggio di errore viene dal client SSH. L'errore indica che il server non ha risposto al client e il programma client non è riuscito (scaduto). Di seguito sono riportate le cause più comuni di questo errore:

  • Il gruppo di sicurezza o la lista di controllo degli accessi di rete non permettono l'accesso.
  • Esiste un firewall sul sistema operativo dell'istanza.
  • Esiste un firewall tra il client e il server.
  • L'host non esiste.

Messaggio di errore: "ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connessione rifiutata". Questo messaggio proviene da un host in remoto. Di seguito sono riportate le cause più comuni di questo errore:

  • L'host ha raggiunto l'istanza ma non c'era alcun servizio in ascolto sulla porta SSH.
  • Un firewall è stato bloccato ed è stato impostato per rifiutare il pacchetto piuttosto che rilasciarlo.

Risoluzione

Verifica quanto segue:

Esistono quattro metodi per eseguire questi processi:

Metodo 1: utilizza la Console seriale EC2

Se configuri la Console seriale EC2 per Linux, puoi utilizzarla per risolvere i problemi relativi ai tipi di istanze basate su Nitro supportati. La console seriale ti permette di risolvere problemi di avvio, di configurazione di rete e di configurazione di SSH. La console seriale si connette all'istanza senza bisogno di una connessione di rete funzionante. Puoi accedere alla console seriale utilizzando la console Amazon EC2 o l'AWS Command Line Interface (AWS CLI).

Prima di utilizzare la console seriale, concedi l'accesso a livello di account. Quindi crea le policy AWS Identity and Access Management (IAM) consentendo l'accesso agli utenti IAM. Inoltre, ogni istanza che utilizza la console seriale deve includere almeno un utente basato su password. Se l'istanza non è raggiungibile e non hai configurato l'accesso alla console seriale, segui le istruzioni del Metodo 2, 3 o 4. Per informazioni sulla configurazione della Console seriale EC2 per Linux, consulta Configura l'accesso alla Console seriale EC2.

Nota: se ricevi un messaggio di errore durante l'esecuzione dei comandi AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

Metodo 2: utilizza Session Manager di AWS Systems Manager

Nota: per utilizzare questo metodo è necessaria l'installazione di SSM Agent. Per ulteriori informazioni su Session Manager e un elenco completo dei prerequisiti, consulta Impostazione di Session Manager.

1.    Apri la console di AWS Systems Manager.

2.    Avvia una sessione.

3.    Aggiungi la seguente riga aggiuntiva nella parte superiore della tabella delle regole, quindi riavvia il servizio SSH:

$ sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
$ sudo service sshd restart

In alternativa, puoi disattivare il firewall. È una best practice utilizzare gruppi di sicurezza anziché un firewall.

Per disattivare il firewall, utilizza uno dei seguenti set di comandi, a seconda del sistema operativo in uso:

Ubuntu che utilizza Uncomplicated Firewall

$ sudo iptables -F
$ sudo iptables -P INPUT ACCEPT
$ sudo ufw disable

Distribuzioni che utilizzano firewalld (ad esempio Red Hat o CentOS)

$ sudo iptables -F
$ sudo iptables -P INPUT ACCEPT
$ sudo systemctl disable firewalld

Nota: il comando precedente elimina tutte le regole principali di iptables e ne aggiunge una che permette le connessioni SSH in entrata. Considera questo aspetto prima di eseguire questi comandi, poiché potresti avere altre regole necessarie per la configurazione. Una volta riottenuto l'accesso all'istanza, rivedi la configurazione del firewall (per esempio, UFW, firewalld, iptables).

4.    Assicurati che SSH sia in esecuzione e verifica che la porta SSH TCP (22) sia in stato di ascolto.

$ sudo systemctl restart sshd
$ sudo ss -tpln | grep -E '22|ssh'
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1901,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1901,fd=4))

Nota: se il sistema non dispone del comando ss, puoi utilizzare il comando netstat legacy con la stessa sintassi mostrata nell'esempio precedente.

5.    Termina la sessione.

6.    Connettiti all'istanza utilizzando SSH.

Metodo 3: esegui il documento di automazione AWSSupport-TroubleshootSSH

Il documento di automazione AWSSupport-TroubleshootSSH installa lo strumento Amazon EC2Rescue sull'istanza. Questo strumento controlla e corregge i problemi che causano gli errori di connessione remota quando si effettua la connessione ad una macchina Linux tramite SSH. Per ulteriori informazioni, consulta Ricevo errori quando provo a connettermi alla mia istanza EC2 utilizzando SSH. Come posso utilizzare il flusso di lavoro di automazione AWSSupport-TroubleshootSSH per risolvere i problemi di connessione SSH?

Metodo 4: utilizza uno script di dati utente

Importante

  • Questa procedura richiede l'arresto e l'avvio dell'istanza EC2. Ricorda che se l'istanza è supportata da un archivio istanza o ha volumi di archivio istanza contenenti dati, i dati andranno persi quando l'istanza verrà arrestata. Per ulteriori informazioni, consulta Determinazione del tipo di dispositivo root dell'istanza.
  • Se l'istanza fa parte di un gruppo Amazon EC2 Auto Scaling o se l'istanza viene avviata da servizi che utilizzano AWS Auto Scaling, come Amazon EMR, AWS CloudFormation, AWS Elastic Beanstalk e così via, l'arresto dell'istanza potrebbe terminare l'istanza. La terminazione dell'istanza in questo scenario dipende dalle impostazioni di protezione con scalabilità in base all'istanza per il gruppo Auto Scaling. Se l'istanza fa parte di un gruppo Auto Scaling, rimuovi temporaneamente l'istanza dal gruppo Auto Scaling prima di iniziare i passaggi di risoluzione.
  • L'arresto e l'avvio dell'istanza modificano l'indirizzo IP pubblico dell'istanza. È una best practice l'utilizzo di un indirizzo IP elastico al posto di un indirizzo IP pubblico quando si effettua il routing del traffico esterno verso l'istanza.

1.    Visualizza i registri della console dell'istanza EC2. La voce seguente appare nei registri della console dell'istanza EC2 se UFW è abilitato.

systemd[1] : starting Uncomplicated Firewall
Starting Uncomplicated firewall...

2.    Apri la console di Amazon EC2.

3.    Scegli Istanze dal pannello di navigazione, quindi seleziona l'istanza a cui stai tentando di connetterti.

4.    Arresta l'istanza.

5.    Scegli Operazioni, Impostazioni istanza, Modifica dati utente.

6.    Copia il seguente script di dati utente nella finestra di dialogo Modifica dati utente, quindi scegli Salva.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type:
    text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
iptables -F
service sshd restart
--//

Nota: il comando precedente scarica tutte le principali regole iptables, non solo quelle per la porta 22. Una volta riottenuto l'accesso all'istanza, rivedi la configurazione del firewall (per esempio, UFW, firewalld, iptables).

7.    Connettiti all'istanza utilizzando SSH.

8.    Il precedente script di dati utente è impostato per funzionare su ogni riavvio di istanza. Dopo aver riottenuto l'accesso all'istanza, rimuovi lo script dei dati utente.

Per rimuovere i dati utente:

1.    Completa i passaggi da 1 a 4 nella sezione Metodo 4: utilizza uno script di dati utente.

2.    Elimina lo script di dati utente nella finestra di dialogo Modifica dati utente.