AWS VPC 流量集中检测系列--(1)AWS GWLB集成paloalto防火墙

AWS VPC 流量集中检测系列--(1)AWS GWLB集成paloalto防火墙
B站视频

一、背景

1.1 参考的博客

这个文档是我的笔记,最开始是对着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来部署这个环境。

1.2 流量集中检测

传统网络都会在出口部署防火墙,用于检测内网进出互联网的流量。到了AWS云上,这个需求并不太容易实现,因为每个VPC都可以认为是一个独立的网络,有独立的出口。但是对AWS云上的南北向(VPC访问互联网)和东西向(VPC互访)流量做集中检测一直都是比较常见的需求。

流量集中检测架构的核心主要是两个点,一是如何将流量引导到防火墙上,二是防火墙如何实现高可用。

以前常见方法是通过AWS Lambda函数来修改路由表,从而切换流量,并且实现防火墙的高可用。这种方案扩展性不好,而且不太容易实施。

AWS Gateway Load Balancer(GWLB)的出现很好的解决了上面两个问题。AWS PrivateLink提供了新的VPC终端节点GWLB endpoint(GWLBe),它可以做为下一跳路由节点,解决了流量引导的问题。GWLB在防火墙的前面做负载均衡,解决了防火墙高可用的问题。另外关于流量引导,也可结合Transit Gateway来进行引流,可以实现更具扩展性的架构。

二、实验介绍

这里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上,用于控制入向的流量。

GWLB paloalto

APP访问互联网流量路径(红色箭头)

  1. AppVpc内的APP1想要访问Internet上的资源,所在子网关联的路由表将默认路由指向了GWLB Endpoint1。
  2. GWLB Endpoint1 使用 AWS PrivateLink 将流量送到到GWLB,这里流量是由AWS来控制,无需用户配置。
  3. 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、传输协议)进行转发决策。
  4. 防火墙收到GENEVE报文,需要解封装流量,然后根据防火墙的安全策略决定是否允许流量通过。
  5. 防火墙重新使用GENEVE封装流量,并发送到GWLB。
  6. GWLB根据 GENEVE TLV字段,选择转发到GWLB Endpoint1,并且发送时会去除GENEVE封装。
    • 为了支持具有重叠 CIDR 的多租户设备,设备需要知道流量的来源。GWLB 还需要跟踪流量并避免用户流量的混合。GWLB 可以通过将每个数据包的类型-长度-值 (TLV) 三元组发送到设备的额外信息(例如 GWLBE/VPCE ID、附件 ID、流 Cookie)来实现这一点。
  7. GWLB Endpoint1接受到流量,查看子网关联路由表,默认路由指向IGW,流量通过IGW访问Internet。

互联网访问APP的流量路径(蓝色箭头)

  1. 客户发起对App1公网地址的访问,流量到达AppVpc的IGW,IGW查看所关联的路由表,将流量送往GWLB Endpoint1。
  2. GWLB Endpoint1 使用 AWS PrivateLink 将流量送到到GWLB。
  3. GWLB使用GENEVE来封装原始IP流量,并通过UDP 6081转发到实例。
  4. 防火墙收到GENEVE报文,需要解封装流量,然后根据防火墙的安全策略决定是否允许流量通过。
  5. 防火墙重新使用GENEVE封装流量,并发送到GWLB。
  6. GWLB根据 GENEVE TLV字段,选择转发到GWLB Endpoint1,并去除GENEVE封装。
  7. 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

image-20220921103543660

3.1.2 创建IGW关联VPC

创建两个IGW,分别关联上VPCimage-20220921113918034

3.1.3 创建子网

AppVpc 创建4个子网

子网名称				网段					备注
AppVpc-GWLBe1-Subnet	10.10.10.0/24		AZ1 的Gateway Load Balancer Endpoint所在子网
AppVpc-App1-Subnet		10.10.20.0/24		AZ1 App1 所在子网
AppVpc-GWLBe2-Subnet	10.10.30.0/24		AZ2 的Gateway Load Balancer Endpoint所在子网
AppVpc-App2-Subnet		10.10.40.0/24		AZ2 App2 所在子网

image-20220921105143914

SecVpc 创建4个子网

子网名称				网段				备注
SecVpc-GWLB1-Subnet		10.20.10.0/24	AZ1 paloalto 数据接口所在子网,GWLB的接口也在此子网
SecVpc-MGT1-Subnet		10.20.20.0/24	AZ1 paloalto 的管理接口所在子网,可以通过互联网直接访问
SecVpc-GWLB2-Subnet		10.20.30.0/24	AZ2 paloalto 数据接口所在子网,GWLB的接口也在此子网
SecVpc-MGT2-Subnet		10.20.40.0/24	AZ2 paloalto 的管理接口所在子网,可以通过互联网直接访问

image-20220921105910094

3.1.4 创建路由表

这里创建路由表之后,暂时先不修改路由,因为有些路由的下一跳是Endpoint,需要等Endpoint创建完成后再修改路由表。

AppVpc创建4个路由表

路由表名称							备注
AppVpc-Igw-Ingress-route-table		这个路由表关联AppVpcIGW,不关联子网,用于将入向流量引导到endpoint			
AppVpc-Gwlbe-route-table			这个路由表关联两个GWLBe所在的子网,用于将流量从IGW出去
AppVpc-App1-route-table				这是AZ1 App的路由表,默认路由指向AZ1的endpoint
AppVpc-App2-route-table				这是AZ2 App的路由表,默认路由指向AZ2的endpoint

AppVpc-Igw-Ingress-route-table关联IGW。路由表一般都是关联子网,这里是AWS 2019年发布的一个功能VPC Ingress Routing,让路由表可以关联到IGW上,用于控制入向的流量。image-20220921115109559

AppVpc-Gwlbe-route-table关联两个GWLBe子网image-20220921115113783

AppVpc-App1-route-table关联AZ1的APPimage-20220921115119782

AppVpc-App1-route-table关联AZ2的APPimage-20220921115123253

SecVpc创建1个路由表

路由表名称					备注
SecVpc-Mgt-route-table		默认路由指向IGW,用于互联网访问防火墙的管理接口

SecVpc-Mgt-route-table关联两个管理子网。防火墙的数据接口不需要单独的路由表,因为数据接口主要是和GWLB通过GENVEN隧道通信,当然为数据接口网段单独创建一个路由表也可以,不用添加任何特殊路由。image-20220921115634502

管理网络的默认路由指向IGW,为了之后从公网连接到防火墙进行初始化。其他路由之后再设置。image-20220921152230406

3.2 创建实例

3.2.1 创建paloalto实例

在Marketplace搜索paloalto关键词,选择VM-Series Next-Generation Firewall Bundle 2AMI。image-20220921133045730

设置实例名称,保持默认建议的实例大小。image-20220921133050696

实例放置到SecVpc,防火墙的数据接口作为主网卡,放置在SecVpc-GWLB1-Subnet子网。可以使用系统创建的安全组,另外放行了TCP 80,用于侦听组的健康监测,放行GENEVE协议使用的UDP 6081。image-20220921163042812

再添加一块网卡,用于防火墙的带外管理,放置在SecVpc-MGT1-Subnet子网。image-20220921133100458

这里非常关键,源博客就是坑在了这里,在安装aws-gwlb插件是写错了关键词导致插件无法正常安装。这里两条命令的详细含义可以[参见链接5]。

mgmt-interface-swap=enable用于切换防火墙的网卡的映射关系。

  • 默认情况下,AWS 上的ENI eth0映射到paloalto防火墙上的MGT接口,也就是主网卡是管理接口,而ENI eth1映射到paloalto防火墙上的ethernet1/1接口。

  • AWS 负载均衡器可以选择实例或者IP地址作为目标发送流量,如果选择实例作为目标(默认),流量会发送到实例的主接口。

  • 官方文档建议数据口作为防火墙的主接口,所以需要在防火墙内部修改一下接口的映射关系,将AWS eth0映射为数据接口,AWS eth1映射为管理接口。

plugin-op-commands=aws-gwlb-inspect:enable防火墙安装插件,用于处理GWLB的流量。

防火墙启动后,可以使用show plugins vm_series aws gwlb查看插件的安装情况。如果没有安装成功,可以使用request plugins vm_series aws gwlb inspect enable yes命令手动再安装一次。

mgmt-interface-swap=enable
plugin-op-commands=aws-gwlb-inspect:enable

image-20220921133108112

申请两个EIP,用于关联防火墙的管理接口,这样可以通过互联网管理防火墙。image-20220921134853989

关联防火墙的管理接口,注意不要关联成数据接口了。image-20220921153205925

PA-FW2也是相同的步骤关联EIP。image-20220921153242567

3.2.2 创建APP实例

创建App1,主要用于后续搭建一个HTTP服务,从公网访问测试,这里使用Amazon Linux AMI,保持默认的实例大小即可。image-20220921150935832

实例放置在AppVpc-App1-Subnet子网,开启自动分配公网IP,安全组放行TCP 8843,后续的HTTP使用8443端口。image-20220921150942179

创建App2实例,这里使用Window AMI,为了启动速度快一些,这里使用了t3.large的实例类型。App2实例可以用于从公网RDP测试,也可以做为客户端使用浏览器测试互联网访问流量监测。image-20220921150947193

实例放置在AppVpc-App2-Subnet子网,允许自动获取公网IP地址,安全组保持默认放行3389即可。image-20220921150951645

3.3 配置paloalto

3.3.1 paloalto修改默认密码

在AWS上启用Paloalto,需要先SSH登录到防火墙,设置密码,然后才能使用HTTPS登录管理。

使用用户名admin结合密钥的方式登录防火墙,然后按照下面命令修改admin的密码,最后需要commit提交。两台防火墙均按照这个方法重置密码。

Welcome admin.
admin@PA-VM> configure
Entering configuration mode
[edit]
admin@PA-VM# set mgt-config users admin password
Enter password   :
Confirm password :

[edit]
admin@PA-VM# commit

Commit job 2 is in progress. Use Ctrl+C to return to command prompt
.........55%75%98%..............100%
Configuration committed successfully

[edit]
admin@PA-VM#

3.3.2 图形化界面配置PA-FW1

使用HTTPS登录防火墙的管理地址。image-20220921160100297

设置数据接口的虚拟路由器,这里新建一个安全区域为"untrust"。新建的过程省略了。image-20220921160104470

接口通过DHCP获取地址。image-20220921160110089

设置数据接口的管理配置文件,主要是管理接口开启的服务。image-20220921160115093

开启HTTP、SSH、Ping服务,这个服务是用于后续侦听组探测实例是否存活用的。image-20220921160120622

接口关联创建的配置文件。image-20220921160124547

因为流量都是从相同的接口进出,这里为了方便,直接修改默认的intrazone-default安全策略。image-20220921160130883

开启日志,并按照下图配置安全防护策略。image-20220921160136595

提交配置后上面的操作才会生效。image-20220921160140460

3.3.3 命令行配置PA-FW2

图形化的配置方式虽然直观,但效率实在太低,截图也比较冗长。所以第二台防火墙我通过命令行的方式来配置。通过下面命令,paloalto可以实现类似思科show run的操作来查看配置。

admin@PA-VM> set cli config-output-format set
admin@PA-VM> configure
admin@PA-VM# show

将下面的命令刷到PA-FW2上,和上面图形化配置相同。

set network profiles interface-management-profile MgtProfile http yes
set network profiles interface-management-profile MgtProfile ssh yes
set network profiles interface-management-profile MgtProfile ping yes

set network interface ethernet ethernet1/1 layer3 ndp-proxy enabled no
set network interface ethernet ethernet1/1 layer3 sdwan-link-settings upstream-nat enable no
set network interface ethernet ethernet1/1 layer3 sdwan-link-settings upstream-nat static-ip
set network interface ethernet ethernet1/1 layer3 sdwan-link-settings enable no
set network interface ethernet ethernet1/1 layer3 interface-management-profile MgtProfile
set network interface ethernet ethernet1/1 layer3 lldp enable no
set network interface ethernet ethernet1/1 layer3 dhcp-client

set network virtual-router default interface ethernet1/1
set zone untrust network layer3 ethernet1/1

set rulebase default-security-rules rules intrazone-default action allow
set rulebase default-security-rules rules intrazone-default log-start yes
set rulebase default-security-rules rules intrazone-default log-end yes
set rulebase default-security-rules rules intrazone-default profile-setting profiles url-filtering default
set rulebase default-security-rules rules intrazone-default profile-setting profiles file-blocking "strict file blocking"
set rulebase default-security-rules rules intrazone-default profile-setting profiles virus default
set rulebase default-security-rules rules intrazone-default profile-setting profiles spyware strict
set rulebase default-security-rules rules intrazone-default profile-setting profiles vulnerability strict
set rulebase default-security-rules rules intrazone-default profile-setting profiles wildfire-analysis default

commit

Commit job 3 is in progress. Use Ctrl+C to return to command prompt
.........55%70%98%.............100%
Configuration committed successfully
Warning: No valid Antivirus content package exists
(Module: device)

3.4 创建GWLB并关联paloalto

创建Gateway Load Balancerimage-20220921163436613

指定两台防火墙数据接口所在的子网,GWLB会在这两个子网创建两个弹性接口,GENEVE流量实际从这个弹性接口转发。这里创建侦听组。image-20220921163439654

实例类型的target会侦听实例的主网卡,因为防火墙的主网卡就是数据接口,所以可以使用Instances类型的target。如果要侦听非主网卡,那只能使用IP地址了。image-20220921163444406

实验环境可以加快监控检测探测的频率。image-20220921163448677

将两台防火墙注册到侦听组上。image-20220921163453032

回到创建GWLB的界面,调用刚才创建的侦听组。image-20220921163459393

确认防火墙的健康检查正常。image-20220921163506585

启用GWLB的跨区域负载均衡。image-20220921163612230

3.5 创建Endpoint Service及Endpoint

创建Endpoint Service关联GWLB,测试环境取消勾选Acceptance required,这样当Endpoint发起连接时,不需要再手动确认一次。image-20220921173835848

记录Endpoint Service name。image-20220921173902799

创建endpoint,填写刚才记录的Endpoint Service name,放置到AppVpc-GWLBe1-Subnet子网。image-20220921173908163

继续创建endpoint,放置到AppVpc-GWLBe2-Subnet子网。image-20220921173913722

查看创建的两个endpoint,记录endpoint ID,后续修改路由表需要用到。image-20220921173937303

3.6 修改路由表

修改IGW关联的路由表,控制去往App网段的流量分别送到两个endpoint上去。image-20220921174108805

修改App1所在子网的路由,默认路由指向Endpoint1。image-20220921174119659

修改App2所在子网的路由,默认路由指向Endpoint2。image-20220921174133757

修改endpoint所在子网的路由,默认路由指向IGW。image-20220921174221559

四、访问测试

4.1 App1 HTTP访问测试

通过SSH连接到App1上,安装HTTP服务,修改端口为8443。

yum install -y httpd
sed -i.bak 's/Listen 80/Listen 8443/g' /etc/httpd/conf/httpd.conf
echo "<h2>Hello World from $(hostname -f)</h2>" > /var/www/html/index.html
systemctl start httpd.service
systemctl enable httpd.service

访问EC2的公网8443端口测试,在浏览器界面可以使用CTRL+F5多强制刷新几次。image-20220921174613938

查看PA-FW1上的日志。image-20220921174703593

查看PA-FW2上的日志。image-20220921174655252

4.2 App2 RDP连接测试

通过RDP连接到App2上,可以通过浏览器访问一些网页制造流量。image-20220921174522703

查看PA-FW1上的日志。image-20220921174441701

查看PA-FW2上的日志。image-20220921174600927

五、清理实验环境步骤

到上面其实实验已经做完了,既然是实验,肯定是需要清空实验环境的。这个实验有一些依赖调用,有时候不太好删除,另外如果漏删除了EIP和卷,还会持续产生费用。

按照下面步骤可以彻底清空前面所有操作创建的资源,不会有依赖报错。

1. 终止所有实例。
2. 解除AppVpc的4个路由表关联的子网和IGW。
3. 删除AppVpc的4个路由表。
4. 删除2个Endpoint。
5. 删除Endpoint Service。
6. 删除AppVpc。
7. 删除GWLB。
8. 删除SecVpc。
9. 删除Target Group。
10. 释放申请的2个EIP。
11. 删除未清空的EC2卷。

六、参考文档