我有以下两条路线:
# 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 等。目标 IP 地址/网络已被常规路由条目选择,因此很少在路由规则中用作选择器。