为什么我无法连接到 Amazon EC2 实例?
当我尝试连接到 Amazon Elastic Compute Cloud (Amazon EC2) 实例时,我收到了错误。
简短描述
首先,检查您的 EC2 实例配置,确保该实例通过实例和系统状态检查。
如果仍然无法连接,请恢复您的 SSH 连接、EC2 Instance Connect 连接或会话管理器(AWS Systems Manager 的一项功能)连接。或者,使用 EC2 Serial Console 恢复您的连接。
**注意:**通常情况下,EC2 Serial Console 仅用于对问题进行故障排除,不用于执行标准流程。
如果某个连接方法不起作用,请使用其他连接方法访问您的实例并对问题进行故障排除。
如果仍然无法恢复连接,请使用救援实例检查受影响实例的日志中是否存在错误。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
检查您的实例访问权限配置
查看您的安全组规则
入站安全组规则必须允许从您的 IP 地址访问端口 22(对于 Linux)和端口 3389(对于 Windows)。
要检查您的安全组规则,请运行以下 describe-security-groups AWS CLI 命令:
aws ec2 describe-security-groups --group-ids SG-IDs
**注意:**请将 SG-ID 替换为您的安全组 ID。
如果端口 22 或 3389 不在您的允许列表中,请运行以下 authorize-security-group-ingress 命令更新您的规则以允许访问:
aws ec2 authorize-security-group-ingress --group-id SG-ID --protocol tcp --port 22 --cidr SOURCE-IP/32
**注意:**请将 SG-ID 替换为您的安全组 ID,并将 SOURCE-IP 替换为您的源 IP 地址。如果使用 Windows 实例,请将 22 替换为 3389。如果源 IP 地址是公有 IP 地址,则可以使用 checkip.amazonaws 工具来识别该 IP 地址。
查看您的网络 ACL
默认情况下,网络访问控制列表(网络 ACL)允许所有入站流量和出站流量。确保您的网络 ACL 允许入站 SSH 访问实例和出站访问临时端口 (1024-65535)。如果网络 ACL 阻止端口 22 或 3389,请添加新规则以允许流量。对于公有 IP 地址,请确保路由表中包含将流量路由到互联网网关的条目。
检查您的路由表
确保您的实例通过状态检查
要连接到实例,该实例必须通过其状态检查。使用 Amazon EC2 控制台检查 System status(系统状态)和 Instance status(实例状态)是否均显示 OK(正常)。您还可以使用 Amazon CloudWatch 指标来检查您的实例状态并识别影响连接的问题。
**注意:**最佳做法是检查是否存在计划维护和其他可能影响实例连接的事件。
如果 Instance status(实例状态)不是 OK(正常),请重启您的实例。实例重启通常可以解决一些小问题。如果仍然无法连接,或 System status(系统状态)不是 OK(正常),则问题可能出在 AWS 基础架构上。要解决此问题,请参阅为什么我的 Amazon EC2 实例因系统状态检查失败而关闭?
如果仍然遇到问题,请参阅如何对 EC2 Linux 实例的状态检查失败问题进行故障排除?或者为什么我的 EC2 Windows 实例因实例状态检查失败而关闭?
对连接错误进行故障排除
如果您的实例通过状态检查,但收到连接错误,请参阅以下资源:
- 如何解决我的 Amazon EC2 Linux 实例的 SSH 连接问题?
- 如何对 EC2 Windows 实例的 RDP 连接问题进行故障排除?
- 如何排查使用 RDP 连接到 EC2 Windows 实例时出现的身份验证错误?
- 排查连接到 Amazon EC2 Linux 实例时遇到的问题
- 排查连接到 Amazon EC2 Windows 实例时遇到的问题
恢复您的 SSH 连接
**注意:**如果您丢失了 SSH 密钥对,请参阅如果我在 Amazon EC2 实例初次启动后丢失了 SSH 密钥对,我该如何连接到该实例?
查看您的用户名和 IP 地址设置
确保为您的实例使用正确的用户名。然后,从公有 IP 地址连接到该实例。
**注意:**如果您从私有 IP 地址进行连接,请确保与目标实例的网络连接正常。
检查 SSH 服务器状态
要检查 SSH 服务器的状态,请使用会话管理器、EC2 Instance Connect 或 EC2 Serial Console 连接到该实例。
根据您的发行版,运行以下命令以检查 SSH 服务的状态:
使用 systemd 的系统:
sudo systemctl status sshd
Ubuntu 或 Debian 系统:
sudo systemctl status ssh
遗留系统,例如 CentOS 6:
sudo service sshd status
如果 SSH 服务状态为 Stopped(已停止),请根据您的发行版运行以下命令以启动服务:
使用 systemd 的系统:
sudo systemctl start sshd
Ubuntu 或 Debian 系统:
systemctl start ssh
遗留系统,例如 CentOS 6:
sudo service sshd start
查看您的私钥文件权限
确保您的私钥文件具有所需的读取权限。
测试网络连接
要测试与端口 22 的连接,请从您的客户端运行以下命令之一:
nc -zv Host 22
-or-
telnet Host 22
**注意:**请将 Host 替换为您的 IP 地址或完全限定域名 (FQDN)。
然后,运行以下命令以在详细模式下使用 SSH 连接到您的实例:
ssh -i key_pair.pem user@Host -vvv
**注意:**请将 Host 替换为您的 IP 地址或 FQDN。
要解决连接问题,请参阅如何排查使用 SSH 连接到我的 EC2 实例时出现的 "Connection refused" 或 "Connection timed out" 错误?以及排查连接到 Amazon EC2 Linux 实例时遇到的问题。
恢复您的 EC2 Instance Connect 连接
首先,使用 SSH、会话管理器或 EC2 Serial Console 连接到您的实例,确保您已安装 EC2 Instance Connect。然后,使用 EC2 Instance Connect 连接到该实例。
如果您在使用 EC2 Instance Connect 时遇到问题,请确保您已针对 com.amazonaws.region.ec2-instance-connect 前缀列表名称允许端口 22 上的入站 SSH 流量。此外,验证您的 AWS Identity and Access Management (IAM) 用户的策略是否包含 ec2-instance-connect:SendSSHPublicKey 操作。
如果仍然遇到问题,请参阅如何排查我在使用 EC2 Connect 连接到 EC2 实例时收到的错误?
使用 EC2 Serial Console 恢复连接
**先决条件:**配置对 EC2 Serial Console 的访问权限。
要使用 EC2 Serial Console 连接到您的实例,您可以使用 Amazon EC2 控制台或 SSH。有关详细信息,请参阅如何访问无法访问的 Linux 实例的 EC2 Serial Console?
连接后,针对启动、网络配置或其他问题对您的实例进行故障排除。
如果您在使用 EC2 Serial Console 时遇到问题,请确保您的 IAM 策略包含 ec2-instance-connect:SendSerialConsoleSSHPublicKey 操作。
恢复您的会话管理器连接
会话管理器仅通过 IAM 角色和权限来管理身份验证,而非 SSH 密钥。在使用会话管理器之前,请确保满足会话管理器的先决条件。然后,使用会话管理器连接到您的实例。
如果您在使用会话管理器时遇到问题,请执行以下操作。
检查您的 IAM 角色
确认实例具有附加了 AmazonSSMManagedInstanceCore 策略的 IAM 角色。
或者,确保该角色具有以下所需权限:
- ssmmessages:CreateControlChannel
- ssmmessages:CreateDataChannel
- ssmmessages:OpenControlChannel
- ssmmessages:OpenDataChannel
您可以向现有角色添加所需的会话管理器权限。
**注意:**如果您使用默认主机管理配置来管理您的实例,则无需创建 IAM 实例配置文件来管理实例。
如果您更新权限,请分离并重新附加 IAM 角色。等待几分钟,然后启动 AWS Systems Manager Agent (SSM Agent) 或启动实例。
对 SSM Agent 状态进行故障排除
使用 SSH、EC2 Serial Console 或 EC2 Instance Connect 连接到您的实例。然后,根据您的发行版,运行以下命令以检查 SSM Agent 的状态。
使用 systemd 的系统:
sudo systemctl status amazon-ssm-agent
Debian 或 Ubuntu 系统:
sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service
如果代理状态为 Stopped(已停止),请根据您的发行版运行以下命令将其启动。
使用 systemd 的系统:
sudo systemctl start amazon-ssm-agent
Debian 或 Ubuntu 系统:
sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service
要验证 SSM Agent 是否正在运行,请检查系统日志。
最佳做法是使用最新版本的 SSM Agent。要查看您是否拥有最新版本,请参阅 GitHub 网站上的 amazon-ssm-agent/RELEASENOTES。如果您没有最新版本,请根据您的操作系统 (OS) 安装更新后的 SSM Agent。
要进一步进行故障排除,请检查 /var/log/amazon/ssm/amazon-ssm-agent.log 日志中是否存在错误。或者,请参阅排查 SSM Agent 问题。
验证网络连接
确保您的网络 ACL 和安全组允许通过端口 443 与 AWS Systems Manager 端点进行出站连接。
如果您的实例未显示在会话管理器中,请参阅为什么 Systems Manager 没有将我的 Amazon EC2 实例显示为托管实例?
对于私有实例,请创建虚拟私有云 (VPC) 端点。对于 Service name(服务名称),选择 com.amazonaws.REGION.ssm 和 com.amazonaws.REGION.ssmmessages。
**注意:**请将 REGION 替换为您的 AWS 区域。
附加到 VPC 端点的安全组必须允许端口 443 上的入站流量。
有关详细信息,请参阅无法连接到 SSM 端点。
检查是否缺少先决条件
使用 SSH、EC2 Serial Console 或 EC2 Instance Connect 连接到您的实例,然后运行以下命令对托管节点可用性进行故障排除:
sudo ssm-cli get-diagnostics --output table
查看输出中是否缺少会话管理器先决条件。
或者,运行 Systems Manager 运行手册以自动检查是否缺少先决条件。运行 AWSSupport-TroubleshootManagedInstance 以检查您的 VPC 配置,包括安全组规则、VPC 端点、网络 ACL 规则、路由表和 IAM 配置文件。或者,运行 AWSSupport-TroubleshootSessionManager 以检查您是否满足会话管理器先决条件。
检查实例控制台日志
如果无法使用上述方法连接到您的实例,请运行以下用户数据脚本来恢复会话管理器连接:
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 sudo ssm-cli get-diagnostics --output table >> /dev/console # or sudo ssm-cli get-diagnostics --output table >> /dev/ttyS0
然后,检查实例控制台输出以确定失败的连接步骤。对失败的步骤进行故障排除后,使用会话管理器测试您的连接。
如果仍无法连接,请使用救援实例来解决启动问题。
相关信息
- 语言
- 中文 (简体)

