排查常见 EC2 实例连接问题与错误

学习快速诊断和修复 SSH 与 RDP 的常见 EC2 连接故障。本实用指南将引导您检查实例健康状态、验证关键安全组规则、排查无状态网络 ACL 以及确认 VPC 路由配置,以恢复对实例的即时访问。

排查常见 EC2 实例连接问题与错误

当 EC2 连接失败时,首先要问的问题是:实例是否无法访问、拒绝认证,还是只能通过错误的路径访问?无论您是对 Linux 实例使用 SSH,还是对 Windows 实例使用远程桌面协议 (RDP),连接故障都很常见,且常常令人沮丧。SSH 和 RDP 错误往往容易混淆,但 Permission deniedConnection timed outConnection refused 以及空白的 RDP 屏幕指向不同的层面。将错误文本视为线索,然后由外向内排查。


阶段 1:初始检查与实例健康状态

在深入复杂的网络配置之前,请确保实例正常运行且可在基本层面访问。

1. 实例状态检查

使用 AWS 管理控制台或 AWS CLI 验证实例的整体健康状况。必须通过两项关键检查:

  • 系统状态检查: 失败通常表示底层硬件或基础设施问题,需要 AWS 干预或实例终止/重建。
  • 实例状态检查: 失败通常与操作系统启动问题、文件系统损坏或驱动程序问题有关。如果此项检查失败,实例可能健康状况不佳,无法接受网络连接。

操作: 如果任一检查失败,请考虑停止并启动实例(如果系统检查失败,这会将实例迁移到新硬件),或检查系统日志以获取线索。

2. 验证公有 IP 地址和 DNS 名称

确保您尝试连接到正确的地址。如果您的实例必须直接从互联网访问,则需要一个公有 IPv4 地址弹性 IP,以及通过互联网网关的公有子网路由。如果实例位于私有子网中,则必须通过堡垒主机或使用 AWS Systems Manager Session Manager 进行连接。

  • 提示: 如果实例已停止并启动,其公有 IP 地址可能会更改,除非您分配了弹性 IP。

3. 检查客户端配置 (SSH/RDP)

连接错误有时是本地问题。验证您的客户端软件是否正常运行。

  • 对于 SSH (Linux/macOS): 确保您使用了正确的私钥文件(.pem.ppk),并且权限设置正确(chmod 400 /path/to/key.pem)。
  • 对于 RDP (Windows): 确保您使用了正确的密码,该密码是通过在 EC2 控制台中使用私钥文件解密管理员密码获得的。

阶段 2:安全层诊断(最常见的故障)

安全配置错误是连接问题的主要原因。安全组和网络 ACL 都充当防火墙,并且都必须允许必要的流量。

4. 安全组 (SG) 入站规则

安全组是直接附加到实例弹性网络接口 (ENI) 的有状态防火墙。

Linux (SSH) 要求:

  • 协议: TCP
  • 端口范围: 22
  • 源: 您的公有 IP 地址 (My IP) 或 0.0.0.0/0(适用于所有 IP,但出于安全考虑不推荐)。

Windows (RDP) 要求:

  • 协议: TCP
  • 端口范围: 3389
  • 源: 您的公有 IP 地址或 0.0.0.0/0

排查步骤: 临时将所需入站规则的源更改为相关端口(22 或 3389)的 0.0.0.0/0。如果您可以连接,则问题在于您的特定客户端 IP 地址被阻止或未正确识别。

警告: 切勿在生产环境中将安全组的管理端口(22/3389)开放给 0.0.0.0/0。尽可能使用特定的源 IP 或 VPC 端点。

5. 网络 ACL (NACL)

网络 ACL 是无状态的子网级防火墙。它们独立检查入站和出站流量。如果允许流量进入,则必须同时允许返回流量流出。

连接所需的 NACL 规则:

方向 协议 端口范围 规则操作
入站 TCP 22 (SSH) 或 3389 (RDP) 允许
出站 TCP 临时端口 (1024-65535) 允许

临时端口至关重要。当您的客户端连接时(例如,从端口 54321),服务器会在一个高编号的临时端口上回复。如果 NACL 阻止了这些高端口的出站流量,服务器将无法将响应发送回给您,从而导致连接超时。

排查步骤: 验证关联的 NACL 中是否同时具有入站端口(22/3389)和出站临时端口(1024-65535)的允许规则。


阶段 3:路由和 VPC 配置

如果确认安全层已开放,问题在于流量如何路由到实例的子网以及从实例的子网路由出去。

6. 子网类型和路由表

连接性完全取决于您的实例位于公有子网还是私有子网

公有子网连接

用于直接互联网访问(从外部世界进行 SSH/RDP):

  1. 实例必须分配有公有 IPv4 地址或弹性 IP。
  2. 关联的路由表必须有一条指向互联网网关 (IGW)0.0.0.0/0 路由。

私有子网连接

私有子网中的实例无法直接从互联网访问。连接需要多跳路径:

  1. 通过堡垒主机(跳板机)连接: 您 SSH 登录到公有 EC2 实例,然后从堡垒主机 SSH 登录到私有实例(使用其私有 IP)。
  2. 通过 VPN/Direct Connect 连接: 如果使用 AWS Site-to-Site VPN 或 Direct Connect,必须配置路由以将流量定向到您的本地网络,然后本地网络再将流量路由到私有子网。

7. 操作系统级防火墙问题

如果 AWS 安全检查通过,则 EC2 实例上运行的操作系统本身可能正在阻止连接。如果您手动安装或配置了本地防火墙(如 Linux 上的 iptables 或 Windows Defender 防火墙),这种情况很常见。

诊断(如果可能通过控制台或 Session Manager):

  • Linux: 检查 iptables -L 或使用 firewall-cmd --list-all。确保端口 22 被明确允许。
  • Windows: 检查 Windows Defender 防火墙设置中关于端口 3389 的入站规则。

恢复提示: 如果您已失去所有连接,请考虑停止实例、分离根卷、将其附加到正常运行的恢复实例、修改操作系统配置文件以禁用防火墙,然后将卷重新附加到原始实例 ID。

公有、私有和托管连接选项

不要假设每个 EC2 实例都应接受来自互联网的 SSH 或 RDP。公有实例需要公有地址、通往互联网网关的路由、宽松的安全控制以及正在运行的监听器。私有实例通常需要不同的访问方法:堡垒主机、VPN、Direct Connect、EC2 Instance Connect Endpoint 或 Systems Manager Session Manager。

Session Manager 对于运维团队特别有用,因为它可以消除对入站 SSH 的需求。实例需要 SSM 代理、具有适当 Systems Manager 权限的 IAM 实例配置文件,以及对 SSM 端点的网络访问。在私有子网中,这通常意味着 VPC 接口端点或通过 NAT 路径的出站互联网。如果缺少任何这些组件,即使实例本身健康,Session Manager 也不会显示为可用选项。

对于堡垒机设计,请测试两个环节。首先从您的工作站连接到堡垒机。然后从堡垒机连接到目标实例的私有 IP。目标实例的安全组通常应仅允许来自堡垒机安全组的 SSH,除非有特殊原因,否则不应允许来自您的家庭 IP 或整个 VPC CIDR。

对于 RDP,请记住 Windows 启动可能比 Linux SSH 启动花费更长时间,尤其是在修补或首次启动后。如果实例状态检查刚刚通过但 RDP 仍然失败,请检查系统日志并等待几分钟再更改防火墙规则。反复替换安全组可能会掩盖实际的启动或服务问题。


从工作站进行快速测试

在更改 AWS 资源之前,先进行小型网络测试。在 Linux 或 macOS 上,nc -vz <public-ip> 22 测试 TCP 端口 22 是否完成连接。对于 RDP,使用 nc -vz <public-ip> 3389 或 Windows 上的端口测试工具。超时指向路由、安全组、NACL 或上游防火墙。连接被拒绝更指向实例操作系统或服务。

如果涉及 DNS,请明确解析它:

dig +short ec2-203-0-113-10.compute-1.amazonaws.com

然后将结果与 EC2 控制台中的当前公有 IP 进行比较。弹性 IP 保持稳定,但自动分配的公有 IP 在停止/启动后可能会更改。这是导致运行手册和已保存的 RDP 配置文件失效的一个简单原因。

如果您使用公司 VPN,请在编辑 VPC 之前从其他网络进行测试。某些公司网络会阻止出站 SSH 或 RDP,并且某些家庭路由器或 ISP 会干扰不常见的端口。从不同网络成功连接表明实例可能没问题。

当路由不明确时,VPC Reachability Analyzer 值得使用。它可以模拟源和目标之间的路径,并指出路由或过滤在何处阻止了流量。它不会修复错误的 SSH 密钥或客户操作系统内已停止的服务,但有助于将 AWS 网络设计问题与操作系统问题分开。

Flow Logs 也很有帮助,尤其是在怀疑 NACL 或安全组时。从您的客户端 IP 到端口 22 或 3389 的被拒绝流告诉您数据包到达了受监控的网络接口或子网并被拒绝。完全没有流可能意味着流量从未到达 VPC、地址错误,或者您查看的是错误的 ENI、子网或时间窗口。

为每个环境保留一个小型访问运行手册:批准的源 IP 范围、堡垒机名称、SSM 要求、按 AMI 划分的默认用户名以及恢复实例过程。当每个工程师都必须从控制台重新发现这些细节时,连接事件的处理速度会变慢。

还要记录哪些子网是有意设为私有的。这一条注释可以防止当有人试图直接 SSH 到从未设计为具有互联网路径的实例时进行大量无用的调试。

阅读错误消息

Connection timed out 通常意味着数据包未完成往返。检查公有 IP、路由表、互联网网关、安全组源、NACL 规则、公司防火墙,以及您是否尝试直接访问私有子网。

Connection refused 通常意味着网络路径已到达实例,但该端口上没有监听或操作系统拒绝了它。在 Linux 上,检查 sshd 是否正在运行并在端口 22 上监听。在 Windows 上,检查 RDP 是否已启用以及远程桌面服务是否正在运行。

Permission denied (publickey) 不是 VPC 问题。它通常意味着错误的用户名、错误的私钥、authorized_keys 中缺少公钥、更改的主目录权限,或 AMI 用户名不匹配,例如对 Ubuntu 镜像使用 ec-user 而不是 ubuntu

对于 Windows RDP,身份验证失败通常是由于在实例被替换后使用了旧的解密管理员密码、在停止/启动后连接到错误的公有 IP,或域策略覆盖了本地登录权限。

无法登录时的恢复路径

如果实例安装了 Systems Manager 代理、具有 SSM 权限的实例配置文件以及对 SSM 端点或互联网的网络访问,Session Manager 通常是最小破坏性的恢复路径。您可以检查日志、修复防火墙规则或修复 authorized_keys,而无需向世界开放 SSH。

如果 SSM 不可用,请在支持的情况下使用 EC2 串行控制台,或分离根卷并将其附加到同一可用区中的恢复实例。小心挂载,修复网络或 SSH 配置,卸载它,然后将其重新附加到原始实例。首先拍摄快照,以免修复尝试使恢复变得更糟。

当连接失败时,请遵循此优先级清单:实例健康状态、正确的地址、正确的用户名/密钥或 RDP 密码、安全组、NACL、路由表、操作系统防火墙和服务健康状态。这个顺序可以防止您在真正的问题是一个过期的密钥或一条缺失的路由时更改五个 AWS 控制项。