web-dev-qa-db-ja.com

Linuxでは、どのメトリックにメトリックのないルートがありますか?

Linuxの場合、次の2つのルートがあります。

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

最初のものが使用されることを期待しますが、そうではありません。代わりに2番目のものが使用されます。

これをこれに変更すると:

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

その後、期待どおりに動作します。 「メトリックなし」は、メトリック0ではなく、どの数値よりも悪い(高い)メトリックのようです。

これは何が起こっているのですか? Linux固有ですか、それともネットワーキング標準ですか?

前もって感謝します。

11
rsuarez

初めての観察でよろしいですか?次に、ip route showまたはroute -nは何を示しますか?最初にproto staticを追加すると、結果は変わりますか?

Linuxでは、0がデフォルト値であると明示的に述べているリソースが少なくとも2つ見つかりました。

  • http://0pointer.de/lennart/projects/ifmetric/Linuxカーネルのルートのデフォルトメトリックは0で、最高の優先順位を意味します。
  • http://www.man7.org/linux/man-pages/man8/route.8.htmlこのオプションが指定されていない場合、inet6(IPv6)アドレスファミリのメトリックデフォルトは '1'で、inet(IPv4)の場合はデフォルトで '0'です。(この場合、iproute2を使用するとデフォルトが異なる可能性がありますが、これらのソースの分析ではデフォルトが何であるかがわかりません)

Linuxカーネルのハッカーは、それを整理するために確かに必要になるでしょう。

また、選択されたデフォルトは明らかにOS固有です。この記事( https://support.Microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes )の例は、Windowsがリンクの帯域幅に基づいてデフォルトのメトリックを選択することを示しています。

6
Patrick Mevzek

これらのルートは異なるサブネット上にあるため、ここでは単なるメトリックよりも複雑な部分があります。たとえば、発信トラフィックが192.168.1.1サブネット上にある場合、および一致するデフォルト以外のルートがルーティングテーブルにある場合、そのルートはメトリックが考慮される前に 最長プレフィックス一致 を介して一致します。

デフォルト以外のルートが一致しないと仮定すると、メトリックがない必要がありますカーネルによってメトリックが0であると解釈されるため、最高の優先度ルート。一部のルーティングデーモンは後でそのデフォルトメトリックを1024のような別の値に変換するため、これは単純化したビューですが、これはあなたとあなたの名前のないディストリビューションに起こっていることだと思います。

ip routeにメトリックがまったく表示されない場合は、net-toolsパッケージの古いroute -nコマンドまたはcat /proc/net/routeを使用して、実際に0であることを確認できます。ただし、この出力は、メトリック値が0の場合、ルーティングデーモンが内部で使用するものと必ずしも一致しません。

さらに、ルートの作成方法も重要です。 ip routeはnetlink APIを使用し、routeはioctlを使用します。 2つのアプローチ間でデフォルトメトリックが作成される方法のコードは、異なるメトリック値になります。たとえば、ip routeを介してIPv6デフォルトルートを作成すると、RHEL 7でメトリック値が1024になりますが、routeを介して同じルートを作成すると、メトリックが1になります。

RedHat から:

  • ルートメトリックとして何もrouteコマンドに渡されない場合、1の値がコマンド自体によって使用されます。
  • ルートメトリックとして何もipコマンドに渡されない場合、属性はまったく作成されず、カーネルはそれを0として認識します。これは後でデフォルトとして1024に変換されます。
6
noobish