Estou recebendo erros “Connection refused” ou “Connection timed out” ao tentar me conectar à minha instância do EC2 com o SSH. Como resolvo isso?

Data da última atualização: 08/10/2021

Estou recebendo erros “Connection refused” ou “Connection timed out” ao tentar me conectar à minha instância do Amazon Elastic Compute Cloud (Amazon EC2) com o SSH. Como resolvo isso?

Breve descrição

Mensagem de erro: “ssh: conexão ao host ec2-X-X-X-X.compute-1.amazonaws.com porta 22: a conexão expirou”. Esta mensagem de erro vem do cliente SSH. O erro indica que o servidor não respondeu ao cliente e o programa cliente desistiu (expirou o tempo limite). A seguir estão as causas comuns para este erro:

  • O security group ou as ACLs de rede não permitem o acesso.
  • Há um firewall no sistema operacional da instância.
  • Existe um firewall entre o cliente e o servidor.
  • O host não existe.

Mensagem de erro: “ssh: conexão ao host ec2-X-X-X-X.compute-1.amazonaws.com porta 22: conexão recusada”. Esta mensagem vem de um host remotamente. A seguir estão as causas comuns para este erro:

  • O host chegou à instância, mas não havia serviço de escuta na porta SSH.
  • Um firewall bloqueou e foi configurado para rejeitar o pacote em vez de descartá-lo.

Resolução

Verifique o seguinte:

Há quatro métodos para realizar estas tarefas:

Método 1: usar o console de série do EC2

Se você configurar o console de série do EC2 para Linux, poderá usá-lo para solucionar problemas de tipos de instância baseados em Nitro compatíveis. O console serial ajuda na solução de problemas de inicialização, de configuração da rede e do SSH. Ele se conecta à instância sem a necessidade de uma conexão ativa à rede. Você pode acessar o console de série usando o console do Amazon EC2 ou a AWS Command Line Interface (AWS CLI).

Antes de usar o console de série, conceda acesso a ele no nível da conta. Depois, crie políticas do AWS Identity and Access Management (IAM) que concedam o acesso aos usuários do IAM. Além disso, todas as instâncias que usam o console precisam ter pelo menos um usuário com senha. Se não for possível estabelecer contato com a instância e você não tiver configurado o acesso ao console serial, siga as instruções nos Métodos 2, 3 ou 4. Para obter informações sobre como configurar o console de série do EC2 para Linux, consulte Configurar o acesso ao console de série do EC2.

Observação: se você receber erros ao executar comandos da AWS CLI, certifique-se de estar usando a versão mais recente da AWS CLI.

Método 2: use o gerenciador do AWS Systems Manager Session

Observação: a instalação do agente SSM é necessária para usar esse método. Para obter mais informações sobre o Session Manager e uma lista completa de pré-requisitos, consulte Configuração do Session Manager.

1.    Abra o console do AWS Systems Manager.

2.    Inicie uma sessão.

3.    Adicione a seguinte linha adicional na parte superior da tabela de regras e reinicie o serviço SSH:

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

Ou, você pode desabilitar o firewall. É uma prática recomendada usar grupos de segurança em vez de um firewall.

Para desabilitar o firewall, use um dos seguintes conjuntos de comandos, dependendo do sistema operacional:

Ubuntu usando firewall descomplicado

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

Distribuições que usam firewalld (por exemplo, Red Hat ou CentOS)

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

Observação: o comando anterior libera todas as regras principais do iptables e adiciona uma que permite conexões SSH de entrada. Leve isso em consideração antes de executar estes comandos, pois você pode ter outras regras necessárias para sua configuração. Depois de obter acesso novamente à instância, verifique a configuração do firewall (por exemplo, UFW, firewalld, iptables).

4.    Verifique se o SSH está em execução e verifique se a porta SSH TCP (22) está em um estado de escuta.

$ 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))

Observação: se o sistema não tiver o comando ss, você poderá usar o comando netstat legado com a mesma sintaxe mostrada no exemplo anterior.

5.    Encerrar a sessão.

6.    Estabeleça conexão à instância usando SSH.

Método 3: execute o documento de automação AWS Support-TroubleshootSSH

O documento de automação AWS Support-TroubleshootSSH instala a ferramenta Amazon EC2Rescue na instância. Ela confere e soluciona alguns problemas que podem causar erros de conexão remota ao se conectar a uma máquina Linux pelo SSH. Para obter mais informações, consulte Como posso usar o fluxo de trabalho de automação AWSSupport-TroubleshootSSH para solucionar problemas de conexão SSH?

Método 4: usar um script de dados do usuário

Importante

  • Este procedimento requer a interrupção e o início da instância do EC2. Observe que, se a instância tiver um backup no armazenamento de instâncias ou se ela tiver volumes do armazenamento com dados, os dados serão perdidos quando a instância for interrompida. Para obter mais informações, consulte Determinar o tipo de dispositivo raiz da instância.
  • Se a instância fizer parte de um grupo do Amazon EC2 Auto Scaling ou se a instância for executada por serviços que usam o AWS Auto Scaling, como o Amazon EMR, AWS CloudFormation, AWS Elastic Beanstalk e assim por diante, a interrupção da instância poderá encerrar a instância. O encerramento da instância neste cenário depende das configurações de proteção de expansão da instância para o grupo do Auto Scaling. Se a instância fizer parte de um grupo de Auto Scaling, remova temporariamente a instância do grupo Auto Scaling antes de iniciar as etapas de resolução.
  • Interromper e iniciar a instância altera o endereço IP público da instância. Uma prática recomendada é usar um endereço IP elástico em vez de um público ao rotear o tráfego externo para sua instância.

1.    Veja os logs do console da instância do EC2. Caso o UFW esteja ativado, a seguinte entrada aparece nos logs da instância EC2.

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

2.    Abra oconsole do Amazon EC2.

3.    Escolha instâncias no painel de navegação e selecione a instância à qual você está tentando se conectar.

4.    Interrompa a instância.

5.    Escolha Ações, Configurações da instância, Editar dados do usuário.

6.    Copie o seguinte script de dados do usuário na caixa de diálogo Editar dados do usuário e escolha Salvar.

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
--//

Observação: o comando precedente envia todas as principais regras iptables, não só as regras para a porta 22. Depois de obter acesso novamente à instância, verifique a configuração do firewall (por exemplo, UFW, firewalld, iptables).

7.    Estabeleça conexão à instância usando SSH.

8.    Este script é executado em todas as reinicializações da instância. Depois de recuperar o acesso à instância, remova o script de dados do usuário.

Para remover dados do usuário:

1.    Conclua as etapas 1–4 na seção Método 4: usar um script de dados do usuário.

2.    Exclua o script de dados do usuário na caixa de diálogo Editar dados do usuário.