海外雲在線 海外雲在線 立即諮詢

GCP國際帳號代理 GCP子網路由表自定義配置教程:實現多網卡實例策略路由與流量轉發

谷歌雲GCP / 2026-09-04 15:17:30

前言:為什麼需要自定義子網路由

很多人第一次用 GCP,會依賴「系統預設路由」:子網會自動把目的地交給合適的下一跳,網路看起來就能跑起來。但一旦你進入更複雜的場景,例如多網卡(multi-NIC)主機、同時連接多個出口、需要依「來源地址/應用/目的類別」做差異化轉發,預設路由往往不夠準確。你會遇到下列典型問題:

第一,流量從 A 子網進來,應該走 B 出口的策略,卻被系統預設路由導到另一條路。第二,回程路由不一致,導致會話被對端丟棄或出現不對稱路徑。第三,你需要把某些服務流量導向特定防火牆/代理/網關,但卻無法只靠目的網段靜態匹配。解法通常是「網路層自定義路由表 + 主機層策略路由(PBR)」的組合。

本文聚焦在 GCP 子網路由表(Route)自定義配置,並以多網卡實例策略路由與流量轉發為主線,給出可落地的設計思路與步驟。你會看到:怎麼建路由、怎麼讓 GCP 把流量交給正確下一跳,接著如何在 Linux 內對不同流量做標記與選路,最後如何驗證與排錯。

目標與架構:多網卡實例 + 兩段網路策略

我們假設一個常見需求:同一台 VM 需要同時連到兩個子網(兩張 NIC),分別代表「內網側」與「外網側」。此外,對不同目的網段或不同來源(例如特定服務),要走不同出口,甚至要經過不同的轉發節點。

可用的架構抽象如下:

  • VPC 內有兩個子網:subnet-a(例如 10.10.0.0/24)與 subnet-b(例如 10.20.0.0/24)。
  • 一台路由/轉發主機或業務主機(VM)掛兩張網卡:eth0 在 subnet-a,eth1 在 subnet-b。
  • 你希望:來自 subnet-a 的特定目的(或特定流量)走 eth1;其他流量走預設路徑。
  • GCP國際帳號代理 更進階時,你可能把「下一跳」指到某台防火牆/轉送器(可在 GCP 內,也可在互連網段/HA VPN/Interconnect 背後)。

在 GCP 端,我們會用路由表定義「目的地網段 → 下一跳」。在 VM 端,我們再用策略路由把不同流量導向不同的網卡或下一跳,確保封包的來源/回程符合預期。

第一部分:GCP 子網路由表的基礎與關鍵概念

路由表是什麼:從目標網段匹配到下一跳

在 GCP VPC 中,路由會依「目的 IP」匹配,然後選擇下一跳:

  • GCP國際帳號代理 目的地(Destination range):例如 0.0.0.0/0 或特定網段。
  • 下一跳(Next hop):下一跳是 GCP 內的資源(下一跳 VM 的 IP)或互連設定。
  • 優先序(Priority):相同目的網段更細或優先序更高的路由會被選用。
  • 適用範圍(Tags / Service accounts / Directions 等概念):通常用 Network tags 或 service account 讓路由僅套用到某些 VM。

你要做到策略路由,並不是一定要在 GCP 端做到所有精細控制;GCP 端負責把流量「交給正確的下一段路徑」,VM 端再把「同一方向但不同流」分流。

重要:路由不等於連通性,防火牆先看清

很多人把「路由沒命中」當成根因,但實際上是防火牆擋掉了。

GCP國際帳號代理 在 GCP 中,連通性大致要同時滿足:

  • 路由能把封包送到下一跳。
  • 該下一跳/目標 VM 的防火牆規則允許入站。
  • 來源方向也要符合(若你有複雜轉發,還需要注意回程和 NAT/轉發的規則)。

若你做的是轉發主機,還要確保 Linux IP forwarding 打開,並且防火牆策略不阻擋轉發。

理解 Priority:同網段多條路由時誰說了算

自定義路由很容易被預設路由或其他自定義路由蓋過。原則是:

  • 目的網段更精確(更長的前綴)通常會優先匹配。
  • 若前綴相同或競爭條件,priority 值影響選擇。

因此建議你在設計時就把路由命名、priority、目的網段層級想清楚,否則排查會很痛苦。

第二部分:在 GCP 建立自訂路由(Route)

規劃:你要把哪些流量導到哪個下一跳

以我們的目標為例,假設 VM 的 eth0 在 subnet-a,eth1 在 subnet-b。你希望:

  • 對某些目的網段(例如 172.16.50.0/24,代表一個特定後端),流量從 subnet-a 進來時要導向下一跳(下一跳可以就是這台雙網卡 VM 的其中一個介面 IP,或指向一台轉發器 VM)。
  • 對其他網段採用預設系統路由。

在 GCP 路由中,這通常意味著你會在某個路由表(實際上 Route 是在 VPC 層級存在、但可用 network tags/service accounts 讓其對應子網內 VM)增加一條目的網段特定的路由。

更常見做法是:讓「來源 VM」使用 tags,然後讓路由只對這些 tags 生效,避免影響整個網段。

實作:建立自訂路由的步驟(概念流程)

在 GCP Console 或透過指令建立 Route,核心參數通常包括:

  • Route name:例如 route-to-backend-via-forwarder
  • Network:你的 VPC 名稱
  • Destinations:例如 172.16.50.0/24
  • Next hop:例如 forwarder VM 在該網路的 IP
  • Priority:例如 1000 或更小值(依你的設計)
  • Applied to:使用 Network tags 讓路由僅套用到指定 VM

實務上我建議你先用較寬的目的網段驗證,確定封包會走你預期的下一跳,再逐步收窄目的範圍與條件。否則你會遇到「路由看似建立了但沒有命中」的情況,排查門檻會很高。

下一跳選擇:直接指到 VM 還是指到下一台轉發器

當你用雙網卡 VM 做轉發,有兩種模式:

  • 模式 A:把下一跳指到轉發器 VM。源端 VM 封包先到轉發器,再由轉發器內部決定送到 eth0 或 eth1。
  • 模式 B:直接在源端用多條 GCP 路由把封包送到不同網段。這需要你的目的網段與下一跳映射足夠清楚,否則就要爆炸性增加路由。

GCP國際帳號代理 策略路由通常選模式 A,因為它把複雜度下放到主機層,容易做更精細的條件分流。

第三部分:在雙網卡 VM 上做策略路由(PBR)與流量轉發

路由表讓「封包先到哪」更可控,但要做到多網卡實例的精準選路,你仍需要在 VM 的 OS 層完成策略路由。下面以 Linux 為例,因為它對 netfilter、ip rule、ip route 這套能力支援完善。

準備:開啟 IP forwarding 並理解 rp_filter

如果你的 VM 充當路由器/轉發器,必須開啟:

  • net.ipv4.ip_forward=1

接著你要注意反向路徑過濾(rp_filter)。在多來源、多介面場景,rp_filter 有時會因為看到「封包回程不在預期介面」而丟棄。建議你在測試期把 rp_filter 設為宽松模式,或對特定介面調整。

實際值你可以依環境調整,但核心思路是:當你做不對稱或策略路由時,rp_filter 不能成為你成功的隱形敵人。

建立基礎路由表:主表(main)與自定義表(例如 100、101)

Linux 的策略路由核心在「多路由表 + ip rule 決定走哪張表」。流程通常如下:

  • 主路由表(main):保持系統預設或你基本需求的路由。
  • 自訂路由表(如 table 100、101):存放你希望從特定來源/標記走向不同下一跳或不同介面。

比如:

  • table 100:優先把流量送到 eth1(對應 subnet-b 的出口)。
  • table 101:優先把流量送到 eth0(對應 subnet-a 的出口)。

用 fwmark/ip rule 做分流:把「你要選的流」標記起來

策略路由最常用做法是:

  • 先在 netfilter(iptables/nftables)對封包打標記(mark)。
  • 再用 ip rule 依 mark 選擇路由表。

為什麼要這樣?因為你在 OS 層可以依據:

  • 來源/目的 IP
  • 來源/目的埠
  • 應用層協定(透過端口/協定推斷)
  • 網卡入站介面(iif)

來做比「只有目的網段」更細的判斷。這能把策略路由的可控性大幅提升。

一個可落地的策略:依目的網段導向不同介面

假設你要把目的網段 172.16.50.0/24 的流量導向 eth1。可用的思路:

  • GCP國際帳號代理 在 PREROUTING(mangle 表)將這個目的網段的封包 mark 為 0x64。
  • 用 ip rule:fwmark 0x64 → 使用 table 100。
  • 在 table 100 的路由中,把 172.16.50.0/24 指向你希望的下一跳或出口。

接著你再處理回程:回到 table 100 選路後,源地址與介面要合理,否則對端可能覺得你「不是從它以為的那個地方回來」。

第四部分:把 GCP 路由與 OS 策略路由對齊,避免不對稱與黑洞

很多「看起來路由都有配但就是通不了」的問題,根因通常不是單一設定錯,而是兩層路由不一致。你需要確保三件事:

  • 封包到達轉發器的方向正確(GCP 路由表)。
  • 轉發器在入站後對目標的選路正確(OS 策略路由)。
  • 回程路由在對端視角成立(源地址、SNAT/回程表、以及可能的 rp_filter)。

回程路由一致性:來源地址與 NAT 是策略的一部分

在多網卡 VM 轉發時,最常見的「成功發出但對方回不來」原因是來源地址選擇不一致。

假設:

  • 你從 eth1 對外送包,但封包的 source IP 仍是 eth0 的地址,對端可能會根據路由或安全策略把回程送錯地方。
  • 或你在出站需要 SNAT,但 OS 沒有做。

因此你需要明確你的「對外顯示的來源」應該是誰:

  • 如果你希望對端看到的是 subnet-b 的地址,那就要讓出站封包的 source IP 對應到 eth1。
  • 如果你要用虛擬 IP 或節點地址,那就需要 NAT(多半在轉發器上做)讓源/目的符合設計。

策略路由能控制走哪張路,但來源地址的選擇有時仍依 kernel 的選擇規則。你要用 ip rule 或更進階的 SNAT/route cache 調整,確保「走 eth1 → 出口源地址也屬於 eth1 的網段」。

在 GCP 端避免「路由交給錯的下一跳」

你可能已經在 VM 端做好策略,但若 GCP 把封包導到另一台不該承接的轉發器,你在 VM 裡做任何 PBR 都不會生效。驗證路由命中很重要。

你可以用 VPC flow logs 觀察封包進出,並以 tcpdump 或 traceroute(有時 UDP/TCP 封包選擇會影響)確認實際路徑。若流量完全不到 VM,那就回頭看 GCP route 的:

  • 目的網段是否正確
  • GCP國際帳號代理 路由是否被 tags/service account 正確套用
  • priority 與系統路由是否競爭

第五部分:策略路由與轉發的完整流程(從零到通)

步驟 1:確定網路介面與靜態資訊

先在 VM 上確認:

  • eth0/eth1 對應的 IP
  • 預設路由與現有路由表
  • 你要用的目標網段

你需要一致的介面命名和 IP,以免 ip rule 綁定條件時失效。

步驟 2:在 VM 建立自訂路由表

你至少需要一張「走 eth1」的路由表,以及一張「走 eth0」的路由表(若雙向需求)。在每張表中加入必要目的網段路由。

如果你的下一跳在 GCP 內是某台 VM 或虛擬網關,下一跳 IP 也要能在對應子網內被 ARP/路由解析到。

步驟 3:用 ip rule 決定走哪張表

用條件(fwmark 或者 from/to)建立 rule。例如:

  • 如果目標是特定網段 → 用 table 100(走 eth1)。
  • 如果來源在某個網段/服務 → 用 table 101。

這裡的條件你可以從簡到繁。先用最粗粒度(目的網段)通了,再把規則精細化到端口或應用。

步驟 4:必要時用 nftables/iptables 做封包標記與 SNAT

若你用 fwmark 模式,就需要在 mangle 表打 mark。

若你的策略要求來源地址固定為某個介面網段,就要做 SNAT。注意 SNAT 的規則要綁定到你預期走哪個出口,避免把不該被翻譯的流也一起翻了。

步驟 5:在 GCP 建立或調整自訂路由,讓封包先到轉發器

此時你要回到 GCP,確認封包確實被送到轉發器 VM,而不是被路由表導到預設出口。

特別是當你的轉發器本身也在特定子網內時,路由表要注意來源範圍與適用條件(tags/service account)。你也要確保沒有其它更優先的 route 抢走流量。

步驟 6:驗證方法(不要只看「能不能 ping」)

驗證建議分三層:

  • GCP國際帳號代理 路由是否命中:用 tcpdump/ss/conntrack 觀察封包出入介面,並確認目的網段的封包走的是你定義的出口。
  • 策略是否生效:檢查 ip rule 命中、mark 統計(可用工具或規則計數器)。
  • 回程是否正常:抓對端回包或觀察 flow logs,確認對端回流到正確來源。

在排錯上,ping 有時會誤導你:它只是一種 ICMP,對應用流量(TCP/UDP)可能走不同策略或被防火牆允許/拒絕。

第六部分:常見錯誤與對策

錯誤 1:路由有命中,但防火牆擋住轉發

如果你在轉發器上做了 IP forwarding,但 GCP 防火牆沒有允許入站/出站,就會出現「進來了但轉不出去」的情況。

對策:明確允許轉發器 VM 兩個介面所需的入站,並允許到下一跳目標的出站(或讓下一跳處於同一安全域)。同時檢查是否有基於標籤的規則未套用。

錯誤 2:不對稱路徑導致會話被對端拒絕

你可能看到一段時間「出站看似成功」,但對端回包被丟棄。常見原因:

  • source IP 不符合對端預期
  • 回程走錯出口
  • GCP國際帳號代理 rp_filter 或 conntrack 狀態導致丟包

對策:確保你在策略路由中同時處理來源地址(必要時 SNAT),並在 OS 層調整 rp_filter 與適當的狀態追蹤。

錯誤 3:GCP Route 沒命中(tags/service account 不一致)

最常見的「明明建了 route 但沒效果」。通常是你把 route 的套用條件限制得太嚴,而目標 VM 的 tags/service account 沒對上。

對策:先做最小化驗證,暫時用較寬的條件(或在測試 VM 上加對應 tag),確認封包能走,再回到正式條件收斂。

錯誤 4:Priority/目的網段前綴競爭,導致走了別的路

如果你在 VPC 裡有多條目的網段路由,某條可能因為前綴更長或 priority 更高而搶走流量。

對策:在設計時把路由階層整理清楚,並在排錯時查看「最終匹配到哪條路由」。

第七部分:實務維運建議(讓你不會三天後又回來重做)

把規則命名成「可理解」而不是「可堆疊」

GCP route 的 name、Linux table id、rule id,都要對應到你的業務意圖。不要只用 generic 名稱,否則你會在未來面對多次變更時失去可追蹤性。

規則拆分:先做最低可用路徑,再加細節

我常建議你把配置拆成三層:

  • 第一層:確保封包能到轉發器(GCP 路由命中)。
  • 第二層:確保轉發器能依目的網段走到正確介面(OS 路由表與 ip rule)。
  • 第三層:再加上端口/服務級標記、SNAT 精細化與例外規則。

這樣排錯時你知道問題卡在哪一層。

記錄你關鍵決策的依據:來源一致性、下一跳選擇理由

策略路由最怕「只會改,卻不知道為什麼」。你要把以下決策寫在內部文件:

  • 為什麼目的網段 172.16.50.0/24 走 eth1
  • 為什麼轉發器不直接由系統路由完成
  • SNAT 的來源是什麼、對應哪個介面

當未來你新增出口或調整子網 CIDR,這些理由能直接告訴你哪些規則要改、哪些不必動。

結語:把「網路控制權」從預設交給你

自定義子網路由表不是為了炫技,而是把流量的控制權收回來。當你需要多網卡實例策略路由與精準流量轉發時,最佳路徑通常不是只在 GCP 端堆路由,也不是只在 VM 端憑感覺調 PBR,而是把職責分清:

  • GCP國際帳號代理 GCP 路由表確保封包先被交給正確的承接點(轉發器/下一跳)。
  • Linux 策略路由確保在承接點內,封包依你的條件走正確出口與下一跳。
  • GCP國際帳號代理 防火牆與回程一致性確保會話能穩定建立、維持並被對端接受。

當你把這三件事對齊,你的多網卡架構就不再是「偶爾能跑」的黑盒,而是可預期、可驗證、可擴展的系統。只要按本文的方法逐層落地與驗證,你就能把路由與轉發做得像工程,而不是像賭運氣。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系