AWS VPC 流量集中检测系列–(1)AWS GWLB集成paloalto防火墙
B站视频:https://www.bilibili.com/video/BV13m4y1P72M/?spm_id_from=333.999.0.0
一、背景
1.1 流量集中检测
传统网络都会在出口部署防火墙,用于检测内网进出互联网的流量。到了AWS云上,这个需求并不太容易实现,因为每个VPC都可以认为是一个独立的网络,有独立的出口。但是对AWS云上的南北向(VPC访问互联网)和东西向(VPC互访)流量做集中检测一直都是比较常见的需求。
流量集中检测架构的核心主要是两个点,一是如何将流量引导到防火墙上,二是防火墙如何实现高可用。
以前常见方法是通过AWS Lambda函数来修改路由表,从而切换流量,并且实现防火墙的高可用。这种方案扩展性不好,而且不太容易实施。
AWS Gateway Load Balancer(GWLB)的出现很好的解决了上面两个问题。AWS PrivateLink提供了新的VPC终端节点GWLB endpoint(GWLBe),它可以做为下一跳路由节点,解决了流量引导的问题。GWLB在防火墙的前面做负载均衡,解决了防火墙高可用的问题。另外关于流量引导,也可结合Transit Gateway来进行引流,可以实现更具扩展性的架构。
1.2 参考的博客
最开始我是对着AWS官方博客[参见链接1]来做实验的,发现无论如何都无法实验成功,后来发现博客里面一个重要参数写错了导致异常。坑出现在原博客[3.2.1 创建PA防火墙实例],里面写到plugin-op-commands=Amazon-gwlb-inspect:enable,应该将Amazon修改为aws,即plugin-op-commands=aws-gwlb-inspect:enable。
测试完paloalto之后,我想测试FortiGate防火墙,飞塔是对这个AWS官方博客[参见链接2]来做实验的,两个拓扑基本一致,只是替换了防火墙,但是发现这篇博客更坑,关键步骤有缺失,无法实现防火墙的高可用切换。后续我会在相同的拓扑下,使用FortiGate防火墙来测试,会填上博客缺失步骤的坑。
这次实验是在AWS Console上操作的,后续我会演示AWS CloudFormation来部署这个环境。
二、实验介绍
这里AppVpc模拟业务的VPC,APP进出互联网的流量会被引导到SecVpc内的防火墙做安全检测,防火墙允许通过后,流量才能正常通信。
这次实验的核心组件:
GWLB:Gateway Load Balancer与防火墙建立GENEVE[参见链接3]隧道,使用UDP 6081来转发数据,这种封装方式让防火墙不用关闭源/目的地址检查,也不用做源/目的NAT的转换。GWLB会在子网创建一个弹性接口,流量通过这个弹性接口来转发。
GWLBe:Gateway Load Balancer endpoint 是由AWS PrivateLink提供的VPC终端节点,可以作为路由表中的下一跳存在,流量送到GWLBe后,会继续送往GWLB背后的实例。
Ingress Route Table:这个路由表关联在IGW上,路由表一般都是关联在子网,这里是AWS 2019年发布的一个功能VPC Ingress Routing[参见链接4],让路由表可以关联到IGW上,用于控制入向的流量。
APP访问互联网流量路径(红色箭头)
- AppVpc内的APP1想要访问Internet上的资源,所在子网关联的路由表将默认路由指向了GWLB Endpoint1。
- GWLB Endpoint1 使用 AWS PrivateLink 将流量送到到GWLB,这里流量是由AWS来控制,无需用户配置。
- GWLB会使用IP数据包的5元组或者3元组哈希来选择实例。GWLB使用GENEVE来封装原始IP流量,并通过UDP 6081发送到防火墙。GENEVE封装可以将所有的IP流量送到实例上,GWLB的侦听组上不需要为每个协议和端口配置侦听器。
- 当 GWLB 接收到新的 TCP/UDP 流时,它会使用 5 元组流哈希(源 IP、目标 IP、传输协议、源端口、目标端口)从目标组中选择一个健康的设备。随后,GWLB 将该流的所有数据包(正向和反向)路由到同一设备(粘性)。对于非 TCP/UDP 流,GWLB 仍然使用 3 元组(源 IP、目标 IP、传输协议)进行转发决策。
- 防火墙收到GENEVE报文,需要解封装流量,然后根据防火墙的安全策略决定是否允许流量通过。
- 防火墙重新使用GENEVE封装流量,并发送到GWLB。
- GWLB根据 GENEVE TLV字段,选择转发到GWLB Endpoint1,并且发送时会去除GENEVE封装。
- 为了支持具有重叠 CIDR 的多租户设备,设备需要知道流量的来源。GWLB 还需要跟踪流量并避免用户流量的混合。GWLB 可以通过将每个数据包的类型-长度-值 (TLV) 三元组发送到设备的额外信息(例如 GWLBE/VPCE ID、附件 ID、流 Cookie)来实现这一点。
- GWLB Endpoint1接受到流量,查看子网关联路由表,默认路由指向IGW,流量通过IGW访问Internet。
互联网访问APP的流量路径(蓝色箭头)
- 客户发起对App1公网地址的访问,流量到达AppVpc的IGW,IGW查看所关联的路由表,将流量送往GWLB Endpoint1。
- GWLB Endpoint1 使用 AWS PrivateLink 将流量送到到GWLB。
- GWLB使用GENEVE来封装原始IP流量,并通过UDP 6081转发到实例。
- 防火墙收到GENEVE报文,需要解封装流量,然后根据防火墙的安全策略决定是否允许流量通过。
- 防火墙重新使用GENEVE封装流量,并发送到GWLB。
- GWLB根据 GENEVE TLV字段,选择转发到GWLB Endpoint1,并去除GENEVE封装。
- GWLB Endpoint1接受到流量,查看子网关联路由表,匹配到local路由,流量送到APP1。
三、 配置部署
3.1 VPC 配置
3.1.1 创建VPC
创建两个VPC
VPC名称 网段
AppVpc 10.10.0.0/16
SecVpc 10.20.0.0/16
3.1.2 创建IGW关联VPC
创建两个IGW,分别关联上VPC
3.1.3 创建子网
AppVpc 创建4个子网
子网名称 网段 备注
AppVpc-GWLBe1-Subnet 10.10.10.0/24 AZ1 的Gate