單元 03A 單介面多 IP、來源選擇與政策路由
學習目標與先備關係
先讀 03 的 CIDR 與下一跳;MAC 與 ARP 可配合 04 閱讀。本單元先用兩個閘道說明位址不等於出口,再學 Linux 政策路由。尚不熟悉規則者,可先完成 3A.1 至 3A.3,讀 10 後回到 3A.4。完成後應能預測指定來源的下一跳、寫出 LAN 例外與回程條件,並區分路由、來源偏好、SNAT 及代理分流。
問題:一張網卡同時持有兩個 IP,應用指定第二個 IP 後,是否一定走第二個閘道?
3A.1 一個介面不只一個位址
介面是收送封包的邊界;IP 位址是三層識別。Linux 可對同一介面加入多個位址,無須建立另一張網卡;舊式「IP alias」名稱或 label 不會自動產生獨立鏈路。兩個位址可屬同一子網或不同子網,但新增位址本身不會建立 VLAN 隔離。
以下文件用位址只在隔離實驗中使用。H 的 eth0、G1、G2 都接同一個交換器/VLAN,G1 與 G2 各有自己的遠端網路。
| 節點 | 位址 | 角色 |
|---|---|---|
| H eth0 | 192.0.2.10/24、198.51.100.10/24 | 一個介面、兩個來源候選 |
| G1 | 192.0.2.1/24 | 預設出口 1 |
| G2 | 198.51.100.1/24 | 希望來源 2 使用的出口 |
| S | 203.0.113.80 | 範例遠端目的;兩條路徑均可達的假設 |

兩個不同 IP 子網共用同一個廣播域是可行拓樸;它們仍共用二層廣播,不能達成訪客隔離。若 eth0.10 與 eth0.20 是 802.1Q 子介面,則另有 VLAN 標記與交換器設定,不能與「同 eth0 加兩個位址」混為一談。
新增一般前綴位址時,Linux 通常會建立相應直連前綴路由,並在 local 表記錄本機位址;noprefixroute 等選項及網路管理程式會影響結果。要看實際表,不靠位址清單猜測。
3A.2 四個決策分開回答
| 決策 | 例子 | 不代表什麼 |
|---|---|---|
| 應用來源 | bind 198.51.100.10 | 不自動指定 G2 |
| 規則選表 | from 來源 2 lookup 200 | 不先比較所有表的前綴長度 |
| 表內路由 | default via G2 dev eth0 | 不會改寫來源位址 |
| 鏈路交付 | ARP 取得 G2 的 MAC | 不保證 G2 有回程或服務可用 |
Linux 路由的 src 欄位是偏好來源,適用於尚未固定來源的本機發送;它不是 SNAT,不能把已綁定來源或轉送封包一律改成該位址。SNAT 需另讀 12,並記錄改寫前後四元組。
若只有 main 表預設經 G1,應用即使 bind 來源 2,也可能以來源 2、下一跳 G1 送出;G1 及遠端必須知道如何回到來源 2。來源位址與下一跳不是依序排列的一對一配對。
未綁定來源的新連線,初始查表時可能尚未有具體來源可匹配。單靠 from 來源 2 規則,不能期望系統先猜「我要 G2」再選來源 2。本例普通未指定來源的查表走 main/G1,再取該路由偏好的來源 1。需要穩定選出口時,可顯式 bind,或使用目的/mark 等先選表的政策;真實 socket 與系統可能有其他限制,須實際查驗。
3A.3 main 表的最長前綴匹配
H 的 main 表如下,所有路由皆走 eth0。
| 前綴 | 下一跳 | 偏好來源 |
|---|---|---|
| 192.0.2.0/24 | on-link | 192.0.2.10 |
| 198.51.100.0/24 | on-link | 198.51.100.10 |
| 0.0.0.0/0 | 192.0.2.1 | 192.0.2.10 |
目的 198.51.100.55 匹配 /24,直接 ARP .55;目的 S 匹配 /0,ARP G1。指定來源 2 並不改變此表的目的查找。若下一跳不在可達鏈路上,不能任意加 onlink 來掩蓋拓樸錯誤;須確認實際鄰居解析可行。
3A.4 RPDB 規則先選表,LPM 在表內
Linux Routing Policy Database 按 priority 由小至大檢查規則;規則可以依來源、目的、入口或 fwmark 等查表。預設常見順序為 0 查 local、32766 查 main、32767 查 default。下面在其間加入 priority 100;數字 200 是自訂表號,與 priority 不同。
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/未指定 | main | G1,路由偏好來源 1 |
| S/來源 1 | main | G1,來源 1 不匹配 priority 100 |
| S/來源 2 | priority 100→200 | G2,表 200 的預設路由 |
| 198.51.100.55/來源 2 | priority 100→200 | on-link,200 內的 /24 |
| 本機 192.0.2.10/來源 2 | priority 0→local | 本機交付,不送 G2 |
若表 200 只放 default,來源 2 送同 LAN 的 .55 也會命中該 default、交給 G2;main 已有 /24 不能補救。G2 可能再轉回 LAN,也可能拒絕,不能保證一定斷線。可在 200 放直連路由,或讓較早的目的例外查 main,但要檢查 main 的 default 是否使例外涵蓋過廣。
同表相同前綴可再比較 metric 等;跨表依規則順序,不能把「metric 最低」當全系統唯一排序。ECMP、VRF、mark、IPv6 來源選擇另有機制,本例不模擬。
3A.5 回程、ARP 與反向路徑檢查
正向正確只是一半。G2 須能到 S,S 須能回來源 2,沿路防火牆/NAT 須允許同一連線的回覆。非對稱路由本身不必然錯誤,但可能繞過有狀態防火牆或 NAT。TCP 服務回應常以收到連線的本機位址作來源;UDP 服務若綁萬用位址,回覆來源可能受 socket 與查表影響,需紀錄實際端點。
Linux 的 rp_filter 嚴格模式檢查反向最佳路徑的介面,寬鬆模式檢查來源是否可達;有效值還與 all 及介面設定有關。同一 eth0 上的 G1/G2 通常不會因「閘道不同」而被嚴格模式單獨區分。新增第二張介面時,非對稱路徑才更容易與此檢查衝突。不要將所有回程問題都歸因於 rp_filter。
ARP 行為也受 arp_ignore、arp_announce、arp_filter 等設定影響;多介面同子網尤其要注意主機對其他介面位址的回應。先核對路由、鄰居與封包,再決定是否調整。改 ARP 或反向檢查不是完成隔離的替代品。
3A.6 與代理/VPN 分流整合
OS 政策路由看到的是該查表階段的 IP 與標記等資訊;域名分流需代理請求、DNS 關聯或其他資料。軟路由還要區分「LAN 客戶端轉送流量」與「代理程式新建的上游 socket」:前者的來源可能是客戶端 IP,後者是代理主機 IP。只寫 from 客戶端規則,不保證代理上游仍走同一路徑。
完整順序例:保留 local 交付;目的 LAN 直連;VPN/代理 endpoint 走 underlay;剩餘流量依來源或 mark 入隧道。若 endpoint 例外把某 IP 留在 underlay,對同 IP 其他服務也可能受影響,應說明取捨。IPv6、DNS 及 UDP 另做覆蓋表;只加兩個 IPv4 位址不能驗證全流量政策。
Linux 的 ip 命令多為執行中設定;重開機、NetworkManager、systemd-networkd 或其他管理程式可覆寫,持久化需配合實際管理工具。macOS/Windows 有不同路由與來源選擇介面,不能直接套用 Linux RPDB 命令。
實驗、習題與檢核
做 L15。必修離線路線不改主機設定;延伸在 Linux 命名空間逐次看 route get、neigh 與 ping。本例未作 Linux 實測,預期輸出須與實測紀錄分開。
- 兩個 IP 同 eth0、同 VLAN,為何不等於兩個隔離 LAN?
- 僅有 main 表時,bind 來源 2 到 S 會用哪個閘道?還需哪項回程條件?
- 200 只有 default 時,main 內 /24 為何不救回 LAN 目的?提出兩種修正。
- 表 200 的 src 來源 2 能否把來源 1 改寫成來源 2?
- 若希望 203.0.113.81 作 VPN endpoint 始終走 G1,在哪個 priority 放目的例外?如何測試來源 2?
- 延伸:代理上游 socket 的來源與客戶端來源不同,如何用擷取證明兩次查表的差異?
檢核:能在同一筆紀錄分別寫來源、規則、表、匹配前綴、下一跳、介面及回程;能說明哪些只是模型。解答見 answers/lan-solutions.md。
來源(查閱 2026-10-06):ip-address、ip-rule、ip-route、Linux IP sysctl。命令以 Linux/iproute2 語義編寫;本文拓樸與題目為獨立設計。