Sind Sie sich bei Ihrer ersten Beobachtung sicher? Was bedeutet ip route show
oder route -n
dann zeigen? Ändert sich das Ergebnis, wenn Sie proto static
hinzufügen im ersten Fall?
Ich habe mindestens zwei Ressourcen gefunden, die ausdrücklich sagen, dass 0
ist der Standardwert unter Linux:
- 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 inet6 (IPv6)-Adressfamilie standardmäßig '1' , für inet (IPv4) ist es standardmäßig '0'. (es weist dann darauf hin, dass die Standardeinstellung bei Verwendung von
iproute2
anders sein kann aber die Analyse dieser Quellen zeigt nicht, was es ist)
Ein Linux-Kernel-Hacker wäre sicherlich nötig, um das zu klären.
Welche Standardeinstellung auch immer gewählt wird, 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 basierend auf der Bandbreite der Verbindung auswählt.
Da sich diese Routen in unterschiedlichen Subnetzen befinden, geht es hier um mehr als nur die Metrik. Wenn der Ursprungsdatenverkehr beispielsweise im Subnetz 192.168.1.1 liegt, und Es gibt eine übereinstimmende nicht standardmäßige Route in Ihrer Routing-Tabelle, dann wird diese Route über die Übereinstimmung mit dem längsten Präfix übereinstimmen, bevor die Metrik jemals berücksichtigt wird.
Angenommen, eine nicht standardmäßige Route stimmt nicht überein, dann sollte keine Metrik vorhanden sein vom Kernel so interpretiert, dass sie eine Metrik von 0 hat und daher die Route mit der höchsten Priorität hat. 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 passiert.
Wenn ip route
überhaupt keine Metrik anzeigt, können Sie bestätigen, dass es tatsächlich 0 ist, indem Sie den älteren route -n
verwenden Befehl aus dem net-tools Paket oder cat /proc/net/route
. Diese Ausgabe stimmt jedoch nicht unbedingt mit dem überein, was der Routing-Daemon intern verwendet, wenn er auf einen metrischen Wert von 0 stößt.
Außerdem ist es wichtig, wie Sie die Route erstellen. ip route
verwendet die Netlink-API, während route
verwendet ioctl. Der Code für die Erstellung von Standardmetriken zwischen den beiden Ansätzen führt zu unterschiedlichen Metrikwerten. Beispiel:Erstellen einer IPv6-Standardroute über ip route
führt zu einem Metrikwert von 1024 auf RHEL 7, während dieselbe Route über route
erstellt wird ergibt eine Metrik von 1.
Von RedHat:
- wenn dem route-Befehl nichts als Routenmetrik übergeben wird, wird der Wert 1 vom Befehl selbst verwendet.
- Wenn dem ip-Befehl nichts als Routenmetrik übergeben wird, wird das Attribut überhaupt nicht erstellt und der Kernel versteht es als 0, was später als Standard mit 1024 übersetzt wird.