路由規則選擇
我是 Linux 新手,在學習 Linux 路由選擇過程時,我遇到了一個問題。如果我們有兩個具有不同源 IP 的相似路由規則,並且兩個 IP 都使用這些規則分配給主機,那麼如何選擇正確的規則?為了排除應用程序設置源 IP 的情況,假設我想使用 ping 實用程序 - 在這種情況下將如何選擇規則?
ip rule
有一個priority
選擇。優先級選項是選擇路由表的第一種方式。值較低的規則priority
將在較高的規則之前使用。呼叫ip rule show
您將看到在左側列印有優先級的規則。[priority]: [rule]
為了完整起見,引用來自
man ip-rule
:優先偏好
此規則的優先級。PREFERENCE 是一個無符號整數值,數字越大表示優先級越低,規則按數字遞增的順序處理。每個規則都應該有一個明確設置的唯一優先級值。 選項偏好和順序是優先級的同義詞。
強調我的。
所以首先,最好為每條規則使用一個唯一的優先級,這樣就不會有歧義。對於具有相同優先級的規則,它們將按照添加的順序進行評估。如果規則是互斥的,則風險不大(例如在來自其他主機的不同源 IP 上匹配的兩條規則)。如果您的規則是自動添加的,那可能意味著將使用按字母順序排列的規則文件,這不是確定路由的好方法。
我如何得出使用首先添加的規則的結論:
- 在同一網路(192.168.0.1/24 和 192.168.0.2/24)上創建了具有兩個介面的 VM (vm1)。
- 在網路 (192.168.0.3/24) 上創建了另一個 VM (vm2)
- 創建了兩個路由表,
table1
並table2
在 vm1
ip route add default dev eth0 table table1
ip route add default dev eth1 table table2
- 創建了兩個具有不同優先級的規則
ip rule add to 192.168.0.3 table table1 priority 10
ip rule add to 192.168.0.3 table table2 priority 11
- 從 vm1 ping vm2
tcpdump -i eth0 host 192.168.0.3
顯示 pingtcpdump -i eth1 host 192.168.0.3
才不是這是預期的行為
priority
- 重新添加優先級為 10 的 table2 規則,ping 仍然只出現在
eth0
. 在規則之前ip rule show
列出規則。table1``table2
- 刪除table1規則,eth1上出現ping。
- 重新添加 table1 規則,仍然在 eth1 上 ping。
ip rule show
列出table2
之前的規則table1
。
源IP不參與選擇路由。通過遍歷路由表來選擇路由:對於表中的每個條目,將網路目的地前綴(即網路目的地和網路遮罩)與目的地 IP 地址和網路遮罩進行比較。如果他們是平等的,我們有一個匹配。嘗試路由表中的每個條目後,如果有多個匹配項,則選擇前綴最長的條目。如果沒有匹配,則沒有到達目的地的路線。預設路由始終匹配,因為前綴長度為零。
如果目的地不是本地連結,匹配的條目將告訴我們一個網關地址,並為網關地址重複該過程。最後發送數據包並填寫源地址和目標地址。使用原始目標地址,源地址取自最終匹配的路由規則(
src
輸出中的欄位ip route
)。