Linux

路由規則選擇

  • July 13, 2017

我是 Linux 新手,在學習 Linux 路由選擇過程時,我遇到了一個問題。如果我們有兩個具有不同源 IP 的相似路由規則,並且兩個 IP 都使用這些規則分配給主機,那麼如何選擇正確的規則?為了排除應用程序設置源 IP 的情況,假設我想使用 ping 實用程序 - 在這種情況下將如何選擇規則?

ip rule有一個priority選擇。優先級選項是選擇路由表的第一種方式。值較低的規則priority將在較高的規則之前使用。呼叫ip rule show您將看到在左側列印有優先級的規則。

[priority]:    [rule]

為了完整起見,引用來自man ip-rule

優先偏好

此規則的優先級。PREFERENCE 是一個無符號整數值,數字越大表示優先級越低,規則按數字遞增的順序處理。每個規則都應該有一個明確設置的唯一優先級值。 選項偏好和順序是優先級的同義詞。

強調我的。

所以首先,最好為每條規則使用一個唯一的優先級,這樣就不會有歧義。對於具有相同優先級的規則,它們將按照添加的順序進行評估。如果規則是互斥的,則風險不大(例如在來自其他主機的不同源 IP 上匹配的兩條規則)。如果您的規則是自動添加的,那可能意味著將使用按字母順序排列的規則文件,這不是確定路由的好方法。

我如何得出使用首先添加的規則的結論:

  1. 在同一網路(192.168.0.1/24 和 192.168.0.2/24)上創建了具有兩個介面的 VM (vm1)。
  2. 在網路 (192.168.0.3/24) 上創建了另一個 VM (vm2)
  3. 創建了兩個路由表,table1table2在 vm1

ip route add default dev eth0 table table1

ip route add default dev eth1 table table2

  1. 創建了兩個具有不同優先級的規則

ip rule add to 192.168.0.3 table table1 priority 10

ip rule add to 192.168.0.3 table table2 priority 11

  1. 從 vm1 ping vm2
  2. tcpdump -i eth0 host 192.168.0.3顯示 ping
  3. tcpdump -i eth1 host 192.168.0.3才不是

這是預期的行為priority

  1. 重新添加優先級為 10 的 table2 規則,ping 仍然只出現在eth0. 在規則之前ip rule show列出規則。table1``table2
  2. 刪除table1規則,eth1上出現ping。
  3. 重新添加 table1 規則,仍然在 eth1 上 ping。ip rule show列出table2之前的規則table1

源IP不參與選擇路由。通過遍歷路由表來選擇路由:對於表中的每個條目,將網路目的地前綴(即網路目的地和網路遮罩)與目的地 IP 地址和網路遮罩進行比較。如果他們是平等的,我們有一個匹配。嘗試路由表中的每個條目後,如果有多個匹配項,則選擇前綴最長的條目。如果沒有匹配,則沒有到達目的地的路線。預設路由始終匹配,因為前綴長度為零。

如果目的地不是本地連結,匹配的條目將告訴我們一個網關地址,並為網關地址重複該過程。最後發送數據包並填寫源地址和目標地址。使用原始目標地址,源地址取自最終匹配的路由規則(src輸出中的欄位ip route)。

引用自:https://unix.stackexchange.com/questions/377333