亚马逊AWS官方博客

使用 FortiGate 和 FortiWeb 为分布式负载提供纵深防御

1 方案概述

作为安全威胁综合防御场景里的最佳实践之一,本案使用的分布式部署架构,通过对入/出站流量的南北、东西静态路径的详尽分析,展现该方案的灵活性、适用性。

2 适配场景

  • 支持多可用区部署。灵活适配单可用区、双可用区和三个可用区的不同业务需求;
  • 解决方案符合并支持“信息安全技术:网络安全等级保护基本要求”(GB/T 22239-2019)(等保);
  • 支持 FortiGate-VM 防火墙、FortiWeb-VM 应用防火墙的灵活部署。可两者联合组网,也可每种产品独立提供解决方案。

3 方案特点

  • 前置防御:FortiGate-VM 防火墙 + AWS Gateway Load Balancer(GWLB),在流量入站时,进入 VPC 的第一时间进行南北向安全检查;
  • 分层防御:FortiGate-VM 作为出口防火墙,应对入侵检测、恶意软件/病毒等安全威胁;FortiWeb-VM 作为 WEB 应用防火墙,提供全面的关键业务防护;
  • 重点防御:FortiWeb-VM 应用防火墙拥有机器学习引擎,能够防御 OWASP Top10 攻击、机器人威胁,提供 API 防护,可以灵活定制、适配应用场景;
  • 南北防护:入站业务流量通过边缘关联拦截进入防火墙做流量清洗,出站返回流量、出站实例流量通过 VPC 路由表引流至防火墙做安全检查;
  • 东西检查:无论是同 VPC,还是同账号下的不同 VPC,可以按实际业务要求,分别采用 Transit Gateway(TGW)或者自定义路由引流至防火墙做流量检查;
  • 架构解耦:在 VPC-Connect + VPC-Security 的解决方案中,将 FortiGate-VM 防火墙分离为独立的 VPC,可以灵活的 Scale-In/Out;FortiWeb-VM 应用防火墙也可以按需要解耦,独立部署;VPC-Connect 可以承担流量入站、出站,从而使业务 VPC 无需暴露在公网。

4 方案架构示意图

5 方案资源规划

  • VPC Connect – Subnets
名称 CIDR 说明
subnet-natgw-az1 172.25.1.0/24 部署有 AZ1 的 NAT Gateway (natgw-az1),用于本方案中的 AZ1 实例的出站
subnet-natgw-az2 172.25.2.0/24 部署有 AZ2 的 NAT Gateway (natgw-az2),用于本方案中的 AZ2 实例的出站
subnet-public-az1 172.25.11.0/24 部署有 nlb-public 在 AZ1 的弹性网卡 eni-nlb-az1,公网 IP 为 161.189.90.30,对应 VPC 的内网 AZ1 的 IP 为 172.25.11.23
subnet-public-az2 172.25.21.0/24 部署有 nlb-public 在 AZ2 的弹性网卡 eni-nlb-az2,公网 IP 为 43.192.17.4,对应 VPC 的内网 AZ2 的 IP 为 172.25.21.220
subnet-gwlbe-az1 CIDR 无须展示,请自行定义 部署有 GWLB 在 AZ1 的 Endpoint,对应的弹性网卡为 gwlbe-hub-az1
subnet-gwlbe-az2 部署有 GWLB 在 AZ2 的 Endpoint,对应的弹性网卡为 gwlbe-hub-az2
subnet-tgw-az1 CIDR 无须展示,请自行定义 Transit Gateway,即 TGW 在 AZ1 的 Landing Subnet,部署有 TGW 在 VPC Connect 的 landing 弹性网卡 eni-tgw-hub-landing-az1
subnet-tgw-az2 Transit Gateway,即 TGW 在 AZ2 的 Landing Subnet,部署有 TGW 在 VPC Connect 的 landing 弹性网卡 eni-tgw-hub-landing-az2
  • VPC Connect – 路由表
名称 关联的 SUBNETs 说明
VPC Edge Association N/A 控制 VPC Connect 的入站路由,即当有目标是 natgw-az1 (172.25.1.0/24)、nagw-az2 (172.25.2.0/24)、nlb-public-az1 (172.25.11.0/24)、nlb-public-az2 (172.25.21.0/24)的入站流量时,流量会被转发到对应 AZ 的 GWLB Endpoint (gwlbe-az*)
rtb-natgw-az1 subnet-natgw-az1 控制 subnet-natgw 的出站路由表
rtb-natgw-az2 subnet-natgw-az2
rtb-public-az1 subnet-public-az1 控制 subnet-public 的出站路由表,subnet-public 部署有 AWS NLB
rtb-public-az2 subnet-public-az2
rtb-gwlbe

subnet-gwlbe-az1

subnet-gwlbe-az2

控制 GWLB endpoint 的出站路由表
rtb-tgw-az1 subnet-tgw-az1 控制 TGW landing 弹性网卡的出站路由表
rtb-tgw-az2 subnet-tgw-az2
  • VPC Security – Subnets
名称 CIDR 说明
subnet-mgmt-az1 CIDR 无须展示,请自行定义 部署有 FortiGate-VM 的 port1 网卡,用于 FortiGate 的许可激活、特征库更新等,仅有管理流量,不承载业务流量
subnet-mgmt-az2
subnet-gwlb-az1 CIDR 无须展示,请自行定义 部署有 FortiGate-VM 的 port2 网卡,用于通过 GENEVE 协议与 AWS 的 GWLB 连接;同时图 1 中的 GWLB 也部署并关联这两个 subnets
subnet-gwlb-az2
  • VPC Security – 路由表
名称 关联的 SUBNETs 说明
rtb-fgt-mgmt

subnet-mgmt-az1

subnet-mgmt-az2

FortiGate-VM 的 port1 作为 out-of-band 管理端口,在本方案中,可以绑定弹性 IP,默认路由指向 igw;

FortiGate-VM 的 port2 使用的是 VPC Security 的主路由表,隐式关联 port2 所在的 subnets,无需指定额外的路由。

  • VPC Spoke1 & VPC Spoke2 – Subnets
名称 CIDR 说明
subnet-spoke1-private-az1 CIDR 无须展示,请自行定义

在本文的 DEMO 方案中部署有 FortiWeb-VM,每个可用区一台 VM;

同时部署有 TGW 在 VPC Spoke1 的 Landing 弹性网卡,每个可用区一个

subnet-spoke1-private-az2
subnet-spoke2-private-az1 CIDR 无须展示,请自行定义

在本文的 DEMO 方案中部署有模拟 WEB 应用的 EC2 实例,每个可用区一台 VM;

实际生产环境中,WEB 应用实例可以与 FortiWeb-VM 一同部署在同一个 VPC,如 VPC Spoke1 中,而 Spoke2 也可以用来部署数据库实例等;

同时部署有 TGW 在 VPC Spoke2 的 Landing 弹性网卡,每个可用区一个

subnet-spoke2-private-az2
  • VPC Spoke1 & VPC Spoke2 – 路由表
名称 关联的 SUBNETs 说明
rtb-spoke1-private

subnet-spoke1-private-az1

subnet-spoke1-private-az2

控制 VPC Spoke1 和 VPC Spoke2 中实例的出站路由表,本文的 DEMO 方案中,该路由表的默认路由均指向 TGW
rtb-spoke2-private

subnet-spoke2-private-az1

subnet-spoke2-private-az2

  • TGW – 路由表
名称 关联的 VPC 说明
tgw-rtb-vpc-connect VPC Connect VPC Connect 与 TGW 关联的路由表,用于转发从 VPC Connect 的 TGW Landing 路由表过来的流量
tgw-rtb-vpc-spoke

VPC Spoke1

VPC Spoke2

VPC Spoke1,VPC Spoke2 与 TGW 关联的路由表,用于转发从这两个 VPC 的 TGW Landing 路由表过来的流量

6 方案部署说明

  • 首先创建名为 nlb-public 的 Load Balancer,其 type 为 network,而非 application,因为方案中使用了 FortiWeb-VM,即 Fortinet 的 WAF 产品,所以负载均衡选择了 NLB。
  • 根据方案架构示意图和方案资源规划,创建 VPC 并按照说明完成相关配置,VPC 组成、子网(subnet)组成、VPC 路由表以及 TGW 路由表的功能如下:

1. VPC Connect (172.25.0.0/16)

此 VPC 内通常不部署 EC2 实例,或者可以将部署在 VPC Spoke1 中的 WAF 实例 FortiWeb,前移至此 VPC,挂载在 NLB 的目标组(Target Group)中;

NAT 网关:用于整个方案中其它 VPC 的 Internet 出站服务

NLB:提供负载均衡服务

GWLB Endpoint:部署在 VPC Security 的 GWLB 在此 VPC 的Service Endpoint

TGW Landing:Transit Gateway(TGW)在此 VPC 的 Landing 弹性网卡

2. VPC Security (192.168.0.0/16)

此 VPC 内部署有 FortiGate-VM;

通常是分配两个弹性网卡,port1 和 port2。

其中 port1 用于管理,绑定弹性 IP;port2 用于流量检查,通过 GENEVE 隧道与 GWLB 连接。

3. VPC Spoke1 (10.10.0.0/16) 和 VPC Spoke2 (10.20.0.0/16)

上述两个 VPC 内部署业务实例,如作为 WAF 的 FortiWeb,以及测试用的 WEB 服务实例。

7 方案效果展示

7.1 用户访问应用的场景

我们把作为 WAF 的 FortiWeb 部署在 VPC Spoke1 中,将应用实例放在了 VPC Spoke2 中,因此用户访问应用的流量路径是从 Spoke1 的 FortiWeb 到挂载在 Spoke2 的真实 WEB 服务器实例的过程,既有应用入站的南北流量安全检查的过程,也有两个 VPC 间的东西流量安全检查的过程,如下:

7.1.1 应用入站的流量路径:南北流量安全检查

1. 用户访问 NLB 的公网 DNS,如下图所示的 nlb-public-xxxxx---elb---cn-northwest-1.amazonaws.com.rproxy.goskope.com.cn,IP 解析为 161.189.90.30 和 43.192.17.4,Internet Gateway (IGW)将上述两个公网 IP 映射为 VPC Connect 的内网 IP 172.25.11.23 和 172.25.21.220

2. 通过 IGW 后的流量,目标地址是 NLB 在不同可用区的内网地址,即 172.25.11.23 或 172.25.21.220。查询 VPC Connect 的边缘关联(Edge Association)路由表,命中用户定义路由(UDR,User Defined Route)172.25.11.0/24 或 172.25.21.0/24,将前往 NLB 的流量拦截并转发至 GWLB Endpoint(gwlbe-hub)

3. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe

4. 返回 subnet-gwlbe 的流量,此时目标地址不变,仍然是 172.25.11.23 或 172.25.21.220。查询路由表 rtb-gwlbe,命中 VPC 的 Local 路由,VPC 会将流量从 gwlbe-hub 转发至 NLB 对应可用区的弹性网卡 eni-nlb

5. NLB 根据监听的端口,将流量转发至目标组(Target Group)的实例。本文方案中,NLB 的 Target Group 挂载了 FortiWeb,CIDR 为 10.10.0.0/16,位于 VPC Spoke1 的多个可用区中。此时,经过 NLB 的处理,目标地址变为 FortiWeb 的内网 IP。查询路由表 rtb-public,命中 UDR-10.10.0.0/16,转发至 tgw

6. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.10.0.0/16 (spoke1),转发至 VPC Spoke1

7. 流量到达 VPC Spoke1 中的 TGW Landing 弹性网卡 eni-tgw-spoke1-landing

8. 查询 eni-tgw-spoke1-landing 所在 subnet-spoke1-private 的路由表 rtb-spoke1-private,命中 VPC 的 Local 路由,到达 FortiWeb 实例

7.1.2 FortiWeb 到真实 Web 服务器的流量路径:东西流量安全检查

1. 流量经过 FortiWeb 的内容路由(content routing),转发至真实 WEB 服务器实例,目标地址为 Spoke2 的 CIDR(10.20.0.0/16)。查询 subnet-spoke1-private 关联的路由表 rtb-spoke1-private,命中 UDR 默认路由,转发至 tgw

2. 流量从 TGW 在 VPC Spoke1 的弹性网卡 eni-tgw-spoke1-landing 进入 TGW

3. 查询 VPC Spoke1 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect

4. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing

5. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命中 UDR-10.20.0.0/16 (spoke2),转发至 gwlbe-hub

6. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做东西流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe

7. 返回 subnet-gwlbe 的流量,目标地址不变,仍然是 WEB 服务器实例所在的 Spoke2 的 10.20.0.0/16。查询路由表 rtb-gwlbe,命中 UDR-10.20.0.0/16,转发至 tgw

8. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.20.0.0/16,转发至 VPC Spoke2

9. 流量到达 VPC Spoke2 中的 TGW Landing 弹性网卡 eni-tgw-spoke2-landing

10. 查询 eni-tgw-spoke2-landing 所在 subnet-spoke2-private 的路由表 rtb-spoke2-private,命中 VPC 的 Local 路由,到达真实 WEB 服务器

7.1.3 真实 Web 服务器到 FortiWeb 的流量路径:东西流量安全检查

1. 返回流量的目标为 FortiWeb,目标 IP 为 FortiWeb 所在的 VPC Spoke1 的 CIDR(10.10.0.0/16),命中 rtb-spoke2-private 的 UDR 默认路由,转发至 tgw

2. 查询 VPC Spoke2 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect

3. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing

4. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命中 UDR-10.10.0.0/16 (spoke1),转发至 gwlbe-hub

5. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做东西流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe

6. 返回 subnet-gwlbe 的流量,目标地址不变,仍然是 FortiWeb 实例所在的 Spoke1 的 10.10.0.0/16。查询路由表 rtb-gwlbe,命中 UDR-10.10.0.0/16,转发至tgw

7. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.10.0.0/16,转发至 VPC Spoke1

8. 流量到达 VPC Spoke1 中的 TGW Landing 弹性网卡 eni-tgw-spoke1-landing

9. 查询 eni-tgw-spoke1-landing 所在 subnet-spoke1-private 的路由表 rtb-spoke1-private,命中 VPC 的 Local 路由,返回 FortiWeb

7.1.4 应用出站的流量路径:南北流量安全检查

1. 流量经过 FortiWeb 处理,准备返回 NLB,目标为 NLB 弹性网卡所在的 VPC Connect 子网 subnet-public 的 CIDR(172.25.11.0/24 或 172.25.21.0/24)。查询 subnet-spoke1-private 关联的路由表 rtb-spoke1-private,命中 UDR 默认路由,转发至 tgw

2. 流量从 TGW 在 VPC Spoke1 的弹性网卡 eni-tgw-spoke1-landing 进入 TGW

3. 查询 VPC Spoke1 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect

4. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing

5. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命 VPC 的 Local 路由

6. 流量从 subnet-tgw 发送至 subnet-public,到达 NLB

7. 经过 NLB 的处理,从 FortiWeb 返回的流量,目标地址变为访问 nlb-public-xxxxx---elb---cn-northwest-1.amazonaws.com.rproxy.goskope.com.cn 时的 Client IP,查询路由表 rtb-public,命中 UDR 默认路由,转发至 gwlbe-hub

8. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做出站的南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe

9. 返回 subnet-gwlbe 的流量,目标地址不变,仍然是访问 NLB 的 Client IP。查询路由表 rtb-gwlbe,命中 UDR 默认路由,从 IGW 出站。

7.2 EC2 访问互联网的场景

VPC Spoke1和VPC Spoke2内的EC2实例需要访问Internet资源,如FortiWeb访问FortiGuard更新特征库、WEB服务器升级更新系统补丁等。

7.2.1 服务器出站的流量路径:南北流量安全检查

1. VPC Spoke2 内的 web-srv 实例访问 Internet 资源,命中路由表 rtb-spoke2-private 中的 UDR 默认路由,转发至 tgw

2. 查询 VPC Spoke2 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect

3. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing

4. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命中 UDR 默认路由,转发至 NAT 网关(natgw)

5. 流量从 subnet-tgw 发送至 subnet-natgw,到达 NAT 网关

6. 查询 subnet-natgw 关联的路由表 rtb-natgw,命中 UDR 默认路由,转发至 gwlbe-hub

7. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe

8. 返回 subnet-gwlbe 的流量,目标仍然是 Internet 资源。查询路由表 rtb-gwlbe,命中 UDR 默认路由,从 IGW 出站

7.2.2 服务器出站流量的返回路径:南北流量安全检查

1. 上一步 8 的返回流量到达 IGW

2. 通过 IGW 后的流量,此时目标地址是部署在不同可用区的 NAT 网关的内网地址,即 CIDR 172.25.1.0/24 或 172.25.2.0/24 范围内。查询 VPC Connect 的边缘关联(Edge Association)路由表,命中 UDR 中 172.25.1.0/24 或 172.25.2.0/24,将前往 NAT 网关的流量拦截并转发至 GWLB Endpoint(gwlbe-hub)

3. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe

4. 返回 subnet-gwlbe 的流量,目标仍然是对应可用区的 NAT 网关(natgw)。查询路由表 rtb-gwlbe,命中 VPC 的 Local 路由,转发至 subnet-natgw 中的 NAT 网关

5. 流量经过 NAT 网关处理,目标变为 VPC Spoke2 的 web-srv 内网地址,即在 10.20.0.0/16 中。查询路由表 rtb-natgw,命中 UDR-10.20.0.0/16,转发至 TGW

6. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.20.0.0/16,转发至 VPC Spoke2

7. 流量到达 VPC Spoke2 中的 TGW Landing 弹性网卡 eni-tgw-spoke2-landing

8. 查询 eni-tgw-spoke2-landing 所在 subnet-spoke2-private 的路由表 rtb-spoke2-private,命中 VPC 的 Local 路由

9. 流量返回 web-srv 实例,完成 Internet 访问。

您可以在亚马逊云科技 Marketplace 中订阅并采购本方案中的 Fortinet 相关产品:

FortiGate:

BYOL(Graviton):FortiGate Next-Generation Firewall (ARM64/Graviton)

BYOL:FortiGate Next-Generation Firewall (BYOL)

FortiWeb:

FortiWeb Web Application Firewall WAF VM (BYOL)

本篇作者

沈中南

Fortinet 中国区高级安全顾问,AWS 认证 Solutions Architecture – Professional,10 年以上企业级网络安全和云服务经验。有丰富的企业级 SD-WAN 和云安全架构设计经验。

岑义涛

Fortinet 亚太区产品市场总监,亚马逊云科技大使。10 年以上企业级网络安全和云服务经验。在云、网、安全融合方面有丰富的规划与实践经验。

刘瀚文

高级产品技术专家,亚马逊云科技产品部网络方向。负责基于 AWS 的云计算网络方案架构的咨询和设计,现致力于网络和 Network-as-a- Service 相关领域的研究。在加入 AWS 之前,在思科中国担任高级系统工程师,负责运营商方案咨询和架构设计,在运营商组网和大企业基础网络方面有丰富经验。

张元涛

亚马逊云科技高级架构师。负责亚马逊云科技合作伙伴相关解决方案的建设以及合作伙伴生态合作。与合作伙伴一起,根据客户需求,分析其在技术架构层面所遇到的挑战和未来的方向,设计和落地基于亚马逊云科技平台和合作伙伴产品的架构方案。曾在知名外企以及国内领导企业任解决方案架构师。在云以及网络等领域有丰富的经验,对于公有云服务以及架构有深入的理解。