天天看點

AWS GWLB內建Palo Alto防火牆

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

AWS GWLB內建Palo Alto防火牆

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、傳輸協定)進行轉發決策。
  1. 防火牆收到GENEVE封包,需要解封裝流量,然後根據防火牆的安全政策決定是否允許流量通過。
  2. 防火牆重新使用GENEVE封裝流量,并發送到GWLB。
  3. GWLB根據 GENEVE TLV字段,選擇轉發到GWLB Endpoint1,并且發送時會去除GENEVE封裝。
  • 為了支援具有重疊 CIDR 的多租戶裝置,裝置需要知道流量的來源。GWLB 還需要跟蹤流量并避免使用者流量的混合。GWLB 可以通過将每個資料包的類型-長度-值 (TLV) 三元組發送到裝置的額外資訊(例如 GWLBE/VPCE ID、附件 ID、流 Cookie)來實作這一點。
  1. 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      
AWS GWLB內建Palo Alto防火牆
3.1.2 建立IGW關聯VPC

建立兩個IGW,分别關聯上VPC

AWS GWLB內建Palo Alto防火牆
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 所在子網      
AWS GWLB內建Palo Alto防火牆

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 的管理接口所在子網,可以通過網際網路直接通路      
AWS GWLB內建Palo Alto防火牆
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上,用于控制入向的流量。

AWS GWLB內建Palo Alto防火牆

AppVpc-Gwlbe-route-table關聯兩個GWLBe子網

AWS GWLB內建Palo Alto防火牆

AppVpc-App1-route-table關聯AZ1的APP

AWS GWLB內建Palo Alto防火牆

AppVpc-App1-route-table關聯AZ2的APP

AWS GWLB內建Palo Alto防火牆

SecVpc建立1個路由表

路由表名稱                 備注
SecVpc-Mgt-route-table    預設路由指向IGW,用于網際網路通路防火牆的管理接口      

SecVpc-Mgt-route-table關聯兩個管理子網。防火牆的資料接口不需要單獨的路由表,因為資料接口主要是和GWLB通過GENVEN隧道通信,當然為資料接口網段單獨建立一個路由表也可以,不用添加任何特殊路由。

AWS GWLB內建Palo Alto防火牆

管理網絡的預設路由指向IGW,為了之後從公網連接配接到防火牆進行初始化。其他路由之後再設定。

AWS GWLB內建Palo Alto防火牆

3.2 建立執行個體

3.2.1 建立paloalto執行個體

在Marketplace搜尋paloalto關鍵詞,選擇​

​VM-Series Next-Generation Firewall Bundle 2​

​AMI。

AWS GWLB內建Palo Alto防火牆

設定執行個體名稱,保持預設建議的執行個體大小。

AWS GWLB內建Palo Alto防火牆

執行個體放置到SecVpc,防火牆的資料接口作為主網卡,放置在​

​SecVpc-GWLB1-Subnet​

​子網。可以使用系統建立的安全組,另外放行了TCP 80,用于偵聽組的健康監測,放行GENEVE協定使用的UDP 6081。

AWS GWLB內建Palo Alto防火牆

再添加一塊網卡,用于防火牆的帶外管理,放置在​

​SecVpc-MGT1-Subnet​

​子網。

AWS GWLB內建Palo Alto防火牆

這裡非常關鍵,源部落格就是坑在了這裡,在安裝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      
AWS GWLB內建Palo Alto防火牆

申請兩個EIP,用于關聯防火牆的管理接口,這樣可以通過網際網路管理防火牆。

AWS GWLB內建Palo Alto防火牆

關聯防火牆的管理接口,注意不要關聯成資料接口了。

AWS GWLB內建Palo Alto防火牆

PA-FW2也是相同的步驟關聯EIP。

AWS GWLB內建Palo Alto防火牆
3.2.2 建立APP執行個體

建立App1,主要用于後續搭建一個HTTP服務,從公網通路測試,這裡使用Amazon Linux AMI,保持預設的執行個體大小即可。

AWS GWLB內建Palo Alto防火牆

執行個體放置在​

​AppVpc-App1-Subnet​

​子網,開啟自動配置設定公網IP,安全組放行TCP 8843,後續的HTTP使用8443端口。

AWS GWLB內建Palo Alto防火牆

建立App2執行個體,這裡使用Window AMI,為了啟動速度快一些,這裡使用了t3.large的執行個體類型。App2執行個體可以用于從公網RDP測試,也可以做為用戶端使用浏覽器測試網際網路通路流量監測。

AWS GWLB內建Palo Alto防火牆

執行個體放置在​

​AppVpc-App2-Subnet​

​子網,允許自動擷取公網IP位址,安全組保持預設放行3389即可。

AWS GWLB內建Palo Alto防火牆

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登入防火牆的管理位址。

AWS GWLB內建Palo Alto防火牆

設定資料接口的虛拟路由器,這裡建立一個安全區域為"untrust"。建立的過程省略了。

AWS GWLB內建Palo Alto防火牆

接口通過DHCP擷取位址。

AWS GWLB內建Palo Alto防火牆

設定資料接口的管理配置檔案,主要是管理接口開啟的服務。

AWS GWLB內建Palo Alto防火牆

開啟HTTP、SSH、Ping服務,這個服務是用于後續偵聽組探測執行個體是否存活用的。

AWS GWLB內建Palo Alto防火牆

接口關聯建立的配置檔案。

AWS GWLB內建Palo Alto防火牆

因為流量都是從相同的接口進出,這裡為了友善,直接修改預設的​

​intrazone-default​

​安全政策。

AWS GWLB內建Palo Alto防火牆

開啟日志,并按照下圖配置安全防護政策。

AWS GWLB內建Palo Alto防火牆

送出配置後上面的操作才會生效。

AWS GWLB內建Palo Alto防火牆
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

AWS GWLB內建Palo Alto防火牆

指定兩台防火牆資料接口所在的子網,GWLB會在這兩個子網建立兩個彈性接口,GENEVE流量實際從這個彈性接口轉發。這裡建立偵聽組。

AWS GWLB內建Palo Alto防火牆

執行個體類型的target會偵聽執行個體的主網卡,因為防火牆的主網卡就是資料接口,是以可以使用Instances類型的target。如果要偵聽非主網卡,那隻能使用IP位址了。

AWS GWLB內建Palo Alto防火牆

實驗環境可以加快監控檢測探測的頻率。

AWS GWLB內建Palo Alto防火牆

将兩台防火牆注冊到偵聽組上。

AWS GWLB內建Palo Alto防火牆

回到建立GWLB的界面,調用剛才建立的偵聽組。

AWS GWLB內建Palo Alto防火牆

确認防火牆的健康檢查正常。

AWS GWLB內建Palo Alto防火牆

啟用GWLB的跨區域負載均衡。

AWS GWLB內建Palo Alto防火牆

3.5 建立Endpoint Service及Endpoint

建立Endpoint Service關聯GWLB,測試環境取消勾選​

​Acceptance required​

​,這樣當Endpoint發起連接配接時,不需要再手動确認一次。

AWS GWLB內建Palo Alto防火牆

記錄Endpoint Service name。

AWS GWLB內建Palo Alto防火牆

建立endpoint,填寫剛才記錄的Endpoint Service name,放置到​

​AppVpc-GWLBe1-Subnet​

​子網。

AWS GWLB內建Palo Alto防火牆

繼續建立endpoint,放置到​

​AppVpc-GWLBe2-Subnet​

​子網。

AWS GWLB內建Palo Alto防火牆

檢視建立的兩個endpoint,記錄endpoint ID,後續修改路由表需要用到。

AWS GWLB內建Palo Alto防火牆

3.6 修改路由表

修改IGW關聯的路由表,控制去往App網段的流量分别送到兩個endpoint上去。

AWS GWLB內建Palo Alto防火牆

修改App1所在子網的路由,預設路由指向Endpoint1。

AWS GWLB內建Palo Alto防火牆

修改App2所在子網的路由,預設路由指向Endpoint2。

AWS GWLB內建Palo Alto防火牆

修改endpoint所在子網的路由,預設路由指向IGW。

AWS GWLB內建Palo Alto防火牆

四、通路測試

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​

​多強制重新整理幾次。

AWS GWLB內建Palo Alto防火牆

檢視PA-FW1上的日志。

AWS GWLB內建Palo Alto防火牆

檢視PA-FW2上的日志。

AWS GWLB內建Palo Alto防火牆

4.2 App2 RDP連接配接測試

通過RDP連接配接到App2上,可以通過浏覽器通路一些網頁制造流量。

AWS GWLB內建Palo Alto防火牆

檢視PA-FW1上的日志。

AWS GWLB內建Palo Alto防火牆

檢視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​​

繼續閱讀