AWS VPC 流量集中检测系列--(3)AWS GWLB集成FortiGate防火墙
B站视频:https://www.bilibili.com/video/BV1ee4y147HK/?spm_id_from=333.999.0.0
一、背景
之前在《AWS GWLB集成paloalto防火墙》里面提到过,AWS GWLB集成FortiGate防火墙的官方博客[1]缺少一些配置,导致无法实现防火墙的高可用。这篇文档来介绍一下AWS GWLB如何集成FortiGate防火墙。
FortiGate防火墙集成AWS GWLB需要注意:
-
FortiGate防火墙建议使用6.4.10版本。经过测试目前使用7.0.7版本无法正常工作,但是从6.4.10升级到7.0.7版本,流量是可以正常转发的。另外,不建议对防火墙执行降级操作,防火墙会丢配置,并且图形化界面可能遇到无法切换VDOM的Bug。所以目前生产环境建议使用6.4.10,7.2.2版本可以用于测试。 -
FortiGate防火墙建议配置VDOM,Fortigate默认没有带外管理接口,也就是所有接口默认都会转发数据流量,通过配置VDOM可以将管理流量与数据流量分离,从而简化路由配置。
二、Fortigate VDOM
FortiGate 中有两种类型的 VDOM 模式——Split VDOM 和 Multi-VDOM 。你可以将一个VDOM理解成一个虚拟的防火墙,不同的VDOM之间,默认情况下路由表、流量等都是隔离的。
Split VDOM:启用Split VDOM 模式[2]后,FortiGate 会产生两个 VDOM,一个root VDOM 和 FG-Traffic VDOM。在Split VDOM 模式下,不能添加新的 VDOM。
这个非常实用的一个模式,激活这个模式能快速的将防火墙的管理平面和数据平面进行分离。但是在7.0.8
版本之后,FortiGate取消了Split VDOM模式。
-
Root:只能允许管理工作,并且有分离的条目。 -
FG-Traffic:可以提供单独的安全策略并允许流量通过 FortiGate,它仅用于数据流量。
激活split-vdom命令:
config system global
set vdom-mode split-vdom
end

Multi-VDOM :在7.0.8
版本之后,只有Multi-VDOM模式[3]。Split VDOM模式更加适合小型网络,快速的分离管理和数据平面。Multi-VDOM更加适合ISP,可以划分多个租户并进行隔离,或者需要进行流量细分的大型网络。
激活Multi-VDOM模式之后,所有的VDOM配置都会迁移到root VDOM下,root VDOM用于管理防火墙,无法删除。一次只能存在一个管理 VDOM。建议管理 VDOM 具有 Internet 访问权限,否则与管理相关的服务(例如 FortiGuard 更新和查询)将无法工作。
激活multi-vdom命令:
config system global
set vdom-mode multi-vdom
end

三、实验环境介绍
这里实验环境与之前的《AWS GWLB集成paloalto防火墙》是一样的,只是替换了防火墙产品。
这里AppVpc模拟业务的VPC,APP进出互联网的流量会被引导到SecVpc内的防火墙做安全检测,防火墙允许通过后,流量才能正常通信。
这次实验的核心组件:
GWLB:Gateway Load Balancer与防火墙建立GENEVE[4]隧道,使用UDP 6081来转发数据,这种封装方式让防火墙不用关闭源/目的地址检查,也不用做源/目的NAT的转换。GWLB会在子网创建一个弹性接口,流量通过这个弹性接口来转发。
GWLBe:Gateway Load Balancer endpoint 是由AWS PrivateLink提供的VPC终端节点,可以作为路由表中的下一跳存在,流量送到GWLBe后,会继续送往GWLB背后的实例。
Ingress Route Table:这个路由表关联在IGW上,路由表一般都是关联在子网,这里是AWS 2019年发布的一个功能VPC Ingress Routing[5],让路由表可以关联到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接受到流量,查看子网关联路由表