AWS VPC中出站IPv6连接回复未路由至防火墙的问题排查求助
我用Terraform搭建了一个全新的AWS VPC,里面划分了一个DMZ子网和一个内部子网,中间靠一台防火墙实例做桥接——防火墙在两个子网各有一个网络接口,每个接口都配置了IPv4和IPv6地址(各包含一个链路本地地址和一个全局地址)。目前防火墙本身可以正常通过IPv4和IPv6访问外部的HTTPS URL,流量会从DMZ接口出站。
内部子网里部署了一台测试服务器,它的网络接口配置了合规的IPv4和IPv6地址(同样是链路本地+全局地址),服务器的IPv4和IPv6默认路由都指向防火墙内部接口的全局地址。
相关配置说明
防火墙的两个接口都已经禁用了源/目标检查;安全组和网络ACL(NACL)也按需求配置完毕:
- 内部子网的NACL禁止所有进出数据包,只有这台双网卡的防火墙能从内部子网出站
- DMZ子网的NACL允许出站HTTPS流量到所有IPv4/IPv6目标,同时允许来自所有目标的高端口响应流量
目前IPv4的NAT功能已经正常工作,测试服务器可以通过IPv4访问目标HTTPS地址,但IPv6连接完全失败,无法建立。
已完成的排查动作
我已经做了一系列排查,整理如下:
- 防火墙自身使用同一个URL发起IPv6连接完全成功,说明目标地址的IPv6服务是正常可用的
- 测试服务器解析该URL得到的IPv6地址和防火墙解析的结果完全一致,DNS层面没有问题
- 在防火墙的DMZ接口用
tcpdump抓包,能看到数据包从设备发出,源IP是服务器的全局IPv6地址,目标IP是远程URL的IPv6地址——这说明数据包已经成功路由到防火墙并被转发出去 - 但同一抓包结果中完全看不到远程URL的回复数据包:既然防火墙自身发的包能收到回复,推测数据包已经到达远程端,但回复没有回到防火墙
- 这台防火墙对IPv6仅做路由转发和防火墙策略管控,不涉及NAT或隧道这类操作
- 防火墙会记录所有被它阻断的连接,我检查过日志,这个IPv6连接并没有被防火墙阻断
- AWS可达性分析器不支持IPv6,没法用这个工具辅助排查
- DMZ子网的路由表已配置:内部子网IP段的下一跳指向防火墙的DMZ接口
- 防火墙是Linux实例,已经开启了IPv6转发功能(不然数据包根本到不了DMZ接口)
我的猜测
我怀疑问题根源可能在安全组的有状态特性上:虽然防火墙的入站安全组规则允许所有协议、端口来自任意地址的访问,但这次出站的数据包源IP不是防火墙自身的地址,AWS的路由系统会不会因此不把回复数据包送回防火墙?按道理说,VPC子网的路由表已经明确指定了该目标的下一跳是防火墙,而且我已经禁用了源/目标检查,应该能规避这个问题才对?
编辑1:补充一下我做这个架构的背景——我想替代AWS官方的NAT网关,因为它每个可用区每月要40美元左右,如果跨两个AZ和两个区域部署来保证可用性,每月就要160美元,这直接让我的AWS开销翻倍了。这个内部/DMZ/外部的架构是业界沿用几十年的标准设计,也是VPC的最佳实践。我把安全组看作主机级防火墙,虽然它好用还能通过Terraform集中管控,但光靠它远远不够——就像在物理环境中,你不会给Windows服务器直接配置公网IP,然后指望Windows防火墙永远不出错;真重视基础设施安全的话,肯定会在前面加独立防火墙。所以我想用Terraform管控安全组(相当于统一配置主机防火墙),再在前面加一层防护:NACL的规则数量有限制,所以NAT网关是自然选择,而且它还能作为单一的出站点,方便我排查流量中是否有内部主机被入侵的迹象。
另外我注意到AWS的官方文档里提到他们的NAT实例支持NAT64,这让我更加怀疑VPC中的IPv6路由是不是存在某些结构性的问题?
编辑2:我查看了VPC流日志,出站数据包显示为ACCEPT状态,但完全没有对应的回复流记录——这应该说明回复数据包根本没有被路由到防火墙的接口上。
备注:内容来源于stack exchange,提问作者Ian Gibbs

