Linux ルーティングは予想される規則に従わない。

Linux ルーティングは予想される規則に従わない。

次のルーティングルールがあります(displayを使用route -n)。

Kernel IP routing table
Destination  Gateway    Genmask         Flags Metric Ref Use Iface
0.0.0.0      10.0.2.1   0.0.0.0         UG    100    0     0 enp0s3
10.0.2.0     0.0.0.0    255.255.255.192 U     100    0     0 enp0s3.100
10.0.2.0     0.0.0.0    255.255.255.0   U     100    0     0 enp0s3
169.254.0.0  0.0.0.0    255.255.0.0     U     1000   0     0 enp0s3

このインターフェイスは、enp0s3.100VLAN IDが100のインターフェイスです。

10.0.2.70 へのパスを取得しようとすると、VLAN インターフェイスを使用すると予想されますが、次の機能は使用しません。

# ip route get 10.0.2.70
10.0.2.70 dev enp0s3  src 10.0.2.11 
    cache

ここで最長の接頭辞マッチングが使用されない理由を知っている人はいますか?

答え1

まず、単にコマンドを使用するのが最善であるため、ルーティングテーブルを一覧表示するには、コマンドを使用するか、単にipコマンドを使用する必要があります。ip route showip r

この場合、VPN のパスは 10.0.2.0/255.255.255.192 または 10.0.2.0/26 です。サブネットは0〜63です。あなたのサンプルターゲット10.0.2.70は次のとおりです。外部この範囲にあるので、VPN 経由でルーティングする代わりに、enp0s3 で次により具体的なパス 10.0.2.0/24 を使用します。

「最も長いプレフィックスのマッチング」を参照しましたが、一般的に「最も具体的なマッチング」、つまり範囲が最も小さい場所は、最も長いプレフィックスを意味します。ただし、上記のようにテスト中のIPアドレスは、考えているプレフィックスの範囲に属していません。

netmaskDebian(およびその派生物)には、状況をより明確にするのに役立つ非常に便利なユーティリティがあります。

$ netmask -r 10.0.2.0/255.255.255.192
       10.0.2.0-10.0.2.63       (64)

これにはip route show図全体が表示されず、ポリシーベースのルーティングが適用される場合があります。また、すべてのルーティングルールを一覧表示する必要があります。これは一般的な出力です。

$ ip rule show
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

その後、特定のテーブル(ここでは「ローカル」テーブル)のルーティングエントリを次のように一覧表示できます。

$ ip route show table local

これをポリシーベースのルーティングと呼びます。通常、この機能は使用しませんが(たとえば、複数のインターネット接続がある場合はこの機能を使用します)、自分で構成していないシステムのルーティング問題を解決するときに知っておくと便利です。

関連情報