Recibo errores como “Connection refused” (Conexión rechazada) o “Connection timed out” (Conexión terminada) cuando intento conectar mi instancia EC2 con SSH. ¿Cómo se soluciona esto?

Última actualización: 28-10-2022

Recibo errores como “Connection refused” (Conexión rechazada) o “Connection timed out” (Conexión terminada) cuando intento conectarme a mi instancia de Amazon Elastic Compute Cloud (Amazon EC2) con SSH.

Descripción corta

Mensaje de error: “ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection timed out” (ssh: conectarse al alojamiento ec2-X-X-X-X.compute-1.amazonaws.com puerto 22: tiempo de espera de conexión agotado). Este mensaje de error proviene del cliente de SSH. El error indica que el servidor no respondió al cliente y que el programa del cliente expiró (se agotó el tiempo de espera). A continuación se muestran las causas comunes de este error:

  • El grupo de seguridad o la ACL de red no permiten el acceso.
  • Hay un firewall en el sistema operativo de la instancia.
  • Hay un firewall entre el cliente y el servidor.
  • El host no existe.

Mensaje de error: “ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection timed out” (ssh: conectarse al host ec2-X-X-X-X.compute-1.amazonaws.com puerto 22: conexión rechazada). Este mensaje proviene de un host de forma remota. A continuación se muestran las causas comunes de este error:

  • El alojamiento llegó a la instancia, pero no había ningún servicio escuchando en el puerto SSH.
  • Se bloqueó un firewall y se configuró para rechazar el paquete en lugar de eliminarlo.

Resolución

Para el error “Connection timed out” (Se agotó el tiempo de espera de la conexión), compruebe lo siguiente:

Nota: Los dos últimos pasos de verificación requieren acceso a la instancia a nivel de sistema operativo.

Para el error “Connection refused” (Conexión rechazada), compruebe lo siguiente

  • No hay ningún firewall en la instancia que rechace la conexión SSH.
  • El daemon SSH (sshd) se ejecuta y se escucha en el puerto 22.

Nota: Ambos pasos de verificación requieren un acceso a la instancia a nivel de sistema operativo.

Si la instancia aprueba ambas comprobaciones de estado, use uno de los cuatro métodos siguientes de la lista con su configuración

  • Método 1: utilice la consola serie de EC2 para Linux.
  • Método 2: utilice AWS System Manager Session Manager.
  • Método 3: ejecute el runbook de automatización AWSSupport-TroubleshootSSH
  • Método 4: utilice un script de datos de usuario.

Método 1: utilice la consola serie de EC2 para Linux

Si está configurada, puede usar la consola serie de EC2 para Linux a fin de solucionar problemas a nivel del sistema operativo en los tipos de instancias compatibles basados en Nitro. La consola serie lo ayuda a resolver los problemas de arranque, configuración de red y configuración de SSH. Puede acceder a la consola serie mediante la consola de Amazon EC2 o la Interfaz de la línea de comandos de AWS (AWS CLI).

Antes de utilizar la consola serie, conceda accesoa esta a nivel de cuenta. A continuación, cree políticas de AWS Identity and Access Management (IAM) que concedan acceso a sus usuarios de IAM.

Nota: Cada instancia que utilice la consola en serie debe incluir al menos un usuario de Linux basado en contraseña con acceso sudo.

Para obtener más información sobre cómo configurar la consola serie de EC2 para Linux, consulte Configurar el acceso a la consola serie de EC2. Si no hay una cuenta de Linux con una contraseña de inicio de sesión configurada, debe ejecutar ssm-user para restablecer la contraseña de una cuenta con acceso sudo. Para obtener más información sobre la ejecución de los comandos ssm-user, consulte la sección Administración de permisos de cuentas ssm-user sudo en Linux y macOS.

Tras terminar con la configuración, conéctese a la instancia de EC2 a través de la consola serie de EC2 mediante un usuario de Linux configurado con contraseña.

A continuación, ejecute los siguientes comandos: Estos comandos verifican que las conexiones SSH no estén bloqueadas por el firewall del sistema operativo o el envoltorio TCP. Los comandos también verifican que el servicio sshd se esté ejecutando y escuchando en el puerto 22.

1.    Si tiene configuradas reglas de iptables, ejecute el siguiente comando para agregar una regla en iptables que acepte todas las conexiones SSH del puerto 22 predeterminado:

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

Dado que se recomienda utilizar grupos de seguridad en lugar de un firewall basado en el sistema operativo, el firewall se puede desactivar por completo. Para desactivar el firewall basado en sistema operativo, utilice uno de los siguientes conjuntos de comandos, según su sistema operativo:

Importante: Los siguientes comandos vacían todas las reglas principales de iptables. También agregan una regla que permite las conexiones SSH entrantes. Además, cambian la política predeterminada de la cadena principal a ACCEPT (Aceptar) para que el vaciado de la regla de iptables no afecte a la conectividad de la red de la instancia. Como estos comandos vacían todos los iptables principales, también borran cualquier regla existente.

Distribuciones que usan UFW (Ubuntu, Debian)

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

Distribuciones que usan firewalld (Red Hat, CentOS)

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

Nota: Después de recuperar el acceso a la instancia, revise la configuración del firewall (UFW, firewalld, iptables).

2.    Verifique que SSH se esté ejecutando y compruebe que el puerto TCP SSH (22) esté en estado de escucha:

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

Nota: Si su sistema no tiene el comando ss, puede usar el comando netstat heredado con la misma sintaxis que se muestra en el ejemplo anterior.

3.    Asegúrese de que el envoltorio TCP no esté bloqueando una conexión SSH:

$ if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi

4.    A continuación, conéctese a la instancia mediante SSH.

5.    Desconecte la sesión de la consola serie de EC2 si ya no es necesaria.

Método 2: utilizar AWS System Manager Session Manager

Nota: Para usar este método, la instancia debe ser una instancia administrada por SSM y el estado de ping del agente de SSM debe ser Online (En línea). Para obtener más información sobre el administrador de sesiones y obtener una lista completa de los requisitos previos, consulte Configuración de Session Manager.

Si desea confirmar que el firewall o el envoltorio TCP no bloquean las conexiones SSH y que el servicio sshd se está ejecutando y escuchando en el puerto 22, siga los siguientes pasos:

1.    Abra AWS Systems Manager.

2.    Inicie una sesión para la instancia mediante el Session Manager.

3.    Siga los pasos 1 a 4 del Método 1: Utilice la consola serie de EC2 para Linux.

4.    Cierre la sesión de Session Manager si ya no es necesaria.

Método 3: Ejecute el runbook AWSSupport-TroubleshootSSH

El runbook de automatización AWSSupport-TroubleshootSSH instala la herramienta Amazon EC2Rescue en la instancia. Esta herramienta busca e intenta solucionar los problemas que impiden una conexión remota a un host de Linux a través de SSH.

Para ejecutar el runbook AWSSupport-TroubleshootSSH siga estos pasos:

1.    Abra la página AWSSupport-TroubleshootSSH.

2.    Seleccione Run this Automation (console) (Ejecutar esta automatización [consola]).

Para más información, consulte ¿Cómo puedo usar el flujo de trabajo de automatización de AWSSupport-TroubleshootSSH para solucionar problemas de conexión de SSH?

Método 4: utilizar un script de datos de usuario

Si ninguno de los métodos descritos es adecuado en su entorno, utilice un script de datos de usuario de EC2. El script de datos de usuario de EC2 desactiva el firewall a nivel del sistema operativo y el contenedor TCP y, a continuación, reinicia el servicio sshd.

Importante:

  • Este procedimiento requiere detener y comenzar la instancia de EC2. Si la instancia tiene datos almacenados en los volúmenes del almacén de instancias, esos datos se eliminan después de detener la instancia.
  • Si la instancia forma parte de un grupo de Amazon EC2 Auto Scaling, al finalizar la instancia también se podrían detener las instancias del grupo de escalado automático.
  • Si la instancia la lanzan servicios que usan AWS Auto Scaling, al finalizar la instancia también se podrían detener las instancias del grupo de escalado automático.
  • La terminación de la instancia depende de la configuración de la protección de desescalado horizontal para su grupo de escalado automático. Si la instancia forma parte de un grupo de escalado automático, elimine temporalmente la instancia del grupo de escalado automático antes de iniciar los pasos de resolución.
  • Detener y comenzar la instancia cambia la dirección IP pública de la instancia. Es una práctica recomendada utilizar una dirección IP elástica en lugar de una dirección IP pública cuando enrute el tráfico externo a su instancia.

Siga estos pasos para configurar los datos de usuario de la instancia:

1.    Abra la consola de Amazon EC2.

2.    Elija Instances (Instancias) en el panel de navegación y, a continuación, seleccione la instancia a la que planea conectarse.

3.    Detenga la instancia.

4.    Elija Actions (Acciones), Instance Settings (Configuración de instancia), Edit User Data (Editar datos de usuario).

5.    Copie el script de datos de usuario siguiente en el cuadro de diálogo Edit User Data (Editar datos de usuario) y elija Save (Guardar).

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 -P INPUT ACCEPT
iptables -F
systemctl restart sshd.service || service sshd restart
if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi
--//

6.    Conéctese a la instancia mediante SSH.

7.    El script de datos de usuario anterior se ejecuta cada vez que se reinicia la instancia. Después de recuperar el acceso a la instancia, elimine el script de datos de usuario.

Nota: El comando anterior vacía todas las reglas principales de iptables. Después de recuperar el acceso a la instancia, revise para mayor precisión la configuración del firewall (por ejemplo, UFW, firewalld, iptables).

Para eliminar datos de usuario:

1.    Tenga en cuenta los pasos del 1 al 4 de la sección Método 4: utilizar un script de datos de usuario.

2.    Elimine el script de datos de usuario del cuadro de diálogo Edit User Data (Editar datos de usuario).


Error al conectar con la instancia: se agotó el tiempo de espera de la conexión

How do I troubleshoot Amazon EC2 instance connection timeout errors from the internet? (¿Cómo soluciono los errores de tiempo de espera de conexión de la instancia de Amazon EC2 desde Internet?)

Why can't I connect to my Amazon EC2 Linux instance using SSH? (¿Por qué no puedo conectarme a mi instancia de Amazon EC2 Linux con SSH?)

Why is my EC2 Linux instance unreachable and failing one or both of its status checks? (¿Por qué motivo mi instancia de EC2 de Linux es inaccesible y no supera una o ambas comprobaciones de estado?)

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?