跳至主要內容
ESC
GCP 核心服務 — 第 5/10 篇

GCP-110:VPC 進階網路設計——Shared VPC、VPC Peering 與 Cloud NAT 完全指南

GCP-110:VPC 進階網路設計——Shared VPC、VPC Peering 與 Cloud NAT 完全指南
Updated: 2026-07-19

前言

GCP-104 我們把 VPC 基礎走過一遍:建網路、切子網路、設防火牆規則。這篇要往上一層,講進階場景:專案一多,網路到底怎麼設計才不會亂? 還有,私有 VM 要存取 Google API、或是要連出網際網路,又該怎麼搞定?

這些都是企業環境裡天天會碰到的問題。接下來用四個真實場景一個一個拆,看完你就知道專案多了之後網路該怎麼擺。

💡 動手前先確認

這課接在 GCP-104 後面,預設你已經知道什麼是子網路(subnet)、以及防火牆規則有方向之分——**INGRESS(入站)**管別人連進來、**EGRESS(出站)**管自己連出去。如果這兩個還有點模糊,建議先回頭把 GCP-104 翻一翻,不然底下講 Cloud NAT、防火牆優先順序時會卡住。


場景一:多專案共用網路 — Shared VPC

假設你公司有三個 GCP 專案:dev-projectstaging-projectprod-project,每個各自帶一個 VPC。現在 VM 之間要互通,你得拉幾條 VPC Peering?三條——A↔B、B↔C、A↔C。三個專案還好,等哪天變成十個專案,連線數會爆炸成幾十條,光是管這些對接就夠你頭痛了。

這時候你需要的不是「把每個網路接起來」,而是「大家根本共用同一個網路」。

解法:Shared VPC

Shared VPC 讓你把一個 VPC 共享給多個專案用,這樣只要管一個網路就好。

組織

├─ [Host Project] 主機專案         ← 擁有 VPC、子網路、防火牆規則
│     └─ shared-vpc
│          ├─ subnet-dev
│          ├─ subnet-staging
│          └─ subnet-prod

├─ [Service Project] dev-project   ← 使用 shared-vpc 中的 subnet-dev
├─ [Service Project] staging-project
└─ [Service Project] prod-project

角色與權限

角色誰需要說明
roles/compute.xpnAdmin組織管理員啟用/管理 Shared VPC(xpn = Cross-Project Networking,Shared VPC 的舊內部代號,看到這串別被嚇到,就是它)
roles/compute.networkAdmin主機專案網路管理員管理 VPC 與子網路
roles/compute.networkUser服務專案 Service Account使用共享子網路建立 VM

設定步驟

# 1. 啟用 Shared VPC(需要組織管理員)
gcloud compute shared-vpc enable HOST_PROJECT_ID

# 2. 將服務專案連接到主機專案
gcloud compute shared-vpc associated-projects attach SERVICE_PROJECT_ID \
  --host-project=HOST_PROJECT_ID

# 3. 授予服務專案的 Service Account 網路使用權限
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
  --member="serviceAccount:sa@SERVICE_PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/compute.networkUser"

# 4. 在主機專案建立子網路(供服務專案使用)
gcloud compute networks subnets create subnet-dev \
  --network=shared-vpc \
  --region=asia-east1 \
  --range=10.10.0.0/24 \
  --project=HOST_PROJECT_ID

重要限制

  • 一個專案只能是 主機專案 OR 服務專案,不能兩者兼具
  • 一個服務專案只能附屬於一個主機專案
  • 必須在同一個**組織(Organization)**內

場景二:VPC 間直連 — VPC Peering

什麼是 VPC Peering?

VPC Peering 讓兩個 VPC 直接走 Google 私有骨幹網路互通,不用公開 IP,延遲低、頻寬也高。

⚠️ 關鍵限制:不支援傳遞路由(Non-Transitive)

這是 ACE 考試最愛考的陷阱:

VPC-A ←──peering──→ VPC-B ←──peering──→ VPC-C

問:VPC-A 能透過 VPC-B 連到 VPC-C 嗎?
答:❌ 不能!VPC Peering 不是傳遞的。

A 要連到 C 的話,就得另外再拉一條 A↔C 的 peering。

💡 重點提點:「非傳遞」這四個字釘死它

Peering 只認「直接對接」的兩方。A 跟 B 接了、B 跟 C 接了,不代表 A 就能借道 B 連到 C——這條路 GCP 不會幫你自動打通。三個 VPC 要兩兩互通,你得老老實實拉三條(A↔B、B↔C、A↔C);十個 VPC 全互通就是 45 條,數量會以平方速度膨脹。這也正是專案一多就該換 Shared VPC(大家共用一個網路)或 Network Connectivity Center 的原因。考題只要出現「A 透過 B 連 C」,反射性回答不行就對了。

其他限制

限制說明
子網路不能重疊兩個 VPC 的 IP 範圍(CIDR,標記 IP 區段的寫法,例如 10.0.0.0/24 代表一段 256 個位址)不能重疊;重疊了 GCP 會搞不清楚某個 IP 該送去哪一邊
雙向設定兩個 VPC 都需要各自建立 peering(不是單邊設定)
防火牆獨立各 VPC 的防火牆規則不會互相繼承
跨區域收費跨 region peering 流量有小額費用

設定步驟

# VPC-A 專案建立 peering 到 VPC-B
gcloud compute networks peerings create a-to-b \
  --network=vpc-a \
  --peer-project=PROJECT_B \
  --peer-network=vpc-b \
  --auto-create-routes

# VPC-B 專案也要建立對應 peering(雙向設定)
gcloud compute networks peerings create b-to-a \
  --network=vpc-b \
  --peer-project=PROJECT_A \
  --peer-network=vpc-a \
  --auto-create-routes

# 確認狀態(兩邊都是 ACTIVE 才算成功)
gcloud compute networks peerings list --network=vpc-a
GCP Console 建立對等互連連線(VPC Peering)表單,資訊列說明會以完整網狀拓撲連結並自動建立子網路路徑;對接連線名稱 vpc-a-to-vpc-b,「您的虛擬私有雲網路」待選,對接虛擬私有雲網路選「在其他專案中」,專案 ID 填 peer-project-vpc-b、虛擬私有雲網路名稱填 vpc-b,通訊協定為 IPv4(單一堆疊),下方為交換 IPv4 自訂路徑(匯入/匯出自訂路由)選項
這是 VPC Peering 的建立表單,畫面上填的是「A 這一側」——指定要對接的對方專案(peer-project-vpc-b)跟網路名稱(vpc-b)。記得內文說的雙向設定:對方那個專案也得反過來建一條指回 A 的 peering,兩邊都設好、狀態都 ACTIVE 才算通。至於「非傳遞」,表單不會幫你擋——A↔B、B↔C 各建一條,A 到 C 就是不通,得另外再拉一條 A↔C。

Shared VPC vs VPC Peering 選擇

需求選擇
同組織多專案,需要集中管理單一網路Shared VPC
多個專案想共用同一套子網路與防火牆規則Shared VPC
連接不同組織或外部合作夥伴 VPCVPC Peering
各專案需要獨立的 CIDR 規劃VPC Peering
簡化防火牆管理Shared VPC

場景三:私有 VM 連出網路 — Cloud NAT

為了安全,你很可能會把 VM 的外部 IP 拿掉——沒有公開 IP,外面就攻不進來。但問題立刻來了:這台 VM 想跑 apt-get update、想 pip install 拉套件、想呼叫某個第三方 API,全都連不出去了。沒有對外的門,VM 等於被關在房間裡。

那要怎麼讓它「只能出去、不能被進來」?這就是 Cloud NAT 要解決的事。

解法:Cloud NAT

Cloud NAT 是全托管的出站 NAT 服務,讓沒有外部 IP 的 VM 也能連上網際網路(只出不進)。

私有 VM(無外部 IP)
    │ 出站請求(10.0.0.5 → 8.8.8.8)

[Cloud Router] ← Cloud NAT 掛在這裡
    │ 轉換來源 IP(35.200.x.x → 8.8.8.8)

Internet
    │ 回應(8.8.8.8 → 35.200.x.x)

[Cloud NAT] 把 IP 轉換回去 → VM

⚠️ 重要:Cloud NAT 只支援出站連線

方向是單向的:VM 可以主動發起連線出去,但外面沒辦法主動連進來(不支援 inbound)。如果你的服務需要被外部連入,那 Cloud NAT 幫不上忙——這時候 VM 得有公開 IP,或是擺在 Load Balancer 後面。

建立 Cloud NAT

Cloud NAT 自己不能單獨存在,得搭配一個 Cloud Router(雲端路由器,GCP 裡負責動態管理路由的元件)。你可以把 Cloud Router 想成 NAT 的「掛載點」:它本身管路由,Cloud NAT 則像外掛一樣裝在它上面,借它來處理那些位址轉換。所以順序一定是先建 Router、再建 NAT:

GCP Console 建立 Cloud NAT 閘道表單上半,閘道名稱 my-nat-gateway,網路位址轉譯(NAT)類型選「公開」(另有「私人」),「選取 Cloud Router」區塊有網路、區域、Cloud Router 三個待選下拉選單
建 Cloud NAT 的第一步。注意「選取 Cloud Router」這整塊——如同上面說的,NAT 不能單獨存在,一定要掛在一個 Cloud Router 上;所以這裡得先選網路、區域,再指定(或順手新建)一個 Router。NAT 類型選「公開」,就是讓沒有外部 IP 的私有 VM 透過公網位址連出去。
# 1. 建立 Cloud Router
gcloud compute routers create my-router \
  --network=my-vpc \
  --region=asia-east1

# 2. 建立 Cloud NAT(自動分配 NAT 外部 IP)
gcloud compute routers nats create my-nat \
  --router=my-router \
  --region=asia-east1 \
  --nat-all-subnet-ip-ranges \
  --auto-allocate-nat-external-ips

# 3. 若需要靜態外部 IP(方便 IP 白名單)
gcloud compute addresses create nat-ip-1 --region=asia-east1

gcloud compute routers nats create my-nat \
  --router=my-router \
  --region=asia-east1 \
  --nat-all-subnet-ip-ranges \
  --nat-external-ip-pool=nat-ip-1
GCP Console 建立 Cloud NAT 閘道表單下半「Cloud NAT 對應」,來源端點類型選「VM 執行個體、GKE 節點、無伺服器端點」(另有代管 Proxy 負載平衡器),下方為來源 IP 版本、IPv4 子網路範圍(來源子網路),以及 Cloud NAT IP 位址設為「自動(建議選項)」
再往下就是 NAT 要服務誰、用哪個 IP 出去。來源端點類型那排正好對上下面的支援表——VM、GKE 節點、無伺服器端點都能走這套 NAT。最下面的 Cloud NAT IP 位址「自動」就是讓 Google 幫你配外部 IP(對應 --auto-allocate-nat-external-ips);要固定 IP 方便做白名單,才改成手動指定 IP 集區。

各服務的 Cloud NAT 支援

服務支援 Cloud NAT備注
Compute Engine原生支援
GKENode 和 Pod 均可
Cloud Run✅(透過 Serverless VPC Access 連接器或 Direct VPC Egress)將出向流量導入 VPC 後即可用 Cloud NAT;Direct VPC Egress 為較新的推薦做法
App Engine Standard✅(透過 Serverless VPC Access 連接器)把 connector 的 egress 設成 all-traffic,就和 Cloud Run 走同一套 serverless→VPC→NAT 機制,可取得固定外部 IP

場景四:私有 VM 存取 Google API — Private Google Access

問題

私有 VM 想呼叫 storage.googleapis.com(Cloud Storage API)或 bigquery.googleapis.com,但又不想讓流量走公網。

解法:Private Google Access

在子網路上啟用 Private Google Access,私有 VM 就能走 Google 私有骨幹網路存取 Google API,流量完全不出 Google 網路

私有 VM(無外部 IP)
    │ 存取 storage.googleapis.com

Google 私有骨幹網路(不走公網!)


Cloud Storage API

支援的服務

  • Cloud Storage、BigQuery、Cloud Pub/Sub、Cloud SQL(Auth Proxy)
  • Cloud Logging、Cloud Monitoring
  • 絕大多數 *.googleapis.com 端點(少數區域型的 rep.googleapis.com 端點除外)
  • 不包含:公網網站(GitHub、npm registry 等)→ 需要 Cloud NAT

啟用方式

# 建立子網路時啟用
gcloud compute networks subnets create private-subnet \
  --network=my-vpc \
  --region=asia-east1 \
  --range=10.0.1.0/24 \
  --enable-private-ip-google-access

# 在現有子網路上啟用
gcloud compute networks subnets update private-subnet \
  --region=asia-east1 \
  --enable-private-ip-google-access

Private Google Access vs VPC Service Controls

功能Private Google AccessVPC Service Controls
目的讓私有 VM 存取 Google API防止資料外洩(加安全邊界)
方向私有 VM → Google API雙向存取控制
設定層級子網路組織/專案層級
適合場景基本私有網路需求高度合規、資料外洩防護

💡 重點提點:Cloud NAT 跟 Private Google Access 最容易搞混

這兩個名字長得不像,但新手常常分不清誰管什麼,連考題也愛拿來坑你。一句話記死:Cloud NAT 連的是「公網」(GitHub、npm、第三方 API),Private Google Access 連的是「Google 自家 API」(Cloud Storage、BigQuery…)。 一台沒有外部 IP 的私有 VM,如果它既要 apt-get 又要讀 Cloud Storage,那就是兩個都得設——不是二選一。考場上看到「私有 VM 同時要 apt 和 GCS」這種題目,答案幾乎都是「兩個一起開」。


防火牆規則深度解析

優先順序(Priority)

防火牆規則優先順序:數字越小,優先級越高(0 = 最高,65535 = 最低)。

Priority 0    ─── 最高優先,最先評估
Priority 100  ─── 緊急封鎖規則
Priority 1000 ─── 預設優先值(一般應用規則)
Priority 65535 ── 最低優先,最後評估

建議分配

範圍用途
0–999緊急封鎖(例:阻擋已知攻擊 IP)
1000–9999標準應用規則
10000–64999低優先規則
65000–65534自訂 catch-all 拒絕規則(在隱含規則之前生效)

⚠️ 自訂規則的合法 priority 是 0–65535(含),你其實可以建 priority=65535 的規則。重點在於:VPC 的隱含規則(允許出站、拒絕入站)永遠最後評估,而且自訂規則蓋不過它。所以要自訂 catch-all 拒絕規則時,請用比 65535 小的數字(例如 65000),確保它在隱含的 allow-egress / deny-ingress 之前先生效。

隱含規則(Implied Rules)

每個 VPC 都有兩條隱含的最低優先規則:

priority 65535, allow egress to 0.0.0.0/0   → 允許所有出站
priority 65535, deny  ingress from 0.0.0.0/0 → 拒絕所有入站

這也是為什麼你不設防火牆時,VM 連得出去(出站預設允許),但外面連不進來(入站預設拒絕)。

防火牆規則範例

# 允許特定 IP 範圍 SSH
gcloud compute firewall-rules create allow-ssh-from-office \
  --network=my-vpc \
  --direction=INGRESS \
  --allow=tcp:22 \
  --source-ranges=203.0.113.0/24 \
  --priority=1000

# 允許 HTTP/HTTPS 公開存取
gcloud compute firewall-rules create allow-http-https \
  --network=my-vpc \
  --direction=INGRESS \
  --allow=tcp:80,tcp:443 \
  --source-ranges=0.0.0.0/0 \
  --target-tags=web-server \
  --priority=1000

# 使用 Service Account 作為目標(更安全)
gcloud compute firewall-rules create allow-db-from-app \
  --network=my-vpc \
  --direction=INGRESS \
  --allow=tcp:5432 \
  --source-service-accounts=app-sa@my-project.iam.gserviceaccount.com \
  --target-service-accounts=db-sa@my-project.iam.gserviceaccount.com \
  --priority=1000

Network Tags vs Service Accounts

特性Network TagsService Accounts
安全性較低(任何人都能加 tag)較高(綁定 IAM)
審計紀錄有限完整的 IAM 審計日誌
建議用途開發/測試環境生產環境(推薦)

VPC Firewall Policies(2024+ 推薦)

傳統防火牆規則是綁在單一 VPC 上的(per-VPC)。VPC Firewall Policies 則支援階層式套用:

組織 Firewall Policy(全公司基線規則)
├─ 資料夾 Firewall Policy(事業群規則)
│   └─ 專案 VPC 防火牆規則(應用程式規則)

組織層級的規則可以強制套用到所有 VPC,合規性比較好顧。


把四個場景串起來看

GCP 組織

├── [Host Project] 主機專案 ── Shared VPC ──→ 多個服務專案共用

├── [VPC-A] ── VPC Peering ──→ [VPC-B](跨組織/跨專案直連,非傳遞)

├── 私有子網路 VM
│     ├─ Private Google Access ──→ *.googleapis.com(不走公網)
│     └─ Cloud NAT ──→ Internet(只出站,不入站)

└── 防火牆規則(優先數字小 = 高優先;Service Account > Network Tag)

ACE 考試重點整理

必背知識點

  1. Shared VPC:一個專案不能同時是 host 和 service project
  2. VPC Peering 非傳遞:A↔B、B↔C,但 A 無法透過 B 連到 C
  3. Cloud NAT 只支援出站:無法從網際網路主動連入
  4. Private Google Access 只能存取 Google API,不是完整網路
  5. 防火牆優先數字:數字越小優先級越高(0 = 最高)
  6. 隱含規則:出站預設允許、入站預設拒絕
  7. Service Account > Network Tag(防火牆安全性)

常見陷阱題

Q:VPC-A peering VPC-B,VPC-B peering VPC-C,VPC-A 能連 VPC-C 嗎? A:不能。VPC Peering 不支援傳遞路由,要直接建立 A↔C 的 peering 才行。

Q:私有 VM 要能 apt-get 並且存取 Cloud Storage,需要分別設什麼? A:apt-get → Cloud NAT(公網出站);Cloud Storage → Private Google Access(Google API)。兩個都要設。

Q:Cloud NAT 支援從網際網路連入 VM 嗎? A:不支援。Cloud NAT 純出站(egress only)。

Q:防火牆規則 priority=500 和 priority=1500 哪個先被評估? A:priority=500 先被評估(數字小 = 高優先)。


總結

進階網路看起來名詞一堆,但只要記住每個工具解決的是哪一種痛,就不會亂:

  • Shared VPC:組織內多專案共用一個 VPC,集中管理,需要在同組織內
  • VPC Peering:兩個 VPC 直連,注意非傳遞限制與子網路不重疊
  • Cloud NAT:讓私有 VM 能出站到網際網路,只出不進
  • Private Google Access:讓私有 VM 透過 Google 私有骨幹存取 Google API

下一課 ACE-211:BigQuery 資料倉儲實戰,學習如何用 SQL 分析 PB 級資料。

網路系列

課程主題
GCP-104VPC 基礎、防火牆、Cloud IAP
本課 GCP-110Shared VPC、VPC Peering、Cloud NAT
GCP-114Cloud DNS、DNSSEC、路由策略
ACE-210負載均衡、Cloud CDN、Cloud Armor
ACE-216VPN、Interconnect、混合雲連線
GCP 核心服務 — 5/10 完成 查看系列全覽 →

留言討論

徽章解鎖!