我有以下路由规则(使用 显示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
,它可以帮助使事情变得更清晰:请注意,这
ip route show
并没有显示整个故事,基于策略的路由可能正在发挥作用。您还需要列出任何路由规则,这是正常输出:然后,您可以通过这种方式列出给定表中的路由条目,这里是“本地”表:
这称为基于策略的路由。通常您不会使用此功能(例如,如果您有多个 Internet 连接,您将使用此功能),但在解决您未自行配置的系统上的路由问题时了解这一点会有所帮助。