Routing
Linux 路由選擇未採用預期規則
我有以下路由規則(使用 顯示
route -n
):Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.2.1 0.0.0.0 UG 100 0 0 enp0s3 10.0.2.0 0.0.0.0 255.255.255.192 U 100 0 0 enp0s3.100 10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s3
該介面
enp0s3.100
是 VLAN id 為 100 的介面。如果我嘗試獲取 10.0.2.70 的路由,我希望它使用 VLAN 介面,但它沒有:
# ip route get 10.0.2.70 10.0.2.70 dev enp0s3 src 10.0.2.11 cache
有誰知道為什麼這裡沒有使用最長的前綴匹配?
首先,最好只使用
ip
命令,因此您應該使用ip route show
(或ip r
簡稱)列出路由表。在這種情況下,VPN 上的路由用於 10.0.2.0/255.255.255.192 或 10.0.2.0/26。此子網為 0 - 63。您的範例目標 10.0.2.70不在此範圍內,因此它不是通過 VPN 路由,而是使用下一個更具體的路由 10.0.2.0/24,它通過 enp0s3。
您提到“最長前綴匹配”,我通常聽到“最具體匹配”,即範圍最小的地方,這確實意味著最長的前綴。但是,如上所述,您正在測試的 IP 地址不在您認為的前綴範圍內。
在 Debian(和衍生產品)上有一個非常有用的實用程序
netmask
,它可以幫助使事情變得更清晰:$ netmask -r 10.0.2.0/255.255.255.192 10.0.2.0-10.0.2.63 (64)
請注意,這
ip route show
並沒有顯示整個故事,基於策略的路由可能正在發揮作用。您還需要列出任何路由規則,這是正常輸出:$ ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
然後,您可以通過這種方式列出給定表中的路由條目,這裡是“本地”表:
$ ip route show table local
這稱為基於策略的路由。通常您不會使用此功能(例如,如果您有多個 Internet 連接,您將使用此功能),但在解決您未自行配置的系統上的路由問題時了解這一點會有所幫助。