Linux ルーティングプロセス

Linux ルーティングプロセス

Linuxが他のIPにアクセスするときにルーティングテーブルを使用する方法を知りたいです。私が知っている限り、たとえば「ssh 192.168.21.2」を実行すると、システムは宛先IPが192.168.21.2のTCPパケットを生成し、ネクストホップのルーティングテーブルを参照します。ルーティングテーブルエントリは次のとおりです。

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.16.1    0.0.0.0         UG    0      0        0 br0
169.254.0.0     0.0.0.0         255.255.0.0     U     1005   0        0 br0
169.254.0.0     0.0.0.0         255.255.0.0     U     1006   0        0 br1
192.168.16.0    0.0.0.0         255.255.240.0   U     0      0        0 br0
192.168.66.0    0.0.0.0         255.255.255.128 U     0      0        0 br1

ここで、システムは宛先ネットワークアドレスを探し、宛先ネットワークアドレスと一致し、一致するものが見つかると、パケットはインターフェイスを介して適切なゲートウェイに送信されます。

私の質問は、システムがルーティングテーブルと一致するように宛先IPのネットワークアドレスを計算する方法と時期です。この過程で私が完全に間違っている可能性があります。システムのパケットフローを理解するには、解釈が必要です。

答え1

まず、ネットワークコードは、送信するパケットに対する正しいインタフェースを選択する。次に、対応する送信元IPアドレスを適用します。

あなたの場合、インターフェースはおそらくアドレス付きインターフェースです。

192.168.16.X

明らかに「255.255.240.0」マスクをbr0インターフェースに適用したので、これが出てくるインターフェースになります。しかし注意してください:

192.168.21.2

あなたの場合、.16.Xアドレスは(ネットマスクのために)同じネットワーク上にあるため、発信パケットはARPを介してMACアドレス21.1を正常に取得した後にインターフェイスに送信されます。

パケットを別のサブネットの宛先に送信する場合(-->(宛先アドレスとマスク)は異なる値を提供します)、次のように言うことができます。

192.168.32.1

その後、パケットは、ルーティングのためにMACアドレスを使用してゲートウェイに送信されます。

答え2

デフォルトでは、ルーティングコードはルーティングテーブル全体を通過し、テーブルの各行ごとにその行を記録します(destIP & netmask) == destination)。 0〜N個の一致がある可能性があります。パスが複数ある場合は、「最も具体的な」パス、つまりネットマスクに最大1ビットのパスが選択されます。一致するパスがない場合(デフォルトパスがない場合)、パケットを転送できません。

宛先ネットワーク、すなわち宛先のホストとネットワーク部分との間でアドレスが分割される方法は、ルーティング決定に影響を与えない。送信ホストは通常​​これを知らず、気にしません。

関連情報