路由规则选择

路由规则选择

我是 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 上匹配)。如果您的规则是自动添加的,这可能意味着将使用按字母顺序排列的第一个规则文件,这不是确定路由的好方法。

我如何得出使用第一个添加的规则的结论:

  1. 创建了在同一网络上具有两个接口(192.168.0.1/24 和 192.168.0.2/24)的 VM (vm1)。
  2. 在网络 (192.168.0.3/24) 上创建另一个虚拟机 (vm2)
  3. 创建了两个路由表,table1table2在 vm1 上

ip route add default dev eth0 table table1

ip route add default dev eth1 table table2

  1. 创建了两条具有不同优先级的规则

ip rule add to 192.168.0.3 table table1 priority 10

ip rule add to 192.168.0.3 table table2 priority 11

  1. 从 vm1 ping vm2
  2. tcpdump -i eth0 host 192.168.0.3显示 ping
  3. tcpdump -i eth1 host 192.168.0.3才不是

这是预期的行为priority

  1. 重新添加优先级为10的table2规则,ping仍然只出现在 上eth0。在规则之前ip rule show列出table1规则table2
  2. 删除table1规则,eth1上可以ping通。
  3. 重新添加 table1 规则,ping 仍然在 eth1 上。之前ip rule show列出table2规则table1

相关内容