Quantas tabelas de rotas personalizadas posso ter no Linux?

12

Eu tenho trabalhado com tabelas de rotas personalizadas no Linux e estou um pouco confuso com parte da documentação e comportamento do comando "ip route". Parece que os únicos valores válidos devem ser de 0 a 255, mais os nomes definidos em / etc / iproute2 / rt_tables:

255 local
254 main
253 default
0   unspec

Isso deixaria 1-252 para tabelas personalizadas. Tentar usar um nome de tabela indefinido gera um erro:

$ ip route show table kermit
Error: argument "kermit" is wrong: table id value is invalid

No entanto, parece que posso usar números muito superiores a 255 sem erros:

$ 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

Em algum momento, as coisas ficam ainda mais estranhas. No maxint (2 ^ 31), ele "transborda" para a tabela local (255):

$ ip route show table 2147483647
[no output]
$ ip route show table 2147483648
[exact output of table 255 (local)]

Alguém pode explicar o que está acontecendo? Na verdade, existem maxint tabelas de roteamento personalizadas que podem ser usadas?

Prumo
fonte

Respostas:

8

No que diz respeito ao kernel 2.6, a tabela max é 0xFFFFFFFF (de rtnetlink.h). No entanto, o iproute2 usa um número inteiro assinado em seu filtro para fazer a pesquisa. Assim, em 2 ^ 31, ele acha que você especificou uma tabela inválida e o padrão é mostrar a tabela 255.

Ciclamino
fonte
Portanto, um nome inválido gera um erro, mas um número inteiro inválido gera 255? Além disso, suponho que 255 era o máximo anterior (talvez em 2.4?), Mas foi aumentado para um número de 32 bits no kernel 2.6?
Bob
Sim, o máximo em 2.4 e 2.2 era 255.
Ciclamino
Além disso, sempre mostrando a tabela 255 para valores com o 32º bit não parece haver nenhum tipo de comportamento planejado, apenas um bug. Com um patch de uma linha para iproute, fui capaz de criar e mostrar uma tabela com o número 4294967290. No entanto, pode não ser tão simples assim, existem outras peças que ainda não lidam com 2 ^ 32 tabelas.
Ciclamino
Aceito, obrigado. Talvez você deve enviar seu patch :)
Bob
1
Ferramentas mais recentes tendem a permitir valores de tabela de até 2 ^ 32-1 (por exemplo: $ 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(sem saída). O comportamento anterior pode ter sido mostrar a tabela "unspec" 0 (não 255), mas 0 incluirá 255 (e qualquer outra tabela).
AB