Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何解决使用 SSH 连接到我的 EC2 实例时出现的“Connection refused”(连接被拒绝)或“Connection timed out”(连接超时)错误?
当我使用 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(连接超时)错误,请验证以下配置:
- 实例的 IP 地址或主机名正确。
- 实例通过了其运行状况检查。
- 实例的安全组允许 TCP 端口 22 上的入站流量。
- 实例子网的网络访问控制列表(网络 ACL)允许 TCP 端口 22 上的入站流量和临时端口上的出站流量。
- 实例子网的路由表提供实例和 SSH 客户端之间的连接。
- 不存在阻止 SSH 客户端和实例之间的连接的防火墙。
- 实例的 TCP 包装器不会阻止 SSH。有关详细信息,请参阅 Red Hat 网站上的 2.6.2.TCP Wrappers configuration files。
**注意:**要检查防火墙或 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 访问,请完成以下步骤:
-
如果您配置了 iptables 规则,请运行以下命令在 iptables 中添加一条规则,以接受端口 22 上的所有 SSH 连接:
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
-
如果您使用基于操作系统的防火墙,请将其停用。最佳做法是使用安全组而不是防火墙。要停用基于操作系统的防火墙,请根据您的操作系统运行以下命令。
**重要事项:**以下命令将清除所有主要的 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
**注意:**重新获得对实例的访问权限后,请检查您的防火墙配置。
-
要验证 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。确保使用与上述命令相同的语法。
-
要确保 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
使用 Systems Manager
先决条件:要使用会话管理器(AWS Systems Manager 的一项功能),您的实例必须为托管节点。该实例的 AWS Systems Manager Agent (SSM Agent) ping 状态必须为在线,且附加的 IAM 角色必须具有 AmazonSSMManagedInstanceCore 权限。确保遵守所有会话管理器先决条件。
使用会话管理器启动会话以访问实例。
使用用户数据脚本
如果您无法使用上述故障排除方法,请使用用户数据脚本停用操作系统级防火墙和 TCP 包装器。然后,重新启动 sshd 服务。
**重要事项:**在停止并启动实例之前,请执行以下操作:
- 创建您的 Amazon Elastic Block Store (Amazon EBS) 卷的备份。
**注意:**如果您的实例是由实例存储支持,或者具有包含数据的实例存储卷,则 Amazon EC2 会在实例停止时删除这些数据。 - 完成解决步骤后,暂时将该实例从其 Amazon EC2 Auto Scaling 组中移除。
**注意:**如果您停止 EC2 Auto Scaling 组中的实例,则可以根据缩容保护设置终止该实例。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动的实例可能位于 Auto Scaling 组中。 - 将实例关闭行为设置为 Stop(停止),以确保实例在您停止时不会终止。
**注意:**当停止并启动某个实例时,该实例的公共 IP 地址将发生变化。最佳做法是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。
要为实例配置用户数据,请完成以下步骤:
- 打开 Amazon EC2 控制台。
- 在导航窗格中,选择 Instances(实例),然后选择您的实例。
- 停止实例。
- 选择 Actions(操作),然后选择 Instance settings(实例设置)。
- 选择 Edit user data(编辑用户数据),然后输入以下用户数据脚本:
**注意:**上述用户数据脚本设置为在实例每次重新启动时运行。此方法会删除所有主要的 iptables 规则。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 --//
- 选择 Save(保存)。
- 使用 SSH 连接到实例。
- 在重新获得对实例的访问权限后,请删除用户数据脚本,然后验证您的防火墙配置是否准确。
相关信息
如何解决来自互联网的 Amazon EC2 实例连接超时错误?
