
我有以下 2 條路線:
# ip ro show table 0|grep 10.250
10.250.0.0/16 via 10.80.1.1 dev ens5 table 220 proto static src 10.80.1.76
10.250.1.4 via 10.80.1.45 dev ens5
第一個來自strongSwan管理的表220,另一個是我手動建立的用於測試。
我希望顯式/32
路線總是獲勝,但是
# ip ro get 10.250.1.4
10.250.1.4 via 10.80.1.1 dev ens5 table 220 src 10.80.1.76 uid 0
cache
Linux 仍然比較喜歡/16
.
為什麼會這樣呢?
答案1
這是因為 StrongSwan 使用策略路由。解釋這一點的缺失部分是輸出ip rule
由strongSwan 設定的附加條目通常是:
# ip rule
0: from all lookup local
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
路由規則按優先順序(上面顯示的順序)遍歷以引用各種路由桌子,直到找到路由(或沒有找到路由(如果任何地方都沒有預設路由,或者存在“負”路由,則可能是這種情況)並Network is unreachable
返回諸如此類的錯誤)。路由規則首選項220在標準路由規則首選項32766之前運行,因此首先檢查路由表220。由於在路由表 220 10.250.0.0/16 中確實與 10.250.1.4 匹配,因此找到了一條路由:路由評估在此停止,可以在後面的表中選擇任何內容。這主要的從未到達此目的地的路由表。
當結果ip route get ...
顯示其他路由表時當地的,主要的(或表預設如果它不像通常情況那樣留空),這意味著必須有一個引用該表的路由規則,並且使用ip rule
.
對於許多其他基於策略的路由在這種情況下,將會有一個額外的選擇器而不是「通配符」from all
。通常使用來源 IP 位址/網路或傳入介面:再次變更正常路由結果。甚至還有其他可能性,例如連接埠、uid 等。