我是 Linux 新手,在学习 Linux 路由选择过程时,我遇到了一个问题。如果我们有两个具有不同源 IP 的相似路由规则,并且两个 IP 都分配给具有这些规则的主机,那么如何选择正确的规则?为了排除应用程序设置源 IP 的情况,假设我想使用 ping 实用程序 - 在这种情况下将如何选择规则?
答案1
源ip不参与路由选择。通过遍历路由表来选择路由:对于表中的每个条目,将网络目标前缀(即网络目标和网络掩码)与目标 IP 地址和网络掩码进行比较。如果它们相等,我们就匹配了。尝试路由表中的每个条目后,如果有多个匹配项,则选择具有最长前缀的条目。如果没有匹配,则没有到达目的地的路由。默认路由始终匹配,因为前缀长度为零。
如果目的地不是链路本地的,匹配的条目将告诉我们一个网关地址,并对网关地址重复该过程。最后,发送数据包时填写源地址和目的地址。使用原始目的地址,源地址取自最终匹配的路由规则(src
输出中的字段ip route
)。
答案2
ip rule
有一个priority
选择。优先级选项是选择路由表的第一种方式。值较低的规则priority
将在值较高的规则之前使用。打电话给您时ip rule show
,您会在左侧看到打印的规则及其优先级。
[priority]: [rule]
为了完整起见,引用以下内容man ip-rule
:
优先偏好
该规则的优先级。 PREFERENCE 是一个无符号整数值,数字越大表示优先级越低,规则按照数字递增的顺序进行处理。每个规则都应该有一个明确设置的唯一优先级值。 选项首选项和顺序是优先级的同义词。
强调我的。
因此,首先也是最重要的是,最好为每个规则使用唯一的优先级,这样就不会出现歧义。对于具有相同优先级的规则,将按照添加的顺序对其进行评估。如果规则是互斥的,则风险不大(例如两条规则在来自其他主机的不同源 IP 上匹配)。如果您的规则是自动添加的,这可能意味着将使用按字母顺序排列的第一个规则文件,这不是确定路由的好方法。
我如何得出使用第一个添加的规则的结论:
- 创建了在同一网络上具有两个接口(192.168.0.1/24 和 192.168.0.2/24)的 VM (vm1)。
- 在网络 (192.168.0.3/24) 上创建另一个虚拟机 (vm2)
- 创建了两个路由表,
table1
并table2
在 vm1 上
ip route add default dev eth0 table table1
ip route add default dev eth1 table table2
- 创建了两条具有不同优先级的规则
ip rule add to 192.168.0.3 table table1 priority 10
ip rule add to 192.168.0.3 table table2 priority 11
- 从 vm1 ping vm2
tcpdump -i eth0 host 192.168.0.3
显示 pingtcpdump -i eth1 host 192.168.0.3
才不是
这是预期的行为priority
- 重新添加优先级为10的table2规则,ping仍然只出现在 上
eth0
。在规则之前ip rule show
列出table1
规则table2
。 - 删除table1规则,eth1上可以ping通。
- 重新添加 table1 规则,ping 仍然在 eth1 上。之前
ip rule show
列出table2
规则table1
。