在Linux上可以有多少个自定义路由表?


12

我一直在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自定义路由表吗?

Answers:


8

就2.6内核而言,最大表为0xFFFFFFFF(来自rtnetlink.h)。但是,iproute2在其过滤器中使用带符号的整数进行查找,因此在2 ^ 31处它认为您指定了无效的表,并且默认为向您显示表255。


那么,无效的名称会给您一个错误,而无效的整数会给您255吗?另外,我假设255是以前的最大值(可能在2.4中?),但在内核2.6中增加到32位数字?
鲍勃

是的,2.4和2.2中的最大值为
255。– Ciclamino

另外,始终显示表255的第32位值似乎不是任何计划的行为,而只是一个错误。使用iproute的一个单行修补程序,我可以创建并显示编号为4294967290的表。但是,它可能不那么简单,可能还有其他部分仍无法处理2 ^ 32个表。
Ciclamino

接受,谢谢。也许您应该提交您的补丁:)
Bob Bob

1
较新的工具倾向于允许表值最大为2 ^ 32-1(例如:($ ip -V ip utility, iproute2-ss180813 $ ip route list table 4294967296 Error: argument "4294967296" is wrong: table id value is invalid $ ip route list table 4294967295无输出)。以前的行为可能是将“ unspec”表显示为0(而不是255),但0将包括255(以及任何其他值)其他表格)
AB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.