examlab .net 用最有效率的方法,考取最有價值的證照
本篇導覽 約 22 分鐘

封包鏡像與 VPC 流日誌 (Packet Mirroring & VPC Flow Logs)

4,350 字 · 約 22 分鐘閱讀 ·

PCNE 學習筆記,涵蓋 Packet Mirroring(collector ILB、政策選擇器、頻寬、TLS 解密邊界)、VPC Flow Logs(彙整間隔、取樣率、metadata 欄位)、Firewall Rules Logging、log sink 至 BigQuery 進行 top-talker 與 denied-connection SQL 分析,以及 Network Connectivity Center 鏡像架構模式。

立即做 20 題練習 → 免費 · 不用註冊 · PCNE

簡介

Google Cloud 提供兩個互補的網路可觀測性原語。VPC Flow Logs 記錄每條(取樣後的)連線的 metadata:5-tuple、位元組計數、封包計數、RTT、AS path,並寫入 Cloud Logging。Packet Mirroring 則複製選定 VM 的 完整封包負載(header + body、ingress + egress),並將每份副本轉發到位於 Internal TCP/UDP Load Balancer 後方的 collector,讓第三方 IDS 或 Cloud IDS endpoint 進行檢測。一個工具告訴你「誰在跟誰對話、流量多少」,另一個告訴你「對話內容是什麼」。一個達到 PCNE 級別的設計幾乎總是兩者並用:用 Flow Logs 做成本低廉的持續連線審計,用 Packet Mirroring 在值得花頻寬與儲存成本的關鍵層級進行深度封包檢測。

考試陷阱集中在三個地方:解密邊界(Packet Mirroring 在 TLS 加密流量上看到的是密文,所以 HTTPS 檢測需要在鏡像來源 上游 終止 TLS)、防火牆紀錄的例外(預設的 default-deny-ingress 規則在沒有明確設定 --enable-logging 之前產生零筆紀錄)、以及 NCC + 鏡像的限制(鏡像流量無法跨越 VPC peering 或 NCC VPC Spoke peering,collector 與 producer 必須共用同一個 VPC 網路)。這份學習筆記涵蓋考試可能考到的每一條 gcloud 指令、API 欄位、log schema 條目,以及 BigQuery SQL 模式。

白話文解釋

VPC Flow Logs、Packet Mirroring、Firewall Rules Logging、log sink 和 NCC 整合的詞彙密度很高、容易混淆。在進入指令細節前,先用三個具體的比喻把概念釘住。

比喻一:辦公大樓的三層監控

想像一棟企業總部有三套各自獨立平行運作的監控系統。

大廳訪客登記簿VPC Flow Logs:每位訪客簽名(來源 IP)、要拜訪的部門(目的 IP/port)、進出時間(start/end)、帶了幾個袋子(bytes/packets)、從正門還是停車場進來(ingress/egress reporter)。登記簿便宜易維護、易於查詢——「列出本週所有上高階主管樓層的訪客」——但它從來不會告訴你袋子裡裝了什麼。你還可以調整登記簿的 取樣率(每 10 個訪客記 1 個)和 彙整間隔(把同一人 5 秒內的多次進出合併成一筆)。

收發室的 X 光機Packet Mirroring:每一個流經特定部門(被標籤的子網路、特定 VM 或帶有 prod-web 網路標籤的 instance)的包裹都被複製,一份繼續送往實際的目的地、另一份送上一條與主動線平行的 X 光輸送帶。X 光輸送帶終點是一個 Internal Load Balancer,它把包裹分發給多個檢測員(collector backend instance group)。重點:這台 X 光機看不穿鉛襯的箱子——TLS 加密流量除非在包裹抵達鏡像分接點 之前 解密,否則仍是不透明的。

大樓的門禁警報Firewall Rules Logging:每一道門都有可程式設定的警報——但只有當有人明確替那道門打開記錄開關時它才會嗶嗶叫。前門(allow-rule)可能沒人記得打開記錄;側邊的服務門(deny-rule)也可能因為同樣的理由是靜音狀態。結果:你只能在入侵發生之後才知道,而且只能看到那些有人記得打開記錄的門。

比喻二:公路警察的測速照相 vs. 行車記錄器

VPC Flow Logs 是公路警察在每座天橋上的 自動車牌辨識(ALPR)——它看到每一輛車(或視取樣率每 10 輛車看 1 輛),記錄廠牌/型號/車牌/方向/車道,然後寫進資料庫。便宜、快速、可查詢:「列出 03:00–04:00 經過 42 公里處的所有車輛」。它從來不會看到駕駛的臉,也看不到後車廂裡有什麼。

Packet Mirroring跟著某輛特定卡車的不掛標誌警車,全程錄下接下來 50 公里的高畫質行車記錄,包含定向麥克風收到的司機對話。細節多很多、頻寬多很多、儲存成本也高很多。你只會把不掛標誌警車派去跟值得關注的卡車(PCI tier、受監管的工作負載、疑似失陷的主機)。記錄器只能拍到不掛標誌警車能看到的東西——如果卡車的貨櫃上鎖了(TLS 加密),攝影機錄下的是貨櫃 外觀、不是裡頭的貨物。

Firewall Rules Logging公路收費站的票據印表機。每一個收費站(防火牆規則)都可以為每一輛通過的車印出收據,但前提是收費員把印表機打開。印表機關著的收費站讓車輛通過卻不留紙本紀錄,事後的鑑識工作對那條車道無從下手。

比喻三:醫院的病患紀錄堆疊

VPC Flow Logs醫院的入院登記本:姓名、日期、病房、住院天數、計費代碼。它告訴稽核人員「是的,X 病患在 Y 日入院,Z 日從急診轉入加護病房,住了 6 天計費」。它不包含病歷內容。

Packet Mirroring病床旁的持續生命徵象監視器,接到護理站的次要錄音設備。每一次心跳、每一次呼吸、病房裡說的每一句話(如果你有裝音訊探針)都被保留下來。錄音設備依照流量設計大小——超載會丟失保真度。collector ILB 是把訊號分送給多名專科審閱者(IDS appliance instance)的配線盤,這樣沒有任何單一審閱者會成為瓶頸。加密通訊(TLS)就像病房裡用沒人聽得懂的語言竊竊私語——你必須在錄音 之前 把翻譯(TLS 終止器)帶進病房,不是錄完之後。

Firewall Rules Logging藥品櫃門的刷卡紀錄——開著有用、關著就什麼都沒有。如果醫院從來沒在那個藥櫃啟用記錄,藥品失竊案就無從究辦。

如果 PCNE 題目問的是 取樣率 / 彙整間隔 / metadata vs. payload,用 ALPR vs. 行車記錄器 的比喻。如果問 collector backend 規模或鏡像分接點要放哪裡收發室 X 光機在平行輸送帶上 最貼切。如果問為什麼 被拒絕的流量沒有出現在 Cloud Logging印表機沒打開的收費站 就是正確的心智模型。Reference: https://cloud.google.com/vpc/docs/packet-mirroring

Packet Mirroring 架構:Producer、Tap、Collector

Packet Mirroring 是 區域級的 VPC 網路功能,它複製選定 VM 的流量,並將副本送往同一個 VPC 網路、同一個 region 內的 collector。沒有跨 region 或跨 VPC 的魔法。三個實體要記清楚:被鏡像的 producer(被複製的對象)、鏡像分接點(NIC 層級執行複製的勾子)、collector(副本的接收方)。

被鏡像的 producer 是被「選」中的,不是「設定」上的

你不會直接「在某台 VM 上開啟鏡像」。你建立一個 mirroring policy,透過三種選擇器之一指定 producer:subnet(subnet 裡的每一台 VM,包含未來新增的)、instance 清單、或 網路 tag 清單。tag 最有彈性——在新 VM 加上 pci-tier 就自動把它納入 policy。你還可以額外用 IP CIDR、protocol(tcpudpicmpesp)、direction(INGRESSEGRESSBOTH過濾 被鏡像的流量。

Collector 必須是 Internal TCP/UDP Load Balancer

collector 不是 單一 VM。它是一個 Internal TCP/UDP Load Balancer,forwarding rule 上設定 is_mirroring_collector=true 旗標。後端 instance group 跑 IDS / DPI 軟體(Cloud IDS endpoint、Palo Alto VM-Series、Suricata、Zeek)。ILB 用 對稱 hash 把鏡像封包分送給後端池——同一條 flow 永遠落在同一個檢測器上,對 stateful 通訊協定至關重要。

鏡像封包在 Google fabric 中以 GRE 封裝

複製出來的封包被封裝後,以副本形式送達 collector 子網路。collector 後端收到的是 完整原始封包(Ethernet header、IP header、payload)並進行檢測。原始封包送往真正目的地的路徑與時序完全不受影響。

gcloud workflow

gcloud compute forwarding-rules create ids-collector-fr \
  --region=us-central1 \
  --load-balancing-scheme=INTERNAL \
  --backend-service=ids-collector-bes \
  --is-mirroring-collector \
  --network=prod-vpc \
  --subnet=collector-subnet

gcloud compute packet-mirrorings create pci-mirror \
  --region=us-central1 \
  --network=prod-vpc \
  --collector-ilb=ids-collector-fr \
  --mirrored-tags=pci-tier \
  --filter-protocols=tcp,udp \
  --filter-direction=BOTH

Packet Mirroring policy 與其 collector ILB 必須住在同一個 VPC 網路、同一個 region。你無法把 VPC A 的流量鏡像到 VPC B 的 collector,即使兩個 VPC 已經 peer 或透過 Network Connectivity Center VPC Spokes 連通。解法是(1)每個 producer VPC 自己一條 mirror policy 加一個 collector,或(2)把工作負載收斂到 Shared VPC、由 host project 擁有 collector ILB。Reference: https://cloud.google.com/vpc/docs/packet-mirroring#collector-restrictions

Mirroring Policy 選擇邏輯:Subnet、Instance、Tag、Filters

Policy 是中央控制平面物件。把它的選擇器和過濾器配置正確,是「10 倍成本超支」與「精準、易稽核的鏡像」之間的差別。

Subnet 範圍鏡像

指定 VPC 內 單一個 subnet;該 subnet 內的每一台 VM(含未來新增的)都成為 producer。最適合「把 PCI 持卡人資料 subnet 全部鏡像」。陷阱:用途混雜的 subnet 會把剛好共用 IP 段的非 PCI 工作負載一併鏡像。

Instance 範圍鏡像

列出明確的 Compute Engine instance URI。適合 定點調查(「只鏡像這三台疑似失陷的 VM」),但不易擴展;fleet 一變動就要更新清單。不適合自動擴縮的 instance group。

Tag 範圍鏡像

列出網路 tag。最具彈性:任何 --tags 包含該 tag 值的 VM 都會自動納入。搭配在 MIG(Managed Instance Group)的 instance template 注入該 tag,自動擴縮的 fleet 就能在零 policy 編輯下持續被涵蓋。

Filters 精修鏡像範圍

選擇器選出 producer 之後,filter 決定 producer 流量中哪些封包真的被複製。filter 欄位:

  • CIDR--filter-cidr-ranges=10.0.0.0/8,203.0.113.0/24——只鏡像來源或目的命中的封包。
  • Protocol--filter-protocols=tcp,udp,icmp,esp——其餘丟棄。
  • Direction--filter-direction=INGRESS|EGRESS|BOTH——預設 BOTH。

Priority 與衝突解析

多個 policy 可以同時套用到同一台 VM。每個 policy 有 priority(預設 1000);衝突欄位 數值小者勝,所有被選的 protocol/CIDR 採聯集。勝出 policy 的 collector ILB 收下所有鏡像封包,所以選擇器有重疊時請刻意設計 priority。

  • Mirroring policy:區域級 VPC 網路資源(packetMirrorings.googleapis.com),列出 producer 選擇器、filter、collector。
  • Producer selector:subnet / instance 清單 / tag 清單——決定 哪些 VM 被鏡像。
  • Filter:CIDR + protocol + direction——精修 哪些封包 被複製。
  • Collector ILB:Internal TCP/UDP Load Balancer,is_mirroring_collector=true;後端 instance group 跑 IDS/DPI 軟體。
  • Mirrored source range:額外的 --mirrored-subnets/--mirrored-instances/--mirrored-tags 清單,限縮 producer 側。
  • Mirror destination:collector ILB forwarding rule 的簡稱。
  • Reference: https://cloud.google.com/vpc/docs/using-packet-mirroring

頻寬影響與 Collector 規模規劃

鏡像對 producer 側 並非免費。雖然 Google 在網路 fabric 完成複製,但鏡像封包會消耗 producer VM egress 頻寬配額,而且如果 collector ILB 後端落在不同 zone,你還要付 跨 zone egress 費用。請依此規劃。

雙倍法則

一個產生 3 Gbps 合法南北向流量的工作負載,若 --filter-direction=BOTH,會產生 大約 6 Gbps 的鏡像流量(ingress 與 egress 各複製一份)。如果 collector ILB 後端總容量只有 5 Gbps,封包會在檢測器處被靜默丟棄——producer 看不到錯誤、檢測器漏看流量、IDS 漏看攻擊。請以 ≥2× 尖峰 producer 吞吐量規劃檢測器容量。

跨 zone egress 成本

collector ILB 把鏡像封包分配給(可能)多個 zone 內的後端。跨 zone egress 依 Compute Engine 標準費率計費。要降成本,把 backend MIG 部署在 producer VM 大多數所在的 同一個 zone。對於多 zone producer fleet,要嘛接受跨 zone 帳單、要嘛改成 每個 zone 一個 collector ILB,配合 zone 範圍的 mirror policy(罕見——通常成本可接受)。

每 VM 的鏡像額外負荷

鏡像在 host hypervisor 實作,不是 在 guest 裡。producer VM 沒有可測得的 CPU 成本。但 producer VM 的 egress 頻寬上限(參見 machine type 頻寬上限)會把鏡像的 egress 計入。一台 32 Gbps 上限的 16-vCPU n2-standard-16 VM,推送 18 Gbps 真實 egress + 18 Gbps 鏡像 egress 就會打滿上限、拖慢真實流量。

Collector 後端自動擴縮

建構 collector MIG 時,依 CPU > 60% 或 IDS 程序匯出的 自訂指標 設定自動擴縮。流量在事件發生時會突然飆高——那正是你最不能讓檢測器丟封包的時刻。把 最小副本數 設成 ≥2 以維持 zone 級冗餘。

collector 只有 1 Gbps 卻面對 4 Gbps 鏡像 producer 流量時,不會 對 producer 產生回壓訊號。複製出來的封包單純在 host fabric 內排隊、queue 滿之後就被丟掉。你的 IDS 在尖峰時段反而看到 較少 警報——和直覺完全相反。請監看檢測器 NIC 的 receive-byte 計數器,以及 collector ILB 的 loadbalancing.googleapis.com/network/received_bytes_count,與 fleet 實際鏡像吞吐量比對。Reference: https://cloud.google.com/vpc/docs/packet-mirroring#bandwidth

加密流量的解密邊界

這是關於 Packet Mirroring 最考試相關的一條事實:它什麼都不解密。collector 看到的就是線上的內容,含密文。

檢測器在 TLS flow 上看到什麼

在 TLS 加密連線(HTTPS、gRPC-TLS、TLS 包裝的 SMTP)上,檢測器讀得到:

  • TCP/IP header(來源、目的、port)——完全可見。
  • TLS handshake:ClientHello SNI、ALPN 清單、支援的 cipher suite、JA3/JA3S 指紋、ServerHello 中的憑證鏈。
  • 加密的應用資料:僅是不透明的位元組。沒有 HTTP method、沒有 URL path、沒有 header、沒有 body。

僅憑 handshake metadata 你仍能取得 相當多 訊號——JA3 指紋可以在任何 payload 流動之前就辨識出 C2 工具組,因為它們的 TLS 函式庫產生獨特的 cipher 排序。但你無法只靠原始 Packet Mirroring 檢測 JSON request body 或偵測 URL 內的 SQL injection。

在哪裡終止 TLS 以進行深度檢測

三種把 明文 放上鏡像分接點的架構選項:

  1. External HTTPS Load Balancer 加 SSL policy 與 managed cert——TLS 在 Google 前端終止;鏡像後端 VM 的流量(LB 到後端的傳輸為明文 HTTP,或使用你掌控憑證的 instance 端 HTTPS)。
  2. Internal HTTPS Load Balancer——同樣的模式。
  3. VM 端 TLS 終止器(NGINX、Envoy)以 sidecar 方式運行;鏡像終止器與應用 container 之間(loopback 或共享 NIC)的解密後流量。

Egress TLS 至第三方

若 VM 主動發起對外部服務的 TLS(API 呼叫、webhook 派送),就沒有 Google 前端可做終止。選項是(a)TLS-MITM proxy(Secure Web Proxy、會 bump 的 Squid),使用安裝在 producer VM 上的企業 CA bundle 進行解密,再鏡像 proxy egress;或(b)接受 egress payload 不可檢測,只靠 JA3/SNI/目的 IP 做偵測。

IPsec ESP 流量

若 filter 含 esp protocol,Packet Mirroring 會擷取 ESP 封包,但內容已被 IPsec tunnel 加密。要做 解密後 檢測,請鏡像 VPN gateway 之後、目的子網路上的流量。

VPC Flow Logs:彙整、取樣、Metadata 欄位

VPC Flow Logs 是 子網路範圍 的紀錄功能,針對 subnet 內 VM 觀察到的每一條 TCP/UDP 連線、依 彙整視窗 各產生一筆紀錄。相較於 Packet Mirroring 便宜很多,因為記的是 metadata 而非 payload,但取捨(彙整間隔、取樣率、metadata-annotation 等級)會明顯影響成本、延遲與訊號品質。

在子網路上啟用

Flow Logs 是在 subnet 層級啟用,不是 VPC 或 VM:

gcloud compute networks subnets update prod-web-subnet \
  --region=us-central1 \
  --enable-flow-logs \
  --logging-aggregation-interval=interval-5-sec \
  --logging-flow-sampling=0.5 \
  --logging-metadata=include-all

彙整間隔

一條 flow 的起訖時間在被紀錄前會被歸入一個視窗。可選視窗為 5 秒、30 秒、1 分、5 分、10 分、15 分。5 秒視窗會產生最多紀錄條目(每條活躍 flow 每 5 秒一條)、成本最高、解析度最好;15 分最便宜、最粗。SOC 與事件回應通常用 5 秒或 30 秒。純合規保存則 5 分 可接受。

取樣率

浮點數 0.0 – 1.0,控制 subnet 紀錄的 flow 比例。1.0 = 全部;0.5 = 一半;0.1 = 10%。取樣率線性縮放紀錄量。Dev subnet0.1 即可。正式環境0.51.0 以求完整可見度。PCI 持卡人資料 subnet1.0——稽核員預期紀錄完整、不接受統計取樣。

Metadata 等級

三種額外註解選擇:

  • include-all——VM instance 名稱、VM instance ID、project、zone、GKE pod/service/namespace(若適用)、Compute Engine instance group、遠端 IP 的 AS 資訊、GCE region。
  • exclude-all——僅 5-tuple、bytes、packets、起訖時間。最便宜。
  • custom——明確的欄位清單(較新功能),用於細粒度成本控制。

紀錄條目的關鍵欄位

紀錄 JSON 包含(位於 jsonPayload 之下):

  • connection.src_ipconnection.dest_ipconnection.src_portconnection.dest_portconnection.protocol
  • src_instance(含 vm_nameregionzoneproject_id)。
  • dest_instance(若兩端都在 VPC 內部)。
  • src_vpc / dest_vpc(network 名稱、subnetwork)。
  • src_gke_details / dest_gke_details——GKE pod 用。
  • bytes_sentpackets_sentstart_timeend_time
  • reporter——SRCDEST,標示哪一端觀察到該 flow。
  • rtt_msec——TCP flow 的測得 RTT。
  • dest_country / dest_continent——遠端 IP 為外部時的地理位置。

VPC Flow Logs 看不到什麼

Flow Logs 預設只紀錄 被允許 的 flow——被防火牆規則丟棄的東西 不會 出現在 flow log 串流。要看到被丟封包,得用 Firewall Rules Logging(下一節)或 Network Intelligence Center 的 Firewall Insights

  • 彙整間隔5 秒(預設) | 30 秒 | 1 分 | 5 分 | 10 分 | 15 分。越粗越便宜、越不即時。
  • 取樣率0.0 – 1.0。Console GUI 預設 0.5、部分 Terraform module 預設 1.0。Dev 0.1、Prod 0.5–1.0、受監管 1.0
  • Metadatainclude-all | exclude-all | custominclude-all 給 VM/GKE/AS 資訊;exclude-all 只有 5-tuple。
  • 範圍:每個 subnet,不是 VPC。每個 subnet 各自切換。
  • 擷取:僅 被允許 的 flow。被拒絕的需要 Firewall Rules Logging。 Reference: https://cloud.google.com/vpc/docs/flow-logs

Firewall Rules Logging:每條規則自選加入紀錄

VPC 防火牆規則(以及階層式防火牆 policy、network firewall policy)預設不紀錄。每條規則各自有 --enable-logging 旗標,忘記打開是前五大維運痛點之一。

逐條規則啟用

gcloud compute firewall-rules update default-deny-ingress \
  --enable-logging \
  --logging-metadata=include-all

階層式 policy:

gcloud compute firewall-policies rules update 1000 \
  --firewall-policy=org-baseline \
  --organization=123456789 \
  --enable-logging

防火牆紀錄的內容

紀錄條目包含:

  • rule_details.reference——規則的完整名稱。
  • rule_details.action——ALLOWDENY
  • rule_details.priority
  • disposition——ALLOWEDDENIED
  • connection——與 Flow Logs 相同的 5-tuple。
  • src_instance / dest_instance(若可解析)。
  • instance.vm_name——觀察到該封包的 VM。

紀錄成本控制模式

在話多的 allow-internal 規則上紀錄每一條連線既貴又低訊號。常見模式:

  • 只紀錄 deny 規則——高訊號(入侵嘗試、誤設用戶端)、低流量。
  • 紀錄敏感路徑的明確 allow 規則(PCI subnet ingress)——合規所需。
  • 不紀錄 話多的內部 allow-all 規則——接受由 Flow Logs 完成稽核。

防火牆紀錄與 Flow Logs 有何不同

Flow Logs 看到連線層級 metadata,不論哪條規則允許。Firewall Rules Logging 把封包歸屬到特定規則動作,包括 Flow Logs 從不記錄的 deny。一般而言會在 deny 規則上啟用 Firewall Rules Logging,已被允許的 flow 則依賴 Flow Logs 做稽核。

隱含的 default-deny-ingressdefault-deny-egress 規則 無法啟用紀錄——它們是隱含、不是明確的規則。要對被拒絕的流量取得可見度,請建立一條明確的 catch-all deny 規則:--priority=65534--action=DENY--direction=INGRESS--rules=all 設定 --enable-logging。沒有這條規則,被拒絕的連線嘗試(port scan、誤設服務、入侵探測)在 Cloud Logging 不會留下任何痕跡。Reference: https://cloud.google.com/vpc/docs/firewall-rules-logging#log-records

Log Sink 至 BigQuery:從 Cloud Logging 到查詢引擎

Cloud Logging 預設保留 flow logs 與防火牆紀錄 30 天,可設定到最多 3650 天,但成本線性上升。要做長期保留、隨選 SQL 分析、儀表板、SOC 調查工具,標準做法是把 logs sink 到 BigQuery

建立 sink

gcloud logging sinks create flow-logs-to-bq \
  bigquery.googleapis.com/projects/sec-ops/datasets/network_logs \
  --log-filter='resource.type="gce_subnetwork" AND logName=~"compute.googleapis.com%2Fvpc_flows"' \
  --use-partitioned-tables

--use-partitioned-tables 旗標 至關重要:它建立日期分區表(一張邏輯表、每天一個 partition),讓你能透過 partition 過期控制儲存成本,並讓查詢用 _PARTITIONTIME 限定日期範圍。

授權 sink writer

sink 指令會回傳一個 writer service accountserviceAccount:[email protected]);請在目的 dataset 上授予 roles/bigquery.dataEditor。沒有這一步,sink 會靜默產生零筆 row。

跨 project / organization sink

要做組織級彙整,在 organization 層級建立 sink,加上 --include-children,writer SA 就會在所有子 project 取得權限。把整個組織的 VPC flow logs 路由到單一 security BigQuery dataset——典型的 SOC 架構。

Partition 過期控制成本

ALTER TABLE network_logs.compute_googleapis_com_vpc_flows
SET OPTIONS (partition_expiration_days = 365);

自動刪除 365 天前的 partition。PCI(1 年線上 + 1 年封存)的話,搭配 Cloud Storage sink 做封存層。

常用 BigQuery SQL 查詢:Top Talkers、Denied Connections、Egress 成本

flow logs 進入 BigQuery 後,少數幾個樣板查詢即涵蓋 80% 的 SOC 與 FinOps 場景。

查詢 1——過去 24 小時的 top talker(依 egress 位元組)

SELECT
  jsonPayload.src_instance.vm_name AS src_vm,
  jsonPayload.connection.dest_ip AS dest_ip,
  jsonPayload.dest_country AS dest_country,
  SUM(CAST(jsonPayload.bytes_sent AS INT64)) AS total_bytes
FROM `sec-ops.network_logs.compute_googleapis_com_vpc_flows_*`
WHERE _TABLE_SUFFIX BETWEEN
  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) AND
  FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY src_vm, dest_ip, dest_country
ORDER BY total_bytes DESC
LIMIT 50;

能抓到資料外洩模式、失控的分析工作、非預期的跨 region 複寫。

查詢 2——依來源 IP 統計被拒絕的連線嘗試

SELECT
  jsonPayload.connection.src_ip AS attacker_ip,
  jsonPayload.connection.dest_port AS targeted_port,
  COUNT(*) AS attempt_count
FROM `sec-ops.network_logs.compute_googleapis_com_firewall_*`
WHERE jsonPayload.disposition = 'DENIED'
  AND _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
GROUP BY attacker_ip, targeted_port
HAVING attempt_count > 100
ORDER BY attempt_count DESC;

浮現 port-scan 攻擊與持續敲打 deny 路徑的誤設用戶端。

查詢 3——跨 region egress 成本歸因

SELECT
  jsonPayload.src_instance.region AS src_region,
  jsonPayload.dest_instance.region AS dest_region,
  ROUND(SUM(CAST(jsonPayload.bytes_sent AS INT64)) / POW(1024, 3), 2) AS gib_sent
FROM `sec-ops.network_logs.compute_googleapis_com_vpc_flows_*`
WHERE jsonPayload.src_instance.region IS NOT NULL
  AND jsonPayload.dest_instance.region IS NOT NULL
  AND jsonPayload.src_instance.region != jsonPayload.dest_instance.region
  AND _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY src_region, dest_region
ORDER BY gib_sent DESC;

FinOps 金礦——浮現意外多話的跨 region 複寫,這是多數 GCP 帳單最大的一筆。

查詢 4——GKE pod 層級流量拆解

SELECT
  jsonPayload.src_gke_details.cluster.cluster_name AS cluster,
  jsonPayload.src_gke_details.pod.pod_name AS pod,
  jsonPayload.connection.dest_ip AS dest_ip,
  SUM(CAST(jsonPayload.bytes_sent AS INT64)) AS bytes
FROM `sec-ops.network_logs.compute_googleapis_com_vpc_flows_*`
WHERE jsonPayload.src_gke_details IS NOT NULL
  AND _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
GROUP BY cluster, pod, dest_ip
ORDER BY bytes DESC
LIMIT 100;

把 GKE 工作負載 egress 對應到特定 pod——當某個 pod 在外洩資料、或誤設服務在打外部 API 時極有價值。

查詢 5——長壽 flow 關聯

SELECT
  jsonPayload.connection.src_ip,
  jsonPayload.connection.dest_ip,
  jsonPayload.connection.dest_port,
  TIMESTAMP_DIFF(MAX(TIMESTAMP(jsonPayload.end_time)),
                 MIN(TIMESTAMP(jsonPayload.start_time)), SECOND) AS duration_sec
FROM `sec-ops.network_logs.compute_googleapis_com_vpc_flows_*`
WHERE _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
GROUP BY 1, 2, 3
HAVING duration_sec > 3600
ORDER BY duration_sec DESC;

浮現長期 C2 callback、失管的 SSH tunnel 與長壽可疑 session。

Network Connectivity Center + Packet Mirroring 模式

Network Connectivity Center(NCC)提供託管的中心輻射拓撲,包含 VPC SpokesHybrid Spokes(VPN/Interconnect)、Router Appliance Spokes。Packet Mirroring 與 NCC 在兩個考試會考的地方交會。

鏡像無法跨越 hub

核心限制:Packet Mirroring policy 與 collector 必須共用 同一個 VPC 網路。NCC 的 hub-and-spoke 連通多個 VPC,但 沒有 形成統一的 VPC。兩個後果:

  1. 你不能把 collector ILB 放在 hub project、把 spoke VPC 的 producer 流量鏡像進來——鏡像會需要跨越 peering,而它做不到。
  2. 每個 spoke VPC 都需要自己的 collector ILB(最好還有自己的 Cloud IDS endpoint 或第三方 IDS instance)。

模式 A——每個 spoke 各自檢測

最常見。每個 spoke VPC 跑自己的 Packet Mirroring policy 與 collector ILB。SOC 從各檢測器獨立消費警報——通常把 IDS Pub/Sub 結果統一路由到一個中央 topic。成本隨 spoke 線性成長,但隔離乾淨。

模式 B——透過 hub 的 NVA 集中檢測

若 hub-and-spoke 設計 必須 集中檢測,答案 不是 Packet Mirroring,而是透過 hub 的 Network Virtual Appliance(NVA)做流量導引。spoke 透過 NCC 把流量送到 hub、NVA inline 檢測後轉發。這是用 inline 延遲換集中可見度——和 Packet Mirroring 相反 的取捨。

模式 C——Shared VPC 收斂

擁有許多小工作負載 project 的組織最合適:收斂到 Shared VPC、一個 host project。host project 擁有一條 mirror policy 與一個 collector ILB;service project 的 VM 落在 host project 的 subnet 內,自動被鏡像。當題目提到「最小化維運負擔」並要做鏡像檢測時,PCNE 考試偏好這個模式。

模式 D——跨 region SOC 彙整

多 region producer fleet 時,每個 region、每個 VPC 部署一條 mirror policy + 一個 collector ILB。每個檢測器把結果送到區域 Pub/Sub topic,再透過 Pub/Sub-to-BigQuery Dataflow template 彙入單一 SOC BigQuery dataset。SOC 儀表板用統一 dataset 跑跨 region SQL。

比較表:鏡像 vs. Flow Logs vs. 防火牆紀錄

維度 Packet Mirroring VPC Flow Logs Firewall Rules Logging
擷取內容 完整封包(header + payload) 5-tuple + metadata,無 payload 5-tuple + 規則動作 + disposition
看得到 deny 流量? 看得到(若鏡像於丟棄前) 看不到(只有 allowed) 看得到(規則啟用紀錄時)
看得到加密 payload? 看不到(沒有 TLS 終止就只能看密文) 不適用(無 payload) 不適用(無 payload)
彙整 無——即時串流 5 秒 – 15 分視窗 每條連線
取樣 依 CIDR/protocol filter;無統計取樣 0.0–1.0 取樣率 每條規則開關
預設狀態 停用——必須建立 policy 每個 subnet 預設停用 每條規則預設停用
成本驅動 檢測器運算 + ILB egress + 跨 zone 紀錄量 × 取樣率 × metadata 等級 紀錄量 × 規則流量
輸出目的地 Collector ILB → IDS 後端 Cloud Logging → 選用 sink Cloud Logging → 選用 sink
典型用途 DPI、IDS、合規證據 top-talker 分析、地理、GKE flow 稽核 入侵嘗試偵測、規則效能

常見 PCNE 考試情境

情境 A——合規要求 PCI subnet 上做 DPI 且不增加延遲

「PCI 稽核要求對持卡人資料網路做深度封包檢測。」答:用 tag 選擇器 pci-tier、filter tcp,udp、direction BOTHPacket Mirroring,鏡像進 collector ILB 後端的 Cloud IDS endpoint。Out-of-band,對正式流量零延遲。

情境 B——明顯的 port scan 卻不在 Cloud Logging 出現

「SOC 回報 Cloud Logging 找不到一波明顯的 port-scan 紀錄。」答:預設 deny 是隱含、無法紀錄;請在 priority 65534 加一條 明確的 catch-all deny 規則,並 --enable-logging。之後 deny 就會被擷取。

情境 C——跨 VPC 鏡像失敗

「三個工作負載 VPC peer 到 security VPC,workload VPC 的 mirror policy 指向 security VPC 的 collector ILB。」答:鏡像不能跨 VPC peering 或 NCC VPC Spokes。每個 producer VPC 需要自己的 collector ILB,或把工作負載收斂到 Shared VPC。

情境 D——被鏡像的 HTTPS 只看得到密文

「DPI 引擎只看到加密 blob。」答:在上游終止 TLS(External HTTPS LB 加 managed cert),鏡像後端解密後的流量;或在 instance 端跑 TLS 終止器(NGINX/Envoy)、鏡像 VM 內部的明文路徑。

情境 E——Top-talker BigQuery 查詢逾時

「對著一年份的 flow logs 跑 SOC 查詢,要跑好幾分鐘。」答:確認 sink 使用 --use-partitioned-tables,並在 WHERE 用 _PARTITIONTIME_TABLE_SUFFIX 限縮在單一 partition、而非掃整年。

成本剖析

三個成本維度要管理:

  1. VPC Flow Logs 儲存——Cloud Logging 在每月免費額度(每 project 50 GiB)之上以每 GB 攝取量計費。槓桿:降低 取樣率、放寬 彙整間隔、對話多的 subnet 用 exclude-all metadata、對話多的 allow-rule flow 設 log exclusion。
  2. Packet Mirroring——沒有直接的鏡像費,但 collector ILB 後端 VM、其跨 zone egress 與 IDS 授權/用量按正常方式計費。槓桿:嚴控 producer 選擇器、用 protocol/CIDR filter。
  3. BigQuery 儲存 + 掃描——log sink 持續 ingest;partition 過期控制長期儲存。槓桿:partition_expiration_days、建立彙總表替代原始掃描、儀表板用 BI Engine。

常見問題

問:VPC Flow Logs 會擷取被拒絕的流量嗎?

不會。Flow Logs 只紀錄 被允許 的 flow。要看到被拒絕的連線,請在明確 deny 規則上啟用 Firewall Rules Logging(隱含的 default-deny 無法紀錄——請在 priority 65534 加一條 catch-all 明確 deny,並 --enable-logging)。

問:Packet Mirroring 能檢測 HTTPS payload 嗎?

原生鏡像流量做不到——檢測器只能看到密文。請在鏡像分接點上游終止 TLS(External HTTPS LB 加 managed cert,或 instance 端 NGINX/Envoy 終止器),鏡像 解密後 的段落。

問:Collector ILB 可以與 producer VM 不在同一個 VPC 嗎?

不行。Packet Mirroring policy 與 collector ILB 必須共用同一個 VPC 網路與 region。這個限制適用於 VPC peering、Network Connectivity Center VPC Spokes、以及 Shared VPC 的 service-project 邊界(host-project 的 VPC 是共享基底,所以同一個 Shared VPC 內的 host + service project 是可行的)。

問:彙整間隔如何影響成本與解析度?

5 秒彙整間隔是預設值,每條連線產生最多紀錄條目(每條活躍視窗一條),保真度最高、成本最高。較粗的間隔(30 秒、1 分、5 分、10 分、15 分)減少每條 flow 的條目數,降低成本但模糊掉視窗內的時序細節。SOC/鑑識用 5–30 秒;封存/合規可用 5 分。

問:如何對 flow log sink 寫出有效率的 BigQuery 查詢?

WHERE 永遠加 _PARTITIONTIME_TABLE_SUFFIX 條件,把掃描限縮在一個或少數幾天的 partition。避免 SELECT *——flow log 紀錄很寬,只選需要的欄位。若常做被拒絕 IP 鑑識,可在 jsonPayload.connection.dest_ip 上做 cluster。

問:能鏡像同 subnet 內 VM 之間(east-west)的流量嗎?

可以。Packet Mirroring 擷取選定 producer VM 的所有流量,不論目的地——同 subnet east-west、同 VPC 跨 subnet、對網際網路的 egress 都會被鏡像。

問:Packet Mirroring 會增加原始封包的延遲嗎?

不會。複製走的是 host 網路 fabric 內的平行路徑;原始封包以全速繼續送往實際目的地。鏡像完全 out-of-band,對正式流量零延遲。不過頻寬會計入 producer VM 的 egress 上限。

官方資料來源

更多 PCNE 主題