AWS VPC内子网间EC2无法SSH连通问题排查求助
问题分析与解决方案
首先,你完全不需要在subnet-0和subnet-1之间添加额外路由。看你的路由表信息,所有子网都关联了rtb-08371ccc1f79ebfe6,这个路由表里已经有192.170.0.0/16的local路由——这条路由就是负责同VPC内所有子网之间的流量互通的,所以路由层面是完全没问题的。
你能通过Transit Gateway从外部VPC访问这两台实例,但同VPC内互连失败,说明问题肯定出在安全组、网络ACL(NACL)或者实例本地防火墙上,咱们一步步排查:
1. 先查安全组(最常见的坑)
安全组是实例级别的防火墙,默认只允许同组内的实例访问:
- 打开
instance-1的安全组配置,看入站规则里有没有允许192.170.80.0/26(subnet-1的CIDR)的TCP 22端口?或者干脆允许整个VPC的CIDR192.170.0.0/16的22端口? - 同样检查
instance-2的安全组,入站规则要允许192.170.0.0/26(subnet-0的CIDR)的TCP 22端口。
要是两个实例不在同一个安全组,一定要手动加这条规则,不然默认是不通的。
2. 再查子网的网络ACL(NACL)
NACL是子网级别的无状态防火墙,必须双向流量都放行:
- 分别查看subnet-0和subnet-1的NACL:
- 入站规则:要允许来自对方子网CIDR的TCP 22端口(目的端口填22)
- 出站规则:要允许向对方子网CIDR的TCP 1024-65535端口(因为SSH的返回流量用的是随机高端口,得放行这些端口)
注意:NACL默认是允许所有流量的,但如果你自定义过规则,一定要确保没有拒绝相关流量,而且规则的优先级(数字越小优先级越高)不要搞反了。
3. 最后查实例本地防火墙
既然你能通过TGW登录实例,那就登录进去检查本地防火墙:
- Linux实例的话,执行
iptables -L或者firewall-cmd --list-all,看看有没有规则把对方子网的SSH连接给挡住了。 - 如果是Windows实例,检查Windows防火墙的入站规则,确认有没有允许SSH(或RDP)流量。
关于VPC Flow Log没日志的问题
Flow Log没日志大概率是配置或者权限的问题:
- 先确认Flow Log是不是关联到了正确的VPC或子网?日志目标选的是CloudWatch Logs吗?对应的IAM角色有没有
logs:CreateLogStream和logs:PutLogEvents这两个权限?要是权限不够,日志根本写不进去。 - 然后等几分钟,Flow Log不是实时出日志的,一般要等10-15分钟才能在CloudWatch里看到。
- 还有过滤规则,要是你设置的是
reject,那只会记录被拒绝的流量;设置accept就只记录允许的。建议改成all,这样所有流量都能被捕获,方便排查问题。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

