¿Cuántas tablas de rutas personalizadas puedo tener en Linux?

12

He estado trabajando con tablas de rutas personalizadas en Linux, y estoy un poco confundido por parte de la documentación y el comportamiento del comando "ip route". Parece que los únicos valores válidos deberían ser 0-255 más los nombres definidos en / etc / iproute2 / rt_tables:

255 local
254 main
253 default
0   unspec

Esto dejaría 1-252 para tablas personalizadas. Intentar usar un nombre de tabla indefinido da un error:

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

Sin embargo, parece que puedo usar números muy superiores a 255 sin error:

$ 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

En algún momento, las cosas se ponen aún más extrañas. Justo en maxint (2 ^ 31), se "desborda" en la tabla local (255):

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

¿Alguien puede explicar lo que está pasando? ¿Existen realmente tablas de enrutamiento personalizadas de maxint que se puedan usar?

Beto
fuente

Respuestas:

8

En lo que respecta al kernel 2.6, la tabla máxima es 0xFFFFFFFF (de rtnetlink.h). Sin embargo, iproute2 usa un entero con signo en su filtro para realizar la búsqueda, por lo que en 2 ^ 31 cree que especificó una tabla no válida y por defecto muestra la tabla 255.

Ciclamino
fuente
Entonces, ¿un nombre no válido te da un error, pero un número entero no válido te da 255? Además, supongo que 255 era el máximo anterior (¿en 2.4 quizás?) Pero se aumentó a un número de 32 bits en el kernel 2.6?
Bob
Sí, el máximo en 2.4 y 2.2 fue 255.
Ciclamino
Además, mostrar siempre la tabla 255 para valores con el bit 32 no parece ser ningún tipo de comportamiento planificado, solo un error. Con un parche de una línea para iproute pude crear y mostrar una tabla con el número 4294967290. Sin embargo, puede que no sea tan simple como eso, puede haber otras piezas que aún no se ocupan de 2 ^ 32 tablas.
Ciclamino
Aceptado, gracias. Tal vez deberías enviar tu parche :)
Bob
1
Las herramientas más recientes tienden a permitir valores de tabla de hasta 2 ^ 32-1 (por ejemplo: $ 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(sin salida). El comportamiento anterior podría haber sido mostrar la tabla "no especificada" 0 (no 255), pero 0 incluirá 255 (y cualquier otra mesa).
AB