EC2实例无法联网的ACL配置原因及受限入站解决方法
问题
我有一台绑定了ACL的EC2实例,要求仅允许IP地址10.20.30.40通过22、80、443端口访问该实例,因此配置了如下入站规则:
1. 95 TCP 22 10.20.30.40/32 Allow 2. 100 TCP 443 10.20.30.40/32 Allow 3. 105 TCP 80 10.20.30.40/32 Allow 4. * All All 0.0.0.0/0 Deny
出站规则配置如下:
1. 100 All All 0.0.0.0/0 Allow 2. * All All 0.0.0.0/0 Deny
按配置应该可以正常访问互联网,但实际无法联网。仅当添加至少如下入站规则或允许全部入站流量时,联网才恢复正常:
5. 110 ICMP-IPv4 All 0.0.0.0/0 Allow
请问该现象的原因是什么?如何在不向其他IP开放实例的前提下限制入站流量?
现象原因
核心原因有两点:
- TCP响应流量被拦截:EC2实例访问互联网时,会随机使用1024-65535范围内的临时端口发起请求,目标服务器的响应流量会以这些临时端口为目标端口返回。但现有入站规则只允许
10.20.30.40访问22/80/443端口,所有外部服务器的响应流量直接被最后的Deny规则阻断,导致TCP连接无法完成握手或传输数据。 - 路径MTU发现失败:网络通信中,路径MTU发现依赖ICMP的「目的地不可达(需要分片但DF位已置位)」报文,用来自动调整数据包大小。如果入站规则拒绝这类ICMP报文,当遇到MTU不匹配的网络路径时,TCP连接会直接中断,表现为无法联网。添加全量ICMP规则后恢复联网,就是因为解决了MTU发现的问题,但TCP响应被拦截的本质问题其实也存在,只是部分场景下未暴露。
优化配置方案
要在严格限制外部主动访问的同时保证实例正常联网,只需调整入站规则,允许必要的响应流量和特定ICMP报文:
最终入站规则(按优先级从高到低)
1. 95 TCP 22 10.20.30.40/32 Allow # 允许指定IPSSH访问 2. 100 TCP 443 10.20.30.40/32 Allow # 允许指定IPHTTPS访问 3. 105 TCP 80 10.20.30.40/32 Allow # 允许指定IPHTTP访问 4. 110 TCP 1024-65535 0.0.0.0/0 Allow # 允许外部TCP响应流量(临时端口) 5. 115 ICMP-IPv4 类型3,代码4 0.0.0.0/0 Allow # 允许MTU发现所需ICMP报文 6. * All All 0.0.0.0/0 Deny # 默认拒绝所有其他入站流量
配置说明
- 规则4开放的1024-65535是EC2实例发起TCP请求的默认临时端口段,确保外部服务器的响应能正常返回实例,解决联网的核心问题。
- 规则5仅允许ICMP类型3、代码4的报文,而非全量ICMP,既满足路径MTU发现的需求,又最小化入站开放范围,避免不必要的风险。
- 原有针对
10.20.30.40的访问规则完全保留,只有该IP能主动访问实例的22/80/443端口,其他IP无法主动发起连接,符合初始需求。
内容的提问来源于stack exchange,提问作者pto3
相关产品推荐
相关产品推荐

