1. 簡介
Google Cloud HTTP(S) 負載平衡服務部署於 Google 遍布全球的網路連接點 (POP) 邊緣。當使用者流量導向 HTTP(S) 負載平衡器時,會由離使用者最近的 POP 接收,接著透過 Google 的全球網路平衡負載,再傳至處理能力充足且距離最近的後端。
Cloud Armor 是 Google 的分散式阻斷攻擊偵測系統,具備網頁應用程式防火牆 (WAF) 功能,Cloud Armor 與 Google Cloud HTTP 負載平衡器緊密整合,可讓您檢查傳入流量,找出不當要求。這項服務的速率限制功能可根據要求量減少後端資源的流量,並防止不必要的流量耗用虛擬私有雲 (VPC) 網路的資源。
在本研究室中,您會設定具有全域後端的 HTTP 負載平衡器,如下圖所示。然後對負載平衡器進行壓力測試,並新增 Cloud Armor 頻率限制政策,限制傳送至後端資源的流量。

課程內容
- 如何設定 HTTP 負載平衡器與適當的健康狀態檢查。
- 如何建立 Cloud Armor 頻率限制政策。
- 如何驗證從 VM 執行壓力測試時,頻率限制政策會封鎖流量。
軟硬體需求
- 具備基本網路和 HTTP 知識
- 基本的 Unix/Linux 指令列知識
2. 設定和需求條件
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串,您隨時可以更新。
- 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要理會該字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID),因此如果您不喜歡該字串,可以產生另一個隨機字串,或是嘗試使用自己的字串,看看是否可用。專案建立後,系統就會「凍結」這項設定。 - 還有第三個值,也就是部分 API 使用的「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要停用資源,避免在本教學課程結束後繼續產生帳單費用,請按照程式碼研究室結尾的「清除」操作說明操作。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
啟動 Cloud Shell
雖然您可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。
在 GCP 主控台,按一下右上角工具列的 Cloud Shell 圖示:

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

這部虛擬機器已預先安裝所有必要的開發工具,並提供永久的 5 GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您只要使用瀏覽器,就能完成本實驗室的所有工作。
事前準備
在 Cloud Shell 中,確認專案 ID 是否已設定完畢
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
啟用 API
啟用所有必要服務
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. 設定防火牆規則,允許 HTTP 流量傳送至後端
設定防火牆規則,允許 Google Cloud 健康狀態檢查與負載平衡器的 HTTP 流量傳至後端。
我們將使用專案中建立的 default 虛擬私有雲網路。建立防火牆規則,允許 HTTP 流量傳送至後端。健康狀態檢查會判斷負載平衡器的哪些執行個體能接收新連線。以 HTTP 負載平衡來說,對達到負載平衡的執行個體執行健康狀態檢查探測時,探測要求的來源位址範圍為 130.211.0.0/22 和 35.191.0.0/16。虛擬私有雲防火牆規則必須允許這類連線。負載平衡器也會使用同一個 IP 範圍與後端通訊。
- 前往 Cloud 控制台,依序點選「導覽選單」圖示
>「虛擬私有雲網路」 >「防火牆」。

- 頁面上可看到現有的 ICMP、internal、RDP 和 SSH 防火牆規則。每項 Google Cloud 雲端專案一開始都有 default 網路和這些防火牆規則。
- 按一下「建立防火牆規則」。
- 設定下列值,其他屬性均保留預設值:
屬性 | 值 (按照指示輸入值或選取選項) |
名稱 | default-allow-health-check |
網路 | default |
目標 | 指定的目標標記 |
目標標記 | http-server |
來源篩選器 | IP 範圍 |
來源 IP 範圍 | 130.211.0.0/22 和 35.191.0.0/16 |
通訊協定和通訊埠 | 指定的通訊協定和通訊埠:勾選「TCP」 |
- 點選「建立」。
或者,如果您使用 gcloud 指令列,指令如下:
gcloud compute firewall-rules create default-allow-health-check --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=http-server
4. 設定執行個體範本並建立代管執行個體群組
代管執行個體群組會使用執行個體範本,建立一組相同的執行個體。請使用這些執行個體來建立 HTTP 負載平衡器的後端。
設定執行個體範本
執行個體範本是一種 API 資源,可用來建立 VM 執行個體和代管執行個體群組。執行個體範本會定義機型、開機磁碟映像檔、子網路、標籤和其他執行個體屬性。請為 us-east1 和 europe-west1 分別建立一個執行個體範本。
- 在 Cloud 控制台,依序點選「導覽選單」圖示
>「Compute Engine」>「執行個體範本」>「建立執行個體範本」。 - 在「名稱」部分,輸入 us-east1-template。
- 為「系列」選取 N1。
- 按一下「網路、磁碟、安全性、管理、單一用戶群」。

- 前往「管理」部分 -

- 在「中繼資料」下方,點選「新增項目」並指定下列設定:
金鑰 | 值 |
startup-script-url | gs://cloud-training/gcpnet/httplb/startup.sh |
- 點選「網路」。
- 設定下列值,其他屬性均保留預設值:
屬性 | 值 (按照指示輸入值或選取選項) |
網路 (位於「網路介面」下方) | 預設 |
子網路 (位於「網路介面」下方) | 預設 (us-east1) |
網路標記 | http-server |
- 點選「建立」。
- 等待執行個體範本建立完成。
接著複製 us-east1-template,為 subnet-b 建立另一個執行個體範本:
- 依序點選「us-east1-template」和頂端的「複製」選項。
- 在「名稱」部分,輸入 europe-west1-template。
- 按一下「網路、磁碟、安全性、管理、單一用戶群」。
- 點選「網路」。
- 在「網路介面」下方,編輯預設介面。在「子網路」部分,選取「default (europe-west1)」。
- 點選「建立」。
建立代管執行個體群組
在 us-east1 和 europe-west1 各建立一個代管執行個體群組。
- 一樣在「Compute Engine」頁面,點選左選單中的「執行個體群組」。

- 按一下「建立執行個體群組」。選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。
- 設定下方的值,其他屬性均保留預設值:
屬性 | 值 (按照指示輸入值或選取選項) |
名稱 | us-east1-mig |
位置 | 多可用區 |
區域 | us-east1 |
執行個體範本 | us-east1-template |
「自動調度資源」>「自動調度資源政策」> 點選「鉛筆」圖示 >「指標類型」 | CPU 使用率 |
目標 CPU 使用率 | 80,然後按一下「完成」。 |
等待期 | 45 |
執行個體數量下限 | 1 |
執行個體數量上限 | 5 |
- 點選「建立」。
接著執行相同程序,為 europe-west1 的 europe-west1-mig 建立第二個執行個體群組:
- 點選「建立執行個體群組」。
- 設定下方的值,其他屬性均保留預設值:
屬性 | 值 (按照指示輸入值或選取選項) |
名稱 | europe-west1-mig |
位置 | 多可用區 |
區域 | europe-west1 |
執行個體範本 | europe-west1-template |
「自動調度資源」>「自動調度資源政策」> 點選「鉛筆」圖示 >「指標類型」 | CPU 使用率 |
目標 CPU 使用率 | 80,然後按一下「完成」。 |
等待期 | 45 |
執行個體數量下限 | 1 |
執行個體數量上限 | 5 |
- 點選「建立」。
5. 設定 HTTP 負載平衡器
設定 HTTP 負載平衡器,平衡兩個後端之間的流量 (後端分別為 us-east1 的 us-east1-mig 和 europe-west1 的 europe-west1-mig),如下方網路圖表所示:

開始設定
- 前往 Cloud 控制台,依序點選「導覽選單」圖示
>「網路服務」>「負載平衡」>「建立負載平衡器」。 - 在「HTTP(S) 負載平衡」下方,按一下「開始設定」。

- 選取「From Internet to my VMs」(從網際網路到我的 VM)、「Classic HTTP(S) Load Balancer」(傳統版 HTTP(S) 負載平衡器),然後按一下「Continue」(繼續)。
- 將「Name」(名稱) 設為 http-lb。
設定後端
後端服務會將傳入流量導向一或多個連接的後端。每個後端都有執行個體群組,以及其他負載能力中繼資料。
- 點選「後端設定」。
- 在「後端服務和後端 bucket」部分,點選「建立後端服務」。
- 設定下列值,其他屬性均保留預設值:
屬性 | 值 (依指示選取選項) |
名稱 | http-backend |
執行個體群組 | us-east1-mig |
通訊埠編號 | 80 |
平衡模式 | 頻率 |
每秒要求數上限 | 50 (每個執行個體) |
容量 | 100 |
- 按一下「完成」。
- 點選「新增後端」。
- 設定下方的值,其他屬性均保留預設值:
屬性 | 值 (依指示選取選項) |
執行個體群組 | europe-west1-mig |
通訊埠編號 | 80 |
平衡模式 | 使用率 |
後端使用率上限 | 80 |
容量 | 100 |
- 按一下「完成」。
- 在「健康狀態檢查」部分,選取「建立健康狀態檢查」。

- 設定下方的值,其他屬性均保留預設值:
屬性 | 值 (依指示選取選項) |
名稱 | http-health-check |
通訊協定 | TCP |
通訊埠 | 80 |

- 按一下 [儲存]。
- 勾選「啟用記錄功能」方塊。
- 將「取樣率」設為 1:

- 按一下 [Create] (建立) 即可建立後端服務。

設定前端
主機與路徑規則會決定流量的導向方式。舉例來說,您可以將影片流量導向其中一個後端,並將靜態內容流量導向另一個後端。不過,本實驗室無須設定「主機與路徑規則」。
- 點選「前端設定」。
- 指定下方的值,其他屬性均保留預設值:
屬性 | 值 (按照指示輸入值或選取選項) |
通訊協定 | HTTP |
IP 版本 | IPv4 |
IP 位址 | 暫時 |
通訊埠 | 80 |
- 點選「完成」。
- 點選「新增前端 IP 和通訊埠」。
- 指定下方的值,其他屬性均保留預設值:
屬性 | 值 (按照指示輸入值或選取選項) |
通訊協定 | HTTP |
IP 版本 | IPv6 |
IP 位址 | 暫時 |
通訊埠 | 80 |
- 點選「完成」。
檢查並建立 HTTP 負載平衡器
- 點選「檢查並完成」。

- 檢查「後端服務」和「前端」。

- 點選「建立」。
- 等待負載平衡器建立完成。
- 點選負載平衡器的名稱 (http-lb)。
- 記下負載平衡器的 IPv4 和 IPv6 位址,下一個工作會用到。這兩個 IP 位址分別為 [LB_IP_v4] 和 [LB_IP_v6]。
6. 測試 HTTP 負載平衡器
為後端建立 HTTP 負載平衡器後,接著要確認流量是否會轉送至後端服務。
存取 HTTP 負載平衡器
在瀏覽器開啟新分頁並前往 http://[LB_IP_v4],測試能否透過 IPv4 存取 HTTP 負載平衡器。請務必將負載平衡器的 IPv4 位址換成 [LB_IP_v4]。
如果您有本機 IPv6 位址,可以前往 http://[LB_IP_v6],測試能否透過 IPv6 位址存取 HTTP 負載平衡器。請務必將 [LB_IP_v6] 改成負載平衡器的 IPv6 位址。

對 HTTP 負載平衡器進行壓力測試
請建立新的 VM,使用 siege 模擬 HTTP 負載平衡器上的負載,然後在負載偏高時,判斷兩個後端的流量是否達到平衡。
- 前往控制台,依序點選「導覽選單」圖示
>「Compute Engine」 >「VM 執行個體」。 - 點選「建立執行個體」。
- 設定下方的值,其他屬性均保留預設值:
屬性 | 值 (按照指示輸入值或選取選項) |
名稱 | siege-vm |
區域 | us-west1 |
可用區 | us-west1-c |
系列 | N1 |
- 點選「建立」。
- 等待 siege-vm 執行個體建立完畢。
- 在「siege-vm」部分,點選「SSH」來啟動終端機並連線。
- 執行下列指令來安裝 siege:
sudo apt-get -y install siege
- 如要在環境變數中儲存 HTTP 負載平衡器的 IPv4 位址,請執行下列指令,並將 [LB_IP_v4] 換成 IPv4 位址:
export LB_IP=[LB_IP_v4]
- 執行下列指令來模擬負載:
siege -c 250 http://$LB_IP
輸出內容應如下所示 (請勿複製下方的輸出內容示例):
New configuration template added to /home/student/.siege Run siege -C to view the current settings in that file ** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege...
- 前往 Cloud 控制台,依序點選「導覽選單」圖示
>「網路服務」>「負載平衡」。 - 按一下「http-lb」。
- 按一下「監控」分頁標籤。花 2 至 3 分鐘監控北美區域和兩個後端之間的流量。
流量一開始應該只會導向至 us-east1-mig,但隨著 RPS 增加,流量也會導向至 europe-west1-mig。

這證明瞭在預設情況下,流量只會導向至距離最近的後端,但如果負載過高,流量也可能會分配至其他後端。

- 返回 siege-vm 的 SSH 終端機。
- 按下 CTRL+C 鍵,停止 siege。
7. 建立 Cloud Armor 頻率限制政策
在本節中,您將使用 Cloud Armor 設定頻率限制政策,禁止 siege-vm 存取 HTTP 負載平衡器。
- 在 Cloud Shell 中透過 gcloud 建立安全性政策(如需如何使用 Cloud Shell 的說明,請參閱「設定和需求條件」一節中的「啟動 Cloud Shell」):
gcloud compute security-policies create rate-limit-siege \
--description "policy for rate limiting"
- 接著新增頻率限制規則:
gcloud beta compute security-policies rules create 100 \
--security-policy=rate-limit-siege \
--expression="true" \
--action=rate-based-ban \
--rate-limit-threshold-count=50 \
--rate-limit-threshold-interval-sec=120 \
--ban-duration-sec=300 \
--conform-action=allow \
--exceed-action=deny-404 \
--enforce-on-key=IP
- 將安全性政策附加至後端服務 http-backend:
gcloud compute backend-services update http-backend \
--security-policy rate-limit-siege –-global
- 前往控制台,依序點選「導覽選單」 >「網路安全性」 >「Cloud Armor」。
- 點選 rate-limit-siege。政策內容應如下所示:

驗證安全性政策
- 返回 siege-vm 的 SSH 終端機。
- 對負載平衡器 IP 執行 curl,確認仍可連線至該負載平衡器。您應該會收到 200 回應。
curl http://$LB_IP
- 在 siege-vm 的 SSH 終端機,執行下列指令來模擬負載:
siege -c 250 http://$LB_IP
輸出內容應如下所示 (請勿複製下方的輸出內容示例):
** SIEGE 4.0.4 ** Preparing 250 concurrent users for battle. The server is now under siege...
- 查看安全性政策記錄,確認這個流量是否也遭到封鎖。
- 在控制台中,依序前往「導覽選單」>「網路安全性」>「Cloud Armor」。
- 點選「rate-limit-siege」。
- 按一下「Logs」(記錄檔)。

- 點選「查看政策記錄檔」。
- 在「Logging」頁面上,務必將「查詢預覽」內的文字全部清除。
- 依序選取「Cloud HTTP Load Balancer」>「http-lb-forwarding-rule」>「http-lb」,然後按一下「新增」。或者,您也可以複製下方的 Monitoring Query Language(MQL) 查詢,並貼到查詢編輯器 -
resource.type="http_load_balancer" resource.labels.forwarding_rule_name="http-lb-forwarding-rule" resource.labels.url_map_name="http-lb"
- 接著點選「執行查詢」。
- 展開「查詢結果」中的記錄項目。
- 展開「httpRequest」httpRequest。這個要求應該來自 siege-vm IP 位址。如果不是,請展開另一個記錄項目。
- 展開 jsonPayload。
- 展開「enforcedSecurityPolicy」。

請注意,configuredAction 的設定值為 RATE_BASED_BAN,名稱為 rate-limit-siege。
- 如要進行額外檢查,請依序點選「導覽選單」圖示
>「網路服務」>「負載平衡」。按一下「http-lb」,然後按一下「監控」分頁標籤。

圖表會顯示圍攻流量。您也會發現,受到速率限制的流量不會抵達後端,而是遭到 Cloud Armor 政策封鎖。
恭喜!您已完成本實驗室:使用 Cloud Armor 設定頻率限制
©2020 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,所有其他公司和產品的名稱可能為其相關公司的商標。
8. 實驗室清理
- 依序前往「網路安全性」>>「Cloud Armor」>>「%POLICY NAME%」,然後選取「刪除」-

- 依序前往「Networking」(網路) >>「Network services」(網路服務) >>「Load Balancing」(負載平衡)。選取您建立的負載平衡器,然後按一下「刪除」。

選取要刪除的後端服務和健康狀態檢查做為額外資源 -

- 依序前往「導覽選單」 (
) >「Compute Engine」 >「執行個體群組」。選取兩個代管執行個體群組,然後按一下「刪除」-

在文字方塊中輸入「delete」,確認刪除湖泊。
等待系統刪除代管執行個體群組。這項操作也會刪除群組中的執行個體。您必須先刪除執行個體群組,才能刪除範本。
- 從左側窗格前往「執行個體範本」。選取兩個執行個體範本,然後按一下「刪除」-

- 從左側窗格前往「VM instances」(VM 執行個體)。選取 siege-vm 執行個體旁的省略號,然後按一下「刪除」。

- 依序前往「導覽選單」 (
) >「虛擬私有雲網路」 >「防火牆」。選取 default-allow-health-check,然後按一下「delete」(刪除) -

9. 恭喜!
您已成功使用 Cloud Armor 實作頻率限制。您設定了後端位於 us-east1 和 europe-west1 的 HTTP 負載平衡器,接著運用 VM 對負載平衡器進行壓力測試,並透過 Cloud Armor 設定頻率限制,將 IP 位址加入拒絕清單。另外,您也順利查看安全性政策記錄,找出流量遭封鎖的原因。
涵蓋內容
- 如何設定執行個體範本及建立代管執行個體群組。
- 如何設定 HTTP 負載平衡器。
- 如何建立 Cloud Armor 頻率限制政策。
- 如何驗證頻率限制政策是否正常運作。
後續步驟
- 請嘗試根據來源 IP 範圍設定頻率限制政策。下方是指令範例:
gcloud alpha compute security-policies rules create 105 \
--security-policy sec-policy \
--src-ip-ranges "1.2.3.0/24" \
--action throttle \
--rate-limit-threshold-count 100 \
--rate-limit-threshold-interval-sec 60 \
--conform-action allow \
--exceed-action deny-429 \
--enforce-on-key IP
- 請試著根據區域代碼設定頻率限制政策。下方是指令範例:
gcloud alpha compute security-policies rules create 101 \
--security-policy sec-policy \
--expression "origin.region_code == 'US'" \
--action rate-based-ban \
--rate-limit-threshold-count 10 \
--rate-limit-threshold-interval-sec 60 \
--ban-duration-sec 300 \
--ban-threshold-count 1000 \
--ban-threshold-interval-sec 600 \
--conform-action allow \
--exceed-action deny-403 \
--enforce-on-key IP