本文由 亚马逊云站代理商『云枢国际@yunshuguoji撰写』如需转载请注明!
在管理 Amazon EC2 实例时,配置安全组(Security Group)放行 TCP 22 端口是基础操作。但即便入站规则已设置为 0.0.0.0/0,仍常遇到 Connection timed out 或 Connection refused 错误。
安全组仅是 AWS 网络安全的一环。一个完整的 SSH 链路涉及客户端网络、公网路由、网关、子网 ACL、实例防火墙及系统服务。本文将按链路顺序执行 EC2 SSH 排障,分析安全组之外的常见断点。
一、 网络外围层:子网路由与 Internet Gateway (IGW)
若 SSH 客户端返回 Connection timed out,通常意味着数据包未到达实例。应首先检查 VPC 路由配置。
1. 检查子网路由表
EC2 实例位于特定的 VPC 子网中,其访问互联网的能力由关联的路由表决定。
- 在 VPC 控制台查看实例所在子网的 Route Table。
- 确认存在目标为 0.0.0.0/0 且下一跳指向 Internet Gateway (IGW)(如 igw-xxxx)的条目。
- 注意:若 0.0.0.0/0 指向的是 NAT 网关,则该子网为私有子网。即使实例有公网 IP,外部也无法主动发起入站 SSH 连接。
2. 确认 IGW 状态
- 确保 Internet Gateway 已正确附加(Attach)至该 VPC。未附加的 IGW 无法处理流量。
二、 子网边界层:Network ACL (NACL) 的无状态特性
安全组是有状态的(Stateful),而 Network ACL 是无状态的(Stateless)。这是排障中极易忽略的点。
1. 状态差异的影响
- 安全组:允许入站流量后,响应流量会自动放行。
- NACL:入站与出站规则独立。即使入站允许了 22 端口,若出站规则未配置,响应包也会被拦截。
2. 临时端口(Ephemeral Ports)配置
SSH 连接时,客户端会使用随机的高位端口作为源端口。
- 排查标准:检查子网关联的 NACL 出站规则。必须允许向目标 IP(或 0.0.0.0/0)发送 TCP 1024-65535 范围的流量。若出站规则缺失,客户端将因收不到回包而超时。
三、 寻址层:公网 IPv4 与 Elastic IP 验证
- 公网 IP 分配:确认实例是否具备公网 IPv4 地址。若启动时未启用“自动分配公网 IP”,实例仅有内网地址,无法直接从公网访问。
- Elastic IP (EIP) 映射:若使用固定 IP,需确认 EIP 已处于 Associated 状态并绑定至实例的主网卡(eth0)。请核对 SSH 命令中的目标地址是否为该 EIP。
四、 故障速查矩阵
根据报错特征快速定位问题层级:
| 客户端报错现象 | 常见底层原因 | 优先排查层级 | 建议操作 |
|---|---|---|---|
| Connection timed out | 路由缺失、安全组/NACL 拦截、无公网 IP | 网络基础设施层 | 检查 IGW 路由、安全组入站规则、NACL 出站临时端口 |
| Connection refused | 流量已达实例,但端口未监听或被系统拦截 | 操作系统内部 | 检查 sshd 服务状态、系统内防火墙(ufw/iptables) |
| Permission denied | 密钥不匹配、权限错误、用户名错误 | 认证与配置层 | 确认私钥文件、执行 chmod 400、核对默认用户名 |
| Host key verification failed | 实例重建导致公钥变更 | 本地客户端 | 清理 ~/.ssh/known_hosts 中的旧记录 |
五、 操作系统内部与客户端排查
若网络路径通畅但连接被拒,需检查实例内部配置。
1. 系统防火墙
- Ubuntu/Debian:检查 ufw 状态,确保已执行 sudo ufw allow 22/tcp。
- RHEL/CentOS:检查 firewalld,确认放行了 SSH 服务。
2. sshd 服务状态
若 sshd 未运行,内核会返回 RST 包导致 Connection refused。
- 检查服务:systemctl status sshd
- 检查监听:ss -tulpn | grep :22
- 确认 /etc/ssh/sshd_config 中未修改默认端口。
3. 用户名与密钥
- 默认用户名:Amazon Linux 使用 ec2-user,Ubuntu 使用 ubuntu,Debian 使用 admin。
- 权限要求:本地私钥文件必须限制权限,否则 SSH 客户端会拒绝加载:chmod 400 key.pem。
4. 应急接入工具
若无法通过 SSH 修复,可使用:
- EC2 Serial Console:基于 Nitro 架构实例的带外连接。
- AWS Systems Manager (SSM) Session Manager:无需公网 IP 和安全组放行 22 端口,直接通过控制台获取 Shell。
六、 常见问题解答 (FAQ)
Q1:AWS VPC是什么,适合哪些场景,选型时要确认什么?
答:AWS VPC 是逻辑隔离的虚拟网络,允许用户自定义网段、子网、路由表和网关。它适合需要网络隔离、多层安全防护或混合云接入的业务。选型时需根据业务规模规划 IP 空间(CIDR),考虑跨可用区的高可用设计,并评估 NAT 网关、EIP 及跨区流量的成本。
Q2:EC2 报 Connection timed out 和 Connection refused 在排障上有何本质区别?
答:Connection timed out(超时)通常发生在网络层,表示数据包在途中被丢弃(如路由缺失、安全组或 NACL 拦截),客户端未收到任何响应。Connection refused(拒绝)则表示数据包已到达实例,但被系统内核拒绝,通常是因为 sshd 服务未启动或系统内部防火墙显式拦截了连接。
Q3:为什么安全组放行了 22 端口,Network ACL (NACL) 依然会导致 SSH 失败?
答:因为安全组是有状态的,回包自动放行;而 NACL 是无状态的,入站和出站规则必须分别配置。SSH 连接需要客户端的高位临时端口接收回包,若 NACL 出站规则未放行 1024-65535 端口,响应包会在子网边界被拦截,导致连接超时。