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 的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上的日志。
五、清理實驗環境步驟
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