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ビットのパスが選択されます。一致するパスがない場合(デフォルトパスがない場合)、パケットを転送できません。
宛先ネットワーク、すなわち宛先のホストとネットワーク部分との間でアドレスが分割される方法は、ルーティング決定に影響を与えない。送信ホストは通常これを知らず、気にしません。