我在 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。