Sous Linux, quelle métrique a une route sans métrique?

11

Si vous avez (sous Linux) ces deux routes:

default via 192.168.1.1 dev enp58s0f1
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Je m'attendrais à ce que le premier soit utilisé, mais ce n'est pas le cas: le second est utilisé à la place.

Si je change cela en ceci:

default via 192.168.1.1 dev enp58s0f1  proto static  metric 100 
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Ensuite, cela fonctionne comme prévu. Il semble que "aucune métrique" soit une métrique pire (plus élevée) que n'importe quel nombre, au lieu de la métrique 0.

Qu'est-ce qui se passe? Est-ce spécifique à Linux ou à une norme de mise en réseau?

Merci d'avance.

rsuarez
la source

Réponses:

6

Êtes-vous sûr de votre première observation? Que montre ip route showou route -nmontre alors? Le résultat change-t-il si vous ajoutez proto staticdans le premier cas?

J'ai trouvé au moins deux ressources qui disent explicitement que 0c'est la valeur par défaut sous Linux:

  • http://0pointer.de/lennart/projects/ifmetric/ : La métrique par défaut pour une route dans le noyau Linux est 0, ce qui signifie la plus haute priorité.
  • http://www.man7.org/linux/man-pages/man8/route.8.html : si cette option n'est pas spécifiée, la métrique par défaut de la famille d'adresses inet6 (IPv6) est '1', pour inet (IPv4) il est par défaut "0". (il suggère ensuite que la valeur par défaut peut être différente lors de l'utilisation, iproute2mais l'analyse de ces sources ne montre pas ce que c'est)

Un pirate du noyau Linux serait sûrement nécessaire pour résoudre ce problème.

Quel que soit le choix par défaut, il est clairement spécifique au système d'exploitation. Cet article ( https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes ) montre par exemple que Windows choisit la métrique par défaut en fonction de la bande passante de la liaison.

Patrick Mevzek
la source
Je marque votre réponse comme étant la bonne parce que je n'ai pas revu ce comportement sur mon ordinateur. Je le blâme dans une chose étrange qui se produit dans les ordinateurs de bureau avec Ubuntu, au moins avec la version que j'avais au moment de la question. Je ne l'ai pas vu se produire dans quelques autres boîtes exécutant Ubuntu LTS. Donc, un X-File (cette référence est-elle trop ancienne de nos jours?). Merci pour votre réponse!
rsuarez
6

Étant donné que ces itinéraires se trouvent sur différents sous-réseaux, il y a plus à faire ici que la seule mesure. Si le trafic d'origine se trouve sur le sous-réseau 192.168.1.1, par exemple, et qu'il existe une route non par défaut correspondante dans votre table de routage, cette route correspondra via la correspondance de préfixe la plus longue avant que la métrique ne soit considérée.

En supposant qu'une route non par défaut ne correspond pas, alors l'absence de métrique doit être interprétée par le noyau comme ayant une métrique de 0, et donc la route de priorité la plus élevée. Bien que ce soit une vue simpliste, car certains démons de routage traduiront plus tard cette métrique par défaut en une autre valeur comme 1024. J'espère que c'est ce qui vous arrive, ainsi qu'à votre distribution sans nom.

Si ip routeaucune métrique n'est affichée, vous pouvez confirmer qu'il s'agit bien de 0 en utilisant l'ancienne route -ncommande du package net-tools ou cat /proc/net/route. Cependant, cette sortie ne correspond pas nécessairement à ce que le démon de routage utilisera en interne lorsqu'il rencontrera une valeur de métrique 0.

De plus, la façon dont vous créez l'itinéraire est également importante. ip routeutilise l'API netlink, tandis que routeutilise ioctl. Le code de création des métriques par défaut entre les deux approches entraîne des valeurs de métrique différentes. Par exemple: la création d'une route par défaut IPv6 ip routeentraînera une valeur de métrique de 1024 sur RHEL 7, tandis que la création de la même route via routeentraînera une métrique de 1.

De RedHat :

  • si rien n'est transmis à la commande route comme métrique de route, la valeur 1 est utilisée par la commande elle-même.
  • Si rien n'est transmis à la commande ip en tant que métrique de route, l'attribut n'est pas créé du tout et le noyau le comprend comme 0, qui est ensuite traduit 1024 par défaut.
noobish
la source