AWS VPC 流量集中检测系列--(1)AWS GWLB集成paloalto防火墙
一、背景
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上,用于控制入向的流量。
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 的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 所在子网
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 的管理接口所在子网,可以通过互联网直接访问
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上,用于控制入向的流量。
AppVpc-Gwlbe-route-table关联两个GWLBe子网
AppVpc-App1-route-table关联AZ1的APP
AppVpc-App1-route-table关联AZ2的APP
SecVpc创建1个路由表
路由表名称 备注
SecVpc-Mgt-route-table 默认路由指向IGW,用于互联网访问防火墙的管理接口
SecVpc-Mgt-route-table关联两个管理子网。防火墙的数据接口不需要单独的路由表,因为数据接口主要是和GWLB通过GENVEN隧道通信,当然为数据接口网段单独创建一个路由表也可以,不用添加任何特殊路由。
管理网络的默认路由指向IGW,为了之后从公网连接到防火墙进行初始化。其他路由之后再设置。
3.2 创建实例
3.2.1 创建paloalto实例
在Marketplace搜索paloalto关键词,选择VM-Series Next-Generation Firewall Bundle 2
AMI。
设置实例名称,保持默认建议的实例大小。
实例放置到SecVpc,防火墙的数据接口作为主网卡,放置在SecVpc-GWLB1-Subnet
子网。可以使用系统创建的安全组,另外放行了TCP 80,用于侦听组的健康监测,放行GENEVE协议使用的UDP 6081。
再添加一块网卡,用于防火墙的带外管理,放置在SecVpc-MGT1-Subnet
子网。
这里非常关键,源博客就是坑在了这里,在安装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
申请两个EIP,用于关联防火墙的管理接口,这样可以通过互联网管理防火墙。
关联防火墙的管理接口,注意不要关联成数据接口了。
PA-FW2也是相同的步骤关联EIP。
3.2.2 创建APP实例
创建App1,主要用于后续搭建一个HTTP服务,从公网访问测试,这里使用Amazon Linux AMI,保持默认的实例大小即可。
实例放置在AppVpc-App1-Subnet
子网,开启自动分配公网IP,安全组放行TCP 8843,后续的HTTP使用8443端口。
创建App2实例,这里使用Window AMI,为了启动速度快一些,这里使用了t3.large的实例类型。App2实例可以用于从公网RDP测试,也可以做为客户端使用浏览器测试互联网访问流量监测。
实例放置在AppVpc-App2-Subnet
子网,允许自动获取公网IP地址,安全组保持默认放行3389即可。
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登录防火墙的管理地址。
设置数据接口的虚拟路由器,这里新建一个安全区域为"untrust"。新建的过程省略了。
接口通过DHCP获取地址。
设置数据接口的管理配置文件,主要是管理接口开启的服务。
开启HTTP、SSH、Ping服务,这个服务是用于后续侦听组探测实例是否存活用的。
接口关联创建的配置文件。
因为流量都是从相同的接口进出,这里为了方便,直接修改默认的intrazone-default
安全策略。
开启日志,并按照下图配置安全防护策略。
提交配置后上面的操作才会生效。
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 Balancer
指定两台防火墙数据接口所在的子网,GWLB会在这两个子网创建两个弹性接口,GENEVE流量实际从这个弹性接口转发。这里创建侦听组。
实例类型的target会侦听实例的主网卡,因为防火墙的主网卡就是数据接口,所以可以使用Instances类型的target。如果要侦听非主网卡,那只能使用IP地址了。
实验环境可以加快监控检测探测的频率。
将两台防火墙注册到侦听组上。
回到创建GWLB的界面,调用刚才创建的侦听组。
确认防火墙的健康检查正常。
启用GWLB的跨区域负载均衡。
3.5 创建Endpoint Service及Endpoint
创建Endpoint Service关联GWLB,测试环境取消勾选Acceptance required
,这样当Endpoint发起连接时,不需要再手动确认一次。
记录Endpoint Service name。
创建endpoint,填写刚才记录的Endpoint Service name,放置到AppVpc-GWLBe1-Subnet
子网。
继续创建endpoint,放置到AppVpc-GWLBe2-Subnet
子网。
查看创建的两个endpoint,记录endpoint ID,后续修改路由表需要用到。
3.6 修改路由表
修改IGW关联的路由表,控制去往App网段的流量分别送到两个endpoint上去。
修改App1所在子网的路由,默认路由指向Endpoint1。
修改App2所在子网的路由,默认路由指向Endpoint2。
修改endpoint所在子网的路由,默认路由指向IGW。
四、访问测试
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
多强制刷新几次。
查看PA-FW1上的日志。
查看PA-FW2上的日志。
4.2 App2 RDP连接测试
通过RDP连接到App2上,可以通过浏览器访问一些网页制造流量。
查看PA-FW1上的日志。
查看PA-FW2上的日志。
五、清理实验环境步骤
到上面其实实验已经做完了,既然是实验,肯定是需要清空实验环境的。这个实验有一些依赖调用,有时候不太好删除,另外如果漏删除了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卷。
六、参考文档
-
**[1] 使用Gateway Load Balancer和Palo alto防火墙实现集中的网络流量深度检测:**https://aws.amazon.com/cn/blogs/china/centralized-network-traffic-depth-detection-using-gateway-load-balancer-and-palo-alto-firewalls/
-
**[2] 亚马逊云科技(中国区)网关负载均衡服务集成FortiGate安全网关扩展安全服务性能:**https://aws.amazon.com/cn/blogs/china/gateway-load-balancing-services-integrate-fortigate-security-gateways/
-
**[3] RFC 8926 Geneve: Generic Network Virtualization Encapsulation:**https://www.rfc-editor.org/rfc/rfc8926
-
**[4] New – VPC Ingress Routing – Simplifying Integration of Third-Party Appliances:**https://aws.amazon.com/cn/blogs/aws/new-vpc-ingress-routing-simplifying-integration-of-third-party-appliances
-
**[5] Management Interface Mapping for Use with Amazon ELB:**https://docs.paloaltonetworks.com/vm-series/10-2/vm-series-deployment/set-up-the-vm-series-firewall-on-aws/about-the-vm-series-firewall-on-aws/management-interface-mapping-for-use-with-amazon-elb#id7e1c2653-88af-4a85-8bb8-aae1847c0d9f
-
**paloalto Viewing the configuration in set and XML format:**https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA10g000000ClHoCAK
-
**Integrate your custom logic or appliance with AWS Gateway Load Balancer:**https://aws.amazon.com/cn/blogs/networking-and-content-delivery/integrate-your-custom-logic-or-appliance-with-aws-gateway-load-balancer/
-
**Introducing AWS Gateway Load Balancer – Easy Deployment, Scalability, and High Availability for Partner Appliances:**https://aws.amazon.com/cn/blogs/aws/introducing-aws-gateway-load-balancer-easy-deployment-scalability-and-high-availability-for-partner-appliances/
-
**GeneveProxy - an AWS Gateway Load Balancer reference application:**https://www.sentiatechblog.com/geneveproxy-an-aws-gateway-load-balancer-reference-application