web-dev-qa-db-fra.com

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

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.

11
rsuarez

Êtes-vous sûr de votre première observation? Qu'est-ce que ip route show ou route -n montrer alors? Le résultat change-t-il si vous ajoutez proto static dans le premier cas?

J'ai trouvé au moins deux ressources qui disent explicitement que 0 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 priorité la plus élevée.
  • http://www.man7.org/linux/man-pages/man8/route.8.html : Si cette option n'est pas spécifiée, la métrique pour inet6 (IPv6), la famille d'adresses par défaut est "1", pour inet (IPv4), elle est par défaut "0" (elle indique ensuite que la valeur par défaut peut être différente lors de l'utilisation de iproute2 mais 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 ) par exemple montre que Windows choisit la métrique par défaut en fonction de la bande passante du lien.

6
Patrick Mevzek

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

En supposant qu'une route non par défaut ne correspond pas, alors n'avoir aucune métrique devrait être interprété par le noyau comme ayant une métrique de 0, et donc la priorité la plus élevée route. 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. Je m'attends à ce que ce soit ce qui vous arrive à vous et à votre distribution sans nom.

Si ip route ne montre aucune métrique du tout, vous pouvez confirmer qu'il s'agit bien de 0 en utilisant l'ancienne route -n commande 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 route utilise l'API netlink, tandis que route utilise 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: création d'une route IPv6 par défaut via ip route entraînera une valeur métrique de 1024 sur RHEL 7, tandis que la création du même itinéraire via route entraî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.
6
noobish