Combien de tables de routage personnalisées puis-je avoir sur Linux?

12

J'ai travaillé avec des tables de routage personnalisées sous Linux, et je suis un peu confus par une partie de la documentation et du comportement de la commande "ip route". Il semble que les seules valeurs valides devraient être 0-255 plus les noms définis dans / etc / iproute2 / rt_tables:

255 local
254 main
253 default
0   unspec

Cela laisserait 1-252 pour les tables personnalisées. La tentative d'utilisation d'un nom de table non défini donne une erreur:

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

Cependant, il semble que je puisse utiliser des nombres bien supérieurs à 255 sans erreur:

$ 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

À un moment donné, les choses deviennent encore plus étranges. Directement à maxint (2 ^ 31), il "déborde" dans la table locale (255):

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

Quelqu'un peut-il expliquer ce qui se passe? Existe-t-il réellement des tables de routage personnalisées maxint qui peuvent être utilisées?

Bob
la source

Réponses:

8

En ce qui concerne le noyau 2.6, la table max est 0xFFFFFFFF (de rtnetlink.h). Cependant, iproute2 utilise un entier signé dans son filtre pour effectuer la recherche, donc à 2 ^ 31, il pense que vous avez spécifié une table non valide et affiche par défaut la table 255.

Ciclamino
la source
Donc, un nom invalide vous donne une erreur, mais un entier invalide vous donne 255? Aussi, je suppose que 255 était le max précédent (en 2.4 peut-être?) Mais a été augmenté à un nombre 32 bits dans le noyau 2.6?
Bob
Oui, le maximum en 2.4 et 2.2 était de 255.
Ciclamino
De plus, toujours afficher le tableau 255 pour les valeurs avec le 32e bit ne semble pas être une sorte de comportement planifié, juste un bogue. Avec un patch d'une ligne vers iproute, j'ai pu créer et afficher un tableau avec le numéro 4294967290. Cependant, ce n'est peut-être pas aussi simple que cela, il peut y avoir d'autres pièces qui ne traitent toujours pas des tableaux 2 ^ 32.
Ciclamino
Accepté, merci. Vous devriez peut-être soumettre votre patch :)
Bob
1
Les outils plus récents ont tendance à autoriser les valeurs de table jusqu'à 2 ^ 32-1 (par exemple: $ 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(pas de sortie). Le comportement précédent aurait pu être d'afficher la table "non spécifiée" 0 (pas 255), mais 0 inclura 255 (et tout autre table)
AB