为什么添加优先级为 0 的 IP 规则

为什么添加优先级为 0 的 IP 规则

我在 ubuntu 服务器上遇到了奇怪的行为,任何新添加的“ip 规则”的优先级都是零。我添加了没有优先级的规则,它曾经被添加到可用优先级中。预期重复规则或已填充(但事实并非如此),但对旧规则进行了一些清理以释放它,但从未使用新的可用优先级。

Server >> VERSION="18.04.6 LTS (Bionic Beaver)"
Kernel >> 4.15.0-172-generic

Example
0:  from all lookup local
0:  from all iif bb2671448 lookup 7173
0:  from all oif bb2671448 lookup 7173
0:  from all iif ebb90d64d lookup 7415
0:  from all oif ebb90d64d lookup 7415
1000:   from all lookup [l3mdev-table]
32765:  from all fwmark 0x4d2 lookup 123
32766:  from all lookup main
32767:  from all lookup default

谢谢

答案1

这可以通过首先添加任何优先级为 0 的规则来重现,因此至少存在两个规则:原始规则0: from all lookup local和新规则。

只需删除首选项 0 处的所有规则,直到只剩下一个。最好是原始规则0: from all lookup local(否则会出现连接问题),但这甚至不是强制性的。

甚至不是首选项 0 的特殊之处(即使这是默认设置的意图),而是下一个最低首选项值也是 0,并且当此值已经为 0 时,无法使用更低的值创建任何东西(参见最后一条评论)。通常,选择的值是下一个最低值减 1(默认设置是 32766(0 之后的下一个)-1 = 32765)。


用户+网络命名空间中的复制器:

$ unshare -Urnm
# ip rule
0:  from all lookup local
32766:  from all lookup main
32767:  from all lookup default
# ip rule add pref 0 from 192.0.2.2 lookup main
# ip rule
0:  from all lookup local
0:  from 192.0.2.2 lookup default
32766:  from all lookup main
32767:  from all lookup default
# ip rule add from 192.0.2.0/24 lookup default # affected
# ip rule
0:  from all lookup local
0:  from 192.0.2.2 lookup main
0:  from 192.0.2.0/24 lookup default
32766:  from all lookup main
32767:  from all lookup default
# 

仅保留一个在 pref 0 处(即使是本演示中所做的“错误”的一个):

# ip rule del lookup local # usually a bad idea
# ip rule del from 192.0.2.2 lookup main
# ip rule
0:  from 192.0.2.0/24 lookup default
32766:  from all lookup main
32767:  from all lookup default
# ip rule add lookup local
# ip rule
0:  from 192.0.2.0/24 lookup default
32765:  from all lookup local # used next available slot
32766:  from all lookup main
32767:  from all lookup default

因此:不要添加优先级为 0 的规则以避免此问题。


如果目的是要制定一些规则 lookup local对于特殊的策略路由目的,则将此规则移至更高位置,并在其前面插入其他规则。在此之后,应添加所有新规则并明确偏好,否则迟早会出现不必要的排序(见下面的示例)。

$ unshare -Urnm
# ip rule add pref 500 lookup local
# ip rule del pref 0
# ip rule add pref 32000 from 192.0.2.2 lookup 5000
# ip rule add from 198.51.100.3 lookup 6000
# ip rule add pref 400 from 203.0.113.4 lookup 7000
# ip rule add from 203.0.113.5 lookup 8000 
# ip rule
400:    from 203.0.113.4 lookup 7000
499:    from 203.0.113.5 lookup 8000
500:    from all lookup local
31999:  from 198.51.100.3 lookup 6000
32000:  from 192.0.2.2 lookup 5000
32765:  from all lookup local
32766:  from all lookup main
32767:  from all lookup default

当 400 成为最低优先值时,添加新规则而不说明优先权不会选择 31998 而是 499(下一个最低值变为 500):正如警告的那样,在处理时最好始终说明新添加规则的优先权local lookup。初始问题类似,但增加了一个事实,即不可能在下一个最低值(0)以下添加 0,因此再次选择 0。

相关内容