Welche Metrik hat unter Linux eine Route ohne Metrik?

11

Wenn Sie (unter Linux) diese beiden Routen haben:

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

Ich würde erwarten, dass der erste verwendet wird, aber das ist nicht der Fall: Der zweite wird stattdessen verwendet.

Wenn ich das dazu ändere:

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

Dann funktioniert es wie erwartet. Es scheint, dass "keine Metrik" eine schlechtere (höhere) Metrik als eine beliebige Zahl anstelle der Metrik 0 ist.

Was passiert das? Ist es spezifisch für Linux oder ein Netzwerkstandard?

Danke im Voraus.

rsuarez
quelle

Antworten:

6

Sind Sie sicher über Ihre erste Beobachtung? Was macht ip route showoder route -nzeigt dann? Ändert sich das Ergebnis, wenn Sie proto staticim ersten Fall hinzufügen ?

Ich habe mindestens zwei Ressourcen gefunden, die explizit besagen, dass dies 0der Standardwert unter Linux ist:

  • http://0pointer.de/lennart/projects/ifmetric/ : Die Standardmetrik für eine Route im Linux-Kernel ist 0, was die höchste Priorität bedeutet.
  • http://www.man7.org/linux/man-pages/man8/route.8.html : Wenn diese Option nicht angegeben ist, ist die Metrik für die Adressfamilie inet6 (IPv6) standardmäßig '1' für inet (IPv4). Der Standardwert ist '0'. (Es weist dann darauf hin, dass die Standardeinstellung bei der Verwendung möglicherweise anders ist iproute2, die Analyse dieser Quellen jedoch nicht zeigt, um was es sich handelt.)

Ein Linux-Kernel-Hacker wäre sicherlich erforderlich, um das zu klären.

Auch die gewählte Standardeinstellung ist eindeutig betriebssystemspezifisch. Dieser Artikel ( https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes ) zeigt beispielsweise, dass Windows die Standardmetrik auswählt basierend auf der Bandbreite der Verbindung.

Patrick Mevzek
quelle
Ich markiere Ihre Antwort als die richtige, weil ich dieses Verhalten auf meinem Computer nicht mehr gesehen habe. Ich beschuldige eine seltsame Sache, die auf Desktop-Computern mit Ubuntu passiert, zumindest mit der Version, die ich zum Zeitpunkt der Frage hatte. Ich habe es in einigen anderen Boxen mit Ubuntu LTS nicht gesehen. Also eine X-Datei (ist diese Referenz heutzutage zu alt?). Danke für deine Antwort!
Rsuarez
6

Da sich diese Routen in verschiedenen Subnetzen befinden, geht es hier um mehr als nur um die Metrik. Wenn sich der Ursprungsverkehr beispielsweise im Subnetz 192.168.1.1 befindet und Ihre Routing-Tabelle eine übereinstimmende, nicht standardmäßige Route enthält, stimmt diese Route über die längste Präfixübereinstimmung überein, bevor die Metrik jemals berücksichtigt wird.

Angenommen, eine nicht standardmäßige Route stimmt nicht überein, sollte der Kernel keine Metrik als Metrik mit 0 und daher als Route mit der höchsten Priorität interpretieren. Obwohl dies eine vereinfachte Ansicht ist, da einige Routing-Daemons diese Standardmetrik später in einen anderen Wert wie 1024 übersetzen. Ich gehe davon aus, dass dies mit Ihnen und Ihrer unbenannten Distribution geschieht.

Wenn überhaupt ip routekeine Metrik angezeigt wird, können Sie mit dem älteren route -nBefehl aus dem net-tools-Paket oder bestätigen, dass es tatsächlich 0 ist cat /proc/net/route. Diese Ausgabe stimmt jedoch nicht unbedingt mit dem überein, was der Routing-Daemon intern verwendet, wenn er auf einen 0-Metrikwert stößt.

Darüber hinaus ist es auch wichtig, wie Sie die Route erstellen. ip routeverwendet die Netlink-API, während routeioctl verwendet wird. Der Code für die Erstellung von Standardmetriken zwischen den beiden Ansätzen führt zu unterschiedlichen Metrikwerten. Beispiel: Das Erstellen einer IPv6-Standardroute über ip routeführt zu einem Metrikwert von 1024 in RHEL 7, während das Erstellen derselben Route über routeeine Metrik von 1 ergibt.

Von RedHat :

  • Wenn dem Routenbefehl nichts als Routenmetrik übergeben wird, wird der Wert 1 vom Befehl selbst verwendet.
  • Wenn nichts als Routenmetrik an den Befehl ip übergeben wird, wird das Attribut überhaupt nicht erstellt und der Kernel versteht es als 0, was später als Standard 1024 übersetzt wird.
noobisch
quelle