Routing

Linux 路由選擇未採用預期規則

  • June 19, 2019

我有以下路由規則(使用 顯示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 連接,您將使用此功能),但在解決您未自行配置的系統上的路由問題時了解這一點會有所幫助。

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