![Linux 上我可以有多少个自定义路由表?](https://linux22.com/image/562666/Linux%20%E4%B8%8A%E6%88%91%E5%8F%AF%E4%BB%A5%E6%9C%89%E5%A4%9A%E5%B0%91%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E8%B7%AF%E7%94%B1%E8%A1%A8%EF%BC%9F.png)
我一直在 Linux 上使用自定义路由表,对“ip route”命令的一些文档和行为感到有些困惑。似乎唯一有效的值应该是 0-255 加上 /etc/iproute2/rt_tables 中定义的名称:
255 local
254 main
253 default
0 unspec
这将为自定义表留下 1-252。尝试使用未定义的表名会导致错误:
$ ip route show table kermit
Error: argument "kermit" is wrong: table id value is invalid
不过,似乎我可以使用远高于 255 的数字而不会出现错误:
$ ip route show table 1000
[no output]
$ ip route add 10.10.10.0/24 dev eth0 table 1000
[no output]
$ ip route show table 1000
10.10.10.0/24 dev eth0 scope link
在某些时候,事情变得更加奇怪。就在 maxint (2^31) 时,它“溢出”到本地表 (255):
$ ip route show table 2147483647
[no output]
$ ip route show table 2147483648
[exact output of table 255 (local)]
有人能解释一下发生了什么吗?实际上是否有 maxint 自定义路由表可以使用?
答案1
就 2.6 内核而言,最大表是 0xFFFFFFFF(来自 rtnetlink.h)。但是,iproute2 在其过滤器中使用有符号整数进行查找,因此在 2^31 时,它会认为您指定了一个无效表,并默认显示表 255。