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固有ですか、それともネットワーキング標準ですか?
前もって感謝します。
初めての観察でよろしいですか?次に、ip route show
またはroute -n
は何を示しますか?最初にproto static
を追加すると、結果は変わりますか?
Linuxでは、0
がデフォルト値であると明示的に述べているリソースが少なくとも2つ見つかりました。
iproute2
を使用するとデフォルトが異なる可能性がありますが、これらのソースの分析ではデフォルトが何であるかがわかりません)Linuxカーネルのハッカーは、それを整理するために確かに必要になるでしょう。
また、選択されたデフォルトは明らかにOS固有です。この記事( https://support.Microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes )の例は、Windowsがリンクの帯域幅に基づいてデフォルトのメトリックを選択することを示しています。
これらのルートは異なるサブネット上にあるため、ここでは単なるメトリックよりも複雑な部分があります。たとえば、発信トラフィックが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に変換されます。