如何解决使用 SSH 连接到我的 EC2 实例时出现的“Connection refused”(连接被拒绝)或“Connection timed out”(连接超时)错误?

3 分钟阅读
0

当我使用 SSH 连接到我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例时,我收到“Connection refused”(连接被拒绝)或“Connection timed out”(连接超时)错误。

简短描述

如果您的连接超时,则您会收到来自 SSH 客户端的以下错误消息:

“ssh:连接到主机 ec2-X-X-X-X.compute-1.amazonaws.com port 22: 连接超时”

当服务器未响应客户端,且客户端程序放弃(超时)时,将会出现 Connection timed out(连接超时)错误。

如果主机远程拒绝您的连接,则您会收到以下错误消息:

“ssh:连接到主机 ec2-X-X-X-X.compute-1.amazonaws.com port 22: 连接被拒绝”

解决方法

“Connection timed out”(连接超时)错误

如果您收到 Connection timed out(连接超时)错误,请验证以下配置:

**注意:**要检查防火墙或 TCP 包装器是否存在问题,您必须拥有实例的操作系统 (OS) 访问权限。

“Connection refused”(连接被拒绝)错误

如果您收到 Connection refused(连接被拒绝)错误,请验证以下配置:

  • 实例上不存在阻止 SSH 连接的防火墙。
  • SSH 进程守护程序 (sshd) 正在端口 22 上运行并侦听。

**注意:**要检查上述配置,您必须拥有实例的操作系统级访问权限。

对通过两项运行状况检查的实例的问题进行故障排除

要对通过运行状况检查的实例的问题进行故障排除,请使用以下故障排除方法之一。

运行 AWSSupport-TroubleshootSSH 运行手册

最佳做法是运行 AWSSupport-TroubleshootSSH 自动化运行手册。该运行手册会在您的实例上安装 Amazon EC2Rescue 工具,以识别并修复阻止远程 SSH 连接到 Linux 主机的问题。

使用适用于 Linux 的 EC2 Serial Console

使用适用于 Linux 的 EC2 Serial Console受支持的实例类型上的操作系统级问题进行故障排除,例如启动问题、网络配置问题以及 SSH 配置问题。

先决条件:

  • 在 AWS 账户级别授予对控制台的访问权限
  • 创建 AWS Identity and Access Management (IAM) 策略,以向您的 IAM 用户授予控制台访问权限
    **注意:**使用 EC2 Serial Console 的每个实例必须至少拥有一个具有 sudo 访问权限且使用密码的 Linux 用户。

有关详细信息,请参阅 Configure access to the EC2 Serial Console

如果 Linux 账户未配置登录密码,则您必须运行 ssm-user,为具有 sudo 访问权限的账户重置密码。

要确认您的配置不会阻止 SSH 访问,请完成以下步骤:

  1. 使用 EC2 Serial Console 以配置了密码的 Linux 用户身份连接到 EC2 实例

  2. 如果您配置了 iptables 规则,请运行以下命令在 iptables 中添加一条规则,以接受端口 22 上的所有 SSH 连接:

    sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
  3. 如果您使用基于操作系统的防火墙,请将其停用。最佳做法是使用安全组而不是防火墙。要停用基于操作系统的防火墙,请根据您的操作系统运行以下命令。
    **重要事项:**以下命令将清除所有主要的 iptables 规则并删除现有规则。这些命令还会添加允许入站 SSH 连接的规则,并将主链的默认策略更改为 ACCEPT。此配置可确保您在清除 iptables 规则时不会影响实例网络连接。
    使用 UFW 的发行版,例如 Ubuntu 和 Debian:

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

    使用防火墙的发行版,例如 Red Hat Enterprise Linux (RHEL) 和 CentOS:

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

    **注意:**重新获得对实例的访问权限后,请检查您的防火墙配置。

  4. 要验证 SSH 是否正在运行以及 SSH TCP 端口 22 是否处于侦听状态,请运行以下命令:

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

    **注意:**如果您的系统没有 ss 命令,请使用传统的 netstat 命令替代 ss。确保使用与上述命令相同的语法。

  5. 要确保 TCP 包装器不会阻止 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
  6. 使用 SSH 连接到实例

  7. 断开与 EC2 Serial Console 会话的连接

使用 Systems Manager

先决条件:要使用会话管理器(AWS Systems Manager 的一项功能),您的实例必须为托管节点。该实例的 AWS Systems Manager Agent (SSM Agent) ping 状态必须为在线,且附加的 IAM 角色必须具有 AmazonSSMManagedInstanceCore 权限。确保遵守所有会话管理器先决条件

使用会话管理器启动会话以访问实例。

使用用户数据脚本

如果您无法使用上述故障排除方法,请使用用户数据脚本停用操作系统级防火墙和 TCP 包装器。然后,重新启动 sshd 服务。

**重要事项:**在停止并启动实例之前,请执行以下操作:

**注意:**当停止并启动某个实例时,该实例的公共 IP 地址将发生变化。最佳做法是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。

要为实例配置用户数据,请完成以下步骤:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中,选择 Instances(实例),然后选择您的实例。
  3. 停止实例
  4. 选择 Actions(操作),然后选择 Instance settings(实例设置)。
  5. 选择 Edit user data(编辑用户数据),然后输入以下用户数据脚本:
    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
    --//
    **注意:**上述用户数据脚本设置为在实例每次重新启动时运行。此方法会删除所有主要的 iptables 规则。
  6. 选择 Save(保存)。
  7. 使用 SSH 连接到实例
  8. 在重新获得对实例的访问权限后,请删除用户数据脚本,然后验证您的防火墙配置是否准确。

相关信息

连接到您的实例时出错: 连接超时

如何解决来自互联网的 Amazon EC2 实例连接超时错误?

如何解决使用 SSH 连接到 Amazon EC2 Linux 实例时出现的问题?

为什么我的 EC2 Linux 实例无法访问并且其状态检查失败?