GSP474

總覽
在 Google Cloud 網路中,流量鏡像是確保安全性和輔助網路分析的關鍵功能,其作用類似於傳統網路的網路分流器 (TAP) 或交換器通訊埠分析器 (SPAN)。簡單來說,Packet Mirroring 會記錄特定「鏡像來源」的 ingress 和 egress 網路流量、複製該流量,然後將流量副本轉送至「收集器」。
值得注意的是,Packet Mirroring 會記錄每個封包的完整酬載,因此會占用額外頻寬。由於 Packet Mirroring 沒有特定的取樣期間,因此較適合用來排解問題、當成安全性解決方案使用,以及進行較高階的應用程式分析。
Packet Mirroring 的基礎為「Packet Mirroring 政策」,當中包含下列屬性:
- 區域
- 虛擬私有雲網路
- 鏡像來源
- 收集器 (目的地)
- 鏡像流量 (篩選器)
其他需要考量的重點包括:
- 只有 TCP、UDP 和 ICMP 流量可以建立鏡像,但這應該已經滿足絕大多數的用途。
- 「鏡像來源」和「收集器」必須位於相同區域,但可以位於不同的可用區或虛擬私有雲,前提是這些私有雲已正確對接。
- 建立鏡像可能需要支付額外的頻寬費用,尤其是在可用區之間傳送的流量。如要限制建立鏡像的流量,可以使用篩選器。
Packet Mirroring 的其中一項主要用途,是搭配入侵偵測系統 (IDS) 解決方案使用。某些雲端式的 IDS 解決方案,需要在每個來源 VM 執行特殊服務,或是在網路來源和目的地之間串接 IDS 虛擬設備。Packet Mirroring 能為這兩種應用情境帶來重大影響。舉例來說,服務式解決方案雖採完全分散式設計,但訪客作業系統必須要能安裝軟體。在串接式解決方案中,所有流量都必須通過 IDS 設備,可能會造成網路效能瓶頸。此外,這種解決方案也無法在相同虛擬私有雲中,記錄 VM 的「東西向」流量。
使用 Google Cloud Packet Mirroring 不需在 VM 安裝額外軟體,這項功能也會完全套用至每一個鏡像虛擬機器。「收集器」IDS 採用內部網路負載平衡器 (ILB),不會部署在網路流量的路徑上,並能接收「南北向」和「東西向」的流量。
Packet Mirroring 實驗室說明
為說明如何搭配使用 Packet Mirroring 和 IDS,我們將透過開放原始碼 IDS Suricata 進行示範,相關設定如下:
- 單一虛擬私有雲包含 2 個子網路,一個用於鏡像來源,一個用於收集器
- 2 個以公開 IP 位址建立的網路伺服器
- 1 收集器伺服器 (IDS),基於安全考量不使用公開 IP
- 視需要啟用 Cloud NAT 來存取網際網路
- 基於示範的便利性和成本考量,所有 VM 都建立在同一個區域和可用區
在本實驗室中,您將建立 Google Cloud 環境、設定「收集器」ILB 和 Packet Mirroring 政策,並在虛擬個體安裝及設定 [Suricata] (https://suricata-ids.org/) 做為 IDS。完成後,您將進行網路測試來驗證設定,以及搭配使用 Packet Mirroring 和開放原始碼 IDS。為便於示範,本實驗室採用簡化後的規則集和 Suricata 設定。

目標:
- 建構出與上圖相同的 Google Cloud 網路環境
- 透過
gcloud
指令建立 2 個虛擬機器,做為網路伺服器
- 透過
gcloud
指令建立 1 個虛擬機器,做為 IDS
- 建立內部負載平衡器 (ILB),做為 Packet Mirroring 的「收集器」
- 在 IDS VM 安裝並設定開放原始碼 IDS (Suricata)
- 複習一些基本的 IDS 警告規則
- 建立 Packet Mirroring 政策
- 產生網路流量並傳送至鏡向子網路,藉此測試 Packet Mirroring
- 產生網路流量來模擬 IDS 活動並檢查 IDS 記錄,藉此測試 Suricata IDS
設定和需求
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
如何開始研究室及登入 Google Cloud 控制台
-
點選「Start Lab」按鈕。如果實驗室會產生費用,畫面上會出現選擇付款方式的對話方塊。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的臨時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意:如要使用 Google Cloud 產品和服務,請點選「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
-
點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示
。
-
系統顯示視窗時,請按照下列步驟操作:
- 繼續操作 Cloud Shell 視窗。
- 授權 Cloud Shell 使用您的憑證發出 Google Cloud API 呼叫。
連線建立完成即代表已通過驗證,而且專案已設為您的 Project_ID:。輸出內容中有一行文字,宣告本工作階段的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
- 點按「授權」。
輸出內容:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project
輸出內容:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需 gcloud
的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南。
工作 1:建構網路環境
在本節中,您將建立包含 2 個子網路的虛擬私有雲。請在 Google Cloud Shell 使用 gcloud
CLI 指令完成這項操作。
- 執行下列指令來建立虛擬私人網路:
gcloud compute networks create dm-stamford \
--subnet-mode=custom
- 在虛擬私有雲中,為 中的鏡像流量新增子網路:
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}} \
--range=172.21.0.0/24 \
--network=dm-stamford \
--region={{{project_0.default_region | REGION}}}
- 在虛擬私有雲中,為 中的收集器新增子網路:
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}}-ids \
--range=172.21.1.0/24 \
--network=dm-stamford \
--region={{{project_0.default_region | REGION}}}
點選「Check my progress」確認目標已達成。
建構網路環境
工作 2:建立防火牆規則和 Cloud NAT
為完成本實驗室,您一共需要建立三個防火牆規則。
- 規則 1 允許所有來源的流量透過標準 HTTP 通訊埠 (TCP 80) 和 ICMP 通訊協定傳送至所有 VM。
- 規則 2 允許 IDS 接收所有來源的所有流量。稍後的練習中,請注意不要為 IDS VM 提供公開 IP。
- 規則 3 允許流量透過「Google Cloud IAP Proxy」IP 範圍 TCP 通訊埠 22 傳送至所有 VM,讓您在 Cloud 控制台透過 SSH 連線至 VM。
執行下列指令來建立防火牆規則:
gcloud compute firewall-rules create fw-dm-stamford-allow-any-web \
--direction=INGRESS \
--priority=1000 \
--network=dm-stamford \
--action=ALLOW \
--rules=tcp:80,icmp \
--source-ranges=0.0.0.0/0
gcloud compute firewall-rules create fw-dm-stamford-ids-any-any \
--direction=INGRESS \
--priority=1000 \
--network=dm-stamford \
--action=ALLOW \
--rules=all \
--source-ranges=0.0.0.0/0 \
--target-tags=ids
gcloud compute firewall-rules create fw-dm-stamford-iapproxy \
--direction=INGRESS \
--priority=1000 \
--network=dm-stamford \
--action=ALLOW \
--rules=tcp:22,icmp \
--source-ranges=35.235.240.0/20
點選「Check my progress」確認目標已達成。
建立防火牆規則和 Cloud NAT
建立 Cloud Router
- 建立 Cloud NAT 前,您必須先在相應的區域設定 Cloud Router:
gcloud compute routers create router-stamford-nat-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}} \
--network=dm-stamford
設定 Cloud NAT
- 如要讓 VM 在沒有公開 IP 的情況下連上網際網路,您必須在相應的區域建立 Cloud NAT:
gcloud compute routers nats create nat-gw-dm-stamford-{{{project_0.default_region | REGION}}} \
--router=router-stamford-nat-{{{project_0.default_region | REGION}}} \
--router-region={{{project_0.default_region | REGION}}} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges
這個 IDS VM 不具有公開 IP,確保其他人無法透過公開網際網路存取,不過下載更新和安裝 Suricata 套件時仍需連上網際網路。
點選「Check my progress」確認目標已達成。
建立 Cloud Router 並設定 Cloud NAT
工作 3:建立虛擬機器
為網路伺服器建立執行個體範本
- 這個範本會在 建立 Ubuntu 伺服器,並安裝簡單的 Web 服務:
gcloud compute instance-templates create template-dm-stamford-web-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}} \
--network=dm-stamford \
--subnet=dm-stamford-{{{project_0.default_region | REGION}}} \
--machine-type=e2-small \
--image=ubuntu-1604-xenial-v20200807 \
--image-project=ubuntu-os-cloud \
--tags=webserver \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
systemctl restart apache2'
為網路伺服器設定代管執行個體群組
- 這個指令會使用上個步驟中的執行個體範本建立 2 個網路伺服器:
gcloud compute instance-groups managed create mig-dm-stamford-web-{{{project_0.default_region | REGION}}} \
--template=template-dm-stamford-web-{{{project_0.default_region | REGION}}} \
--size=2 \
--zone={{{project_0.default_zone | "ZONE"}}}
為 IDS VM 建立執行個體範本
- 這個範本會在 建立沒有公開 IP 的 Ubuntu 伺服器:
gcloud compute instance-templates create template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}} \
--network=dm-stamford \
--no-address \
--subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \
--image=ubuntu-1604-xenial-v20200807 \
--image-project=ubuntu-os-cloud \
--tags=ids,webserver \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
systemctl restart apache2'
為 IDS VM 建立代管執行個體群組
- 這個指令會使用上個步驟中的執行個體範本建立 1 個 VM,供您設為 IDS。安裝 Suricata 的部分會於後續段落另行說明。
gcloud compute instance-groups managed create mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--template=template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--size=1 \
--zone={{{project_0.default_zone | "ZONE"}}}
點選「Check my progress」確認目標已達成。
建立虛擬機器
工作 4:建立內部負載平衡器
Packet Mirroring 會使用內部負載平衡器 (ILB) 將鏡像流量轉送至一組收集器。在本例中,收集器群組僅包含一個 VM。
- 為後端服務進行基本健康狀態檢查:
gcloud compute health-checks create tcp hc-tcp-80 --port 80
- 建立要用於 ILB 的後端服務群組:
gcloud compute backend-services create be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \
--load-balancing-scheme=INTERNAL \
--health-checks=hc-tcp-80 \
--network=dm-stamford \
--protocol=TCP \
--region={{{project_0.default_region | REGION}}}
- 將建立好的 IDS 代管執行個體群組,新增至上個步驟中建立的後端服務群組:
gcloud compute backend-services add-backend be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \
--instance-group=mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--instance-group-zone={{{project_0.default_zone | "ZONE"}}} \
--region={{{project_0.default_region | REGION}}}
- 建立前端轉送規則來做為收集端點:
gcloud compute forwarding-rules create ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \
--load-balancing-scheme=INTERNAL \
--backend-service be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \
--is-mirroring-collector \
--network=dm-stamford \
--region={{{project_0.default_region | REGION}}} \
--subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \
--ip-protocol=TCP \
--ports=all
注意:雖然通訊協定顯示為 TCP,我們稍後處理 Packet Mirroring 政策時才會設定真正的鏡像流量類型。另外,您應該會發現上方指令也設定了 --is-mirroring-collector
旗標。
點選「Check my progress」確認目標已達成。
建立內部負載平衡器
工作 5:安裝開放原始碼 IDS - Suricata
注意:在後續 2 節的工作中,您將透過 SSH 連線至 IDS VM,並在該 VM 的殼層中執行指令。請勿在 Cloud Shell 執行指令。
透過 SSH 連線至 IDS VM
-
從 Cloud 控制台的「導覽選單」依序前往「Compute Engine」>「VM 執行個體」。
-
找到您的 IDS VM,點選旁邊的「SSH」按鈕。

系統會開啟新視窗,供您在 IDS VM 執行指令。
- 更新 IDS VM:
sudo apt-get update -y
- 安裝 Suricata 依附元件:
sudo apt-get install libpcre3-dbg libpcre3-dev autoconf automake libtool libpcap-dev libnet1-dev libyaml-dev zlib1g-dev libcap-ng-dev libmagic-dev libjansson-dev libjansson4 -y
sudo apt-get install libnspr4-dev -y
sudo apt-get install libnss3-dev -y
sudo apt-get install liblz4-dev -y
sudo apt install rustc cargo -y
- 安裝 Suricata:
sudo add-apt-repository ppa:oisf/suricata-stable -y
sudo apt-get update -y
sudo apt-get install suricata -y
注意:如果您在安裝期間收到錯誤訊息,請進行下列驗證步驟。
驗證安裝
- 使用下列指令驗證 Suricata 的安裝狀態和版本:
suricata -V
輸出內容大致如下:
This is Suricata version 5.0.3 RELEASE
工作 6:設定及檢查 Suricata
執行下列指令和步驟時,也請透過 SSH 連線至 IDS/Suricata VM,在該 VM 完成工作。
sudo systemctl stop suricata
sudo cp /etc/suricata/suricata.yaml /etc/suricata/suricata.backup
下載新的 Suricata 設定檔和節略版規則檔案,並換掉原本的檔案。
新的設定檔會更新收集器介面,並只針對極小部分的流量 (由 my.rules
和 suricata.yaml
檔案設定) 發出警告,因為以本實驗室的目的來說,Suricata 預設規則集和警告機制的適用範圍過廣,也稍嫌多餘。
wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/suricata.yaml
wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/my.rules
sudo mkdir /etc/suricata/poc-rules
sudo cp my.rules /etc/suricata/poc-rules/my.rules
sudo cp suricata.yaml /etc/suricata/suricata.yaml
啟動 Suricata 服務
有時 Suricata 服務必須重新啟動;若遇到這種情況,請使用本步驟中的 restart
指令:
sudo systemctl start suricata
sudo systemctl restart suricata
在測試前檢查節略版 Suricata 規則
本實驗室已將 Suricata 規則集縮減至 4 項,不過 Suricata 的預設安裝內容其實包含大量且廣泛的規則集。
- 以本實驗室的練習目的而言,將警告規則縮減成簡單明確的清單,將有利於您測試每一項規則。
cat /etc/suricata/poc-rules/my.rules
輸出內容應總共包含 4 項規則及其說明。
####RULES#####
#UDP ALERTS
alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;)
#HTTP ALERTS
alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;)
#ICMP ALERTS
alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;)
#TCP ALERTS
alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;)
注意:標準規則檔案通常位於 /etc/suricata/rules/
或 /var/lib/suricata/rules
。不過在本實驗室的步驟 2,我們已將路徑重新設定成其他位置。
工作 7:設定 Packet Mirroring 政策
這部分的工作請回到 Cloud Shell 進行
設定 Packet Mirroring 政策只需一個簡單指令 (或在 GUI 使用「精靈」) 即可完成。在指令中,您需要完整指定「Packet Mirroring 說明」一節提到的 5 項屬性。
- 區域
- 虛擬私有雲網路
- 鏡像來源
- 收集器 (目的地)
- 鏡像流量 (篩選器)
您可能會發現此處沒有提到「鏡像流量」,這是因為我們會設定政策來為「所有」流量建立鏡像,因此也不需要篩選器。這項政策會為 ingress 和 egress 流量建立鏡像,並轉送至 Suricata IDS 裝置,該裝置為收集器 ILB 的一部分。
- 在 Cloud Shell 執行下列指令,設定 Packet Mirroring 政策:
gcloud compute packet-mirrorings create mirror-dm-stamford-web \
--collector-ilb=ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \
--network=dm-stamford \
--mirrored-subnets=dm-stamford-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}}
至此您應已設定完 Packet Mirroring 和 Suricata,我們會在下一節測試兩者。
點選「Check my progress」確認目標已達成。
設定 Packet Mirroring 政策
工作 8:測試 Packet Mirroring
本節請在 IDS VM 殼層操作。如果殼層視窗仍開著,可直接使用;若已關閉則請重新連線。
您也會將 Cloud Shell 當成「網際網路用戶端」使用。
請花幾分鐘找到兩個網路 VM 的外部 IP。
從 Cloud 控制台「導覽選單」依序點選「Compute Engine」>「VM 執行個體」,然後記下兩個網路 VM 的外部 IP,以下分別簡稱為 [PUBLIC_IP_WEB1] 和 [PUBLIC_IP_WEB2]。
您也可以在 Cloud Shell 使用 gcloud
指令收集相同的資訊:
gcloud compute instances list
返回 IDS VM 殼層
測試 Packet Mirroring
- 在 IDS/Suricata VM 中,執行帶有下列篩選條件的封包擷取 (tcpdump):
sudo tcpdump -i ens4 -nn -n "(icmp or port 80) and net 172.21.0.0/24"
注意:172.21.0.0/24 網路為鏡像子網路,IDS VM 不屬於該子網路的一部分。若已正確設定 Packet Mirroring,IDS VM 應會收到該子網路的鏡像流量。
產生傳送至「鏡像」子網路的流量
- 使用 Cloud Shell 終端機,對指派至 WEB1 的公開位址進行連線偵測 (ping),記得將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址 (可在 Cloud 控制台查詢):
sudo apt install iputils-ping
ping -c 4 [PUBLIC_IP_WEB1]
Packet Mirroring 會複製並轉送流量至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。IDS VM 的輸出內容大致如下,其中 X.X.X.X 是 ICMP 要求的來源 IP 位址。您應該會在 tcpdump 輸出內容中看到網路伺服器的私人 IP。Google Cloud 會在邊緣位置完成網路位址轉譯。
00:55:32.980666 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 0, length 64
00:55:32.980801 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 0, length 64
00:55:33.968920 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 1, length 64
00:55:33.968965 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 1, length 64
00:55:34.980472 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 2, length 64
00:55:34.980521 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 2, length 64
00:55:35.986354 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 3, length 64
00:55:35.986445 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 3, length 64
對 WEB2 的公開位址進行連線偵測 (ping) 的方式大同小異。
- 對指派至 WEB2 的公開位址進行連線偵測 (ping),並將 [PUBLIC_IP_WEB2] 換成「WEB2」的公開 IP 位址。
ping -c 4 [PUBLIC_IP_WEB2]
Packet Mirroring 會將流量轉送至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。IDS VM 的輸出內容大致如下。請注意,您應該會在 tcpdump 輸出內容中看到網路伺服器的私人 IP。Google Cloud 會在邊緣位置完成網路位址轉譯。
00:00:45.309407 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 0, length 64
00:00:45.309736 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 0, length 64
00:00:46.309406 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 1, length 64
00:00:46.309602 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 1, length 64
00:00:47.306278 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 2, length 64
00:00:47.306406 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 2, length 64
00:00:48.314506 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 3, length 64
00:00:48.314698 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 3, length 64
Packet Mirroring 不只能顯示第 3 層標頭,為了更清楚地示範這點,以下測試將透過標準 HTTP GET 請求與其中一個網路伺服器建立連線,也會展示最初的 3 向 TCP 握手過程。
-
在瀏覽器開啟新分頁,透過 HTTP 通訊協定連線到指派給 WEB1 的公開位址。如果您偏好 Cloud 控制台的「curl」公用程式,也可以使用該工具。
-
將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址
http://[PUBLIC_IP_WEB1]/
Packet Mirroring 會將流量轉送至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。
IDS VM 的輸出內容大致如下:
00:00:46.761748 IP X.X.X.60835 > 172.21.0.2.80: Flags [S]...
00:00:46.763037 IP 172.21.0.2.80 > X.X.X.60835: Flags [S.], ... ack ...
00:00:46.816407 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
00:00:46.823624 IP X.X.X.60835 > 172.21.0.2.80: Flags [P.], ... HTTP: GET / HTTP/1.1
00:00:46.823832 IP 172.21.0.2.80 > X.X.X.60835: Flags [.], ack ...
00:00:46.824549 IP 172.21.0.2.80 > X.X.X.60835: Flags [P.], ... HTTP: HTTP/1.1 200 OK
00:00:46.879214 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
00:00:46.888477 IP X.X.X.60835 > 172.21.0.2.80: Flags [F.], ...
00:00:46.888662 IP 172.21.0.2.80 > X.X.X.60835: Flags [F.], ... ack...
00:00:46.943915 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
- 連線到 WEB2 公開位址的方式大同小異。將 [PUBLIC_IP_WEB2] 換成「WEB2」的公開 IP 位址
http://[PUBLIC_IP_WEB2]/
Packet Mirroring 會將流量轉送至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。
IDS VM 的輸出內容大致如下:
00:00:58.819740 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [S]...
00:00:58.820027 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [S.], ... ack ...
00:00:58.875301 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...
00:00:58.875329 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [P.], ... HTTP: GET / HTTP/1.1
00:00:58.875448 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [.], ack ...
00:00:58.876204 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [P.], ... HTTP: HTTP/1.1 200 OK
00:00:58.929015 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...
00:00:58.929047 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [F.], ...
00:00:58.929244 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [F.], ... ack...
00:00:58.993844 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...
在 IDS VM 輸入 ctrl+c
即可退出 tcpdump。
工作 9:測試 Suricata IDS 的檢查與警告機制
在本實驗室的最後一節中,您將測試 Packet Mirroring 與開放原始碼 IDS Suricata 的整合狀況。請花點時間回顧「設定及檢查 Suricata」一節步驟 4 的 4 項警告規則:
####RULES#####
#UDP ALERTS
alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;)
#HTTP ALERTS
alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;)
#ICMP ALERTS
alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;)
#TCP ALERTS
alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;)
您將透過下列 4 個步驟,產生可觸發這些規則的網路流量。每項規則發出的警告應會顯示在 Suricata 事件記錄檔案中。
注意:請確認您已開啟連往 IDS VM 和網路伺服器 VM 的 SSH 視窗,您需要同時查看這兩個視窗來完成本節的工作。
測試 1 和測試 2 會從網路伺服器啟動,測試的是「egress」流量。
測試 3 和測試 4 會從 Cloud Shell 啟動,測試的是「ingress」流量。
測試 1:測試 egress UDP 規則/警告
- 從任一個網路伺服器執行下列指令,藉此產生 egress DNS 流量:
dig @8.8.8.8 example.com
- 現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。
切換至 IDS VM 的 SSH 視窗
- 在 IDS VM 的 SSH 視窗中執行下列指令:
egrep "BAD UDP DNS" /var/log/suricata/eve.json
記錄項目內容大致如下:
@GCP: {"timestamp":"2020-08-14T01:23:14.903210+0000","flow_id":412864167987242,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":47020,"dest_ip":"8.8.8.8","dest_port":53,"proto":"UDP","alert":{"action":"allowed","gid":1,"signature_id":99996,"rev":1,"signature":"BAD UDP DNS REQUEST","category":"","severity":3},"dns":{"query":[{"type":"query","id":17268,"rrname":"EXAMPLE.COM","rrtype":"A","tx_id":0}]},"app_proto":"dns","flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":82,"bytes_toclient":0,"start":"2020-08-19T18:23:14.903210+0000"}}
測試 2:測試 egress「TCP」規則/警告
- 從任一個網路伺服器執行下列指令,藉此產生 egress TCP 流量,記得將 [PUBLIC_IP_WEB2] 換成「WEB2」的公開 IP 位址:
telnet [PUBLIC_IP_WEB2] 6667
-
輸入 ctrl+c
即可退出。
-
現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。
切換至 IDS VM 的 SSH 視窗
- 在 IDS VM 的 SSH 視窗中執行下列指令:
egrep "BAD TCP" /var/log/suricata/eve.json
記錄項目內容大致如下:
@GCP: {"timestamp":"2020-08-14T01:27:45.058526+0000","flow_id":479376049300638,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":36168,"dest_ip":"100.64.1.1","dest_port":6667,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":99999,"rev":1,"signature":"BAD TCP 6667 REQUEST","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":74,"bytes_toclient":0,"start":"2020-08-19T18:27:45.058526+0000"}}
測試 3:測試 ingress「ICMP」規則/警告
-
從 Cloud Shell 執行下列指令,藉此產生 ingress ICMP 流量。
-
記得將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址。
ping -c 3 [PUBLIC_IP_WEB1]
- 現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。
egrep "BAD ICMP" /var/log/suricata/eve.json
記錄項目內容大致如下:
@GCP: {"timestamp":"2020-08-14T01:24:46.065250+0000","flow_id":1114966772874978,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","dest_ip":"172.21.0.2","proto":"ICMP","icmp_type":8,"icmp_code":0,"alert":{"action":"allowed","gid":1,"signature_id":99998,"rev":1,"signature":"BAD ICMP","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":98,"bytes_toclient":0,"start":"2020-08-19T18:24:46.065250+0000"}}
測試 4:測試 ingress「HTTP」規則/警告
使用本機工作站的網路瀏覽器或 Cloud Shell 中的 curl
工具,透過 HTTP 通訊協定連線到指派給 index.php 頁面的 WEB1 公開位址。
- 記得將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址。
http://[PUBLIC_IP_WEB1]/index.php
- 現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。
egrep "BAD HTTP" /var/log/suricata/eve.json
記錄項目內容大致如下:
@GCP: {"timestamp":"2020-08-14T01:26:36.794124+0000","flow_id":1901424684045611,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","src_port":61132,"dest_ip":"172.21.0.3","dest_port":80,"proto":"TCP","tx_id":0,"alert":{"action":"allowed","gid":1,"signature_id":99997,"rev":1,"signature":"BAD HTTP PHP REQUEST","category":"","severity":3},"http":{"hostname":"PUBLIC_IP_WEB1","url":"\/index.php","http_user_agent":"curl\/7.64.1","http_content_type":"text\/html","http_method":"GET","protocol":"HTTP\/1.1","status":404,"length":275},"app_proto":"http","flow":{"pkts_toserver":7,"pkts_toclient":6,"bytes_toserver":658,"bytes_toclient":1284,"start":"2020-08-19T18:26:36.660779+0000"}}
恭喜!
您已完成本實驗室,學會如何搭配使用 Google Cloud Packet Mirroring 與開放原始碼入侵偵測系統 Suricata。
後續行動/瞭解詳情
如要進一步瞭解 Packet Mirroring,請參閱:
如要進一步瞭解 Suricata,請參閱 https://suricata-ids.org/
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2024 年 11 月 18 日
實驗室上次測試日期:2023 年 9 月 6 日
Copyright 2025 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。