Сколько пользовательских таблиц маршрутов я могу иметь в 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 настраиваемые таблицы маршрутизации, которые можно использовать?

боб
источник

Ответы:

8

Что касается ядра 2.6, максимальная таблица равна 0xFFFFFFFF (из rtnetlink.h). Однако iproute2 использует целое число со знаком в своем фильтре для поиска, поэтому на этапе 2 ^ 31 он считает, что вы указали неверную таблицу, и по умолчанию показывает таблицу 255.

Ciclamino
источник
Итак, неверное имя выдает ошибку, а неверное целое число дает 255? Кроме того, я предполагаю, что 255 был предыдущий максимум (в 2.4 может быть?), Но был увеличен до 32-разрядного числа в ядре 2.6?
Боб
Да, максимум в 2,4 и 2,2 был 255.
Ciclamino
Кроме того, всегда показ таблицы 255 для значений с 32-м битом не является каким-либо запланированным поведением, это просто ошибка. С помощью однострочного патча для iproute я смог создать и показать таблицу с номером 4294967290. Однако, это может быть не так просто, могут быть другие части, которые до сих пор не имеют дело с 2 ^ 32 таблицами.
Цикламино
Принято, спасибо. Может быть, вы должны отправить свой патч :)
Боб
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 (и любые другой столик)
АВ