電腦網路與 Internet 通訊

單元 17 政策路由:規則先選表

學習目標與問題

先讀 07 的單表模型與三個決策、13 的轉送與路由控制、16 的 SNAT 與有狀態防火牆。本單元學 Linux 政策路由:規則依 priority 先選表,最長前綴匹配在所選的表內。完成後應能預測指定來源的規則、表與下一跳,寫出 LAN 與目的例外的順序及回程條件,並區分路由、來源偏好與 SNAT。VPN 伺服器的路由例外見 27,代理分流見 28。

問題:只加一條「來源 2 查表 200」的規則,來源 2 送往同 LAN 的封包為何可能交給 G2?

17.1 從單表到規則

沿用 07 的拓樸。07 的三個決策只查 main 表;政策路由在表內路由之前多一個決策:

決策例子不代表什麼
規則選表from 來源 2 lookup 200不先比較所有表的前綴長度

對未綁定來源的新連線,單靠 from 來源 2 規則,不能期望系統先猜「我要 G2」再選來源 2。需要穩定選出口時,可顯式 bind,或使用目的/mark 等先選表的政策;真實 socket 與系統可能有其他限制,須實際查驗。

17.2 RPDB 規則先選表,LPM 在表內

Linux Routing Policy Database 按 priority 由小至大檢查規則;規則可以依來源、目的、入口或 fwmark 等查表。預設常見順序為 0 查 local、32766 查 main、32767 查 default。下面在其間加入 priority 100;數字 200 是自訂表號,與 priority 不同。本機位址記在 local 表。

ip rule add priority 100 from 198.51.100.10/32 lookup 200
ip route add table 200 192.0.2.0/24 dev eth0 src 192.0.2.10
ip route add table 200 198.51.100.0/24 dev eth0 src 198.51.100.10
ip route add table 200 default via 198.51.100.1 dev eth0 src 198.51.100.10

這是隔離 H 的設定摘錄;完整步驟與清除見 L15,不在日常主機直接照貼。查表規則通常在該表找到可用路由後停止;沒有匹配路由或命中 throw 可繼續下一規則,unreachable 等拒絕路由則可產生終止錯誤。main 內更長的前綴不會跨表推翻已成功的 table 200 查找。

一張介面上的兩個來源與兩個下一跳
一張介面上的兩個來源與兩個下一跳

完整例題

目的/來源命中規則與表下一跳/理由
S/未指定mainG1,路由偏好來源 1
S/來源 1mainG1,來源 1 不匹配 priority 100
S/來源 2priority 100→200G2,表 200 的預設路由
198.51.100.55/來源 2priority 100→200on-link,200 內的 /24
本機 192.0.2.10/來源 2priority 0→local本機交付,不送 G2

若表 200 只放 default,來源 2 送同 LAN 的 .55 也會命中該 default、交給 G2;main 已有 /24 不能補救。G2 可能再轉回 LAN,也可能拒絕,不能保證一定斷線。可在 200 放直連路由,或讓較早的目的例外查 main,但要檢查 main 的 default 是否使例外涵蓋過廣。

同表相同前綴可再比較 metric 等;跨表依規則順序,不能把「metric 最低」當全系統唯一排序。ECMP、VRF、mark、IPv6 來源選擇另有機制,本例不模擬。

17.3 回程與反向路徑檢查

07 的回程只談可達;加入政策後來源 2 改經 G2,條件變成:G2 須能到 S,S 須能回來源 2,沿路防火牆/NAT 須允許同一連線的回覆(16)。非對稱路由本身不必然錯誤,但可能繞過有狀態防火牆或 NAT。TCP 服務回應常以收到連線的本機位址作來源;UDP 服務若綁萬用位址,回覆來源可能受 socket 與查表影響,需紀錄實際端點。

延伸:反向路徑檢查與 ARP 參數

Linux 的 rp_filter 嚴格模式檢查反向最佳路徑的介面,寬鬆模式檢查來源是否可達;有效值還與 all 及介面設定有關。同一 eth0 上的 G1/G2 通常不會因「閘道不同」而被嚴格模式單獨區分。新增第二張介面時,非對稱路徑才更容易與此檢查衝突。不要將所有回程問題都歸因於 rp_filter。

ARP 行為也受 arp_ignore、arp_announce、arp_filter 等設定影響;多介面同子網尤其要注意主機對其他介面位址的回應。先核對路由、鄰居與封包,再決定是否調整。改 ARP 或反向檢查不是完成隔離的替代品。

17.4 規則順序與例外

例外要排在會先成功的規則之前。例:管理伺服器 203.0.113.81 只能經 G1 到達,其餘來源 2 流量經 G2:

priority規則用意
0lookup local本機交付
50to 203.0.113.81/32 lookup main管理伺服器經 G1
100from 198.51.100.10/32 lookup 200來源 2 經 G2;同 LAN 目的靠表內直連 /24
32766lookup main其他流量

來源 2 連管理伺服器時以來源 2 經 G1 送出,回程條件同 07。VPN 伺服器例外與隧道遞迴見 27、28。

Linux 的 ip 命令多為執行中設定;重開機、NetworkManager、systemd-networkd 或其他管理程式可覆寫,持久化需配合實際管理工具。macOS/Windows 有不同路由與來源選擇介面,不能直接套用 Linux RPDB 命令。

實驗、習題與檢核

做 L15 階段二:執行 python3 labs/lan_models.py L15,填其餘七案並回答判讀題 1–5;endpoint_exception 一案即本章的管理伺服器例外。判讀題 2、3 的修改用參數 --fix-lan-route 與 --exception-priority 150 重跑,不必改程式。紀錄加上 priority、table 與 trace。延伸 C 在隔離 Linux 命名空間逐次看 route get、neigh 與 ping,仍為選做。本例未作 Linux 實測,預期輸出須與實測紀錄分開。

  1. 分析:H 另加 priority 90 的 to 203.0.113.0/24 lookup 300,表 300 只有 default via 198.51.100.1,main 另有 203.0.113.90/32 via 192.0.2.1。來源 1 送往 203.0.113.90 會交給誰?main 的 /32 為何救不回來?提出兩種修正。
  2. 基本:表 200 加入 throw 203.0.113.0/24 後,來源 2 送往 S 會交給誰?改成 unreachable 203.0.113.0/24 又如何?哪一種會繼續查 main?
  3. 分析:管理伺服器例外若誤放在 priority 150,未指定來源、來源 1、來源 2 送往 203.0.113.81 各交給哪個閘道?如何逐一測試,特別是來源 2?

檢核:能在同一筆紀錄分別寫來源、規則、表、匹配前綴、下一跳、介面及回程;能說明哪些只是模型。

來源(查閱 2026-10-06):ip-rule、ip-route、Linux IP sysctl。命令以 Linux/iproute2 語義編寫;本文拓樸與題目為獨立設計。