私のLinux(カーネル3.17)システムには、eth0、eth1(および/またはeth2 ...)など、いくつかのNICがあります。
各コンピュータに複数のコンピュータが接続されています。
PC0 <---> eth0 (192.168.1.100)
PC1 <---> eth1 (192.168.1.101)
PC2 <---> eth2 (192.168.1.102)
Linuxシステムのアプリケーションは、192.168.1.100(および他の2つ)でリッスンするスレッドを起動します。 PC0からパケットを受信した後、スレッドが応答します。答えを保証する方法いいえ同じサブネットマスクを持っていても、eth1またはeth2を通過しますか?同様に、pc1からパケットを受信した後、応答はeth0またはeth2を通過しないでください。
理想的には、私が言うことを達成するためには、10.0.0.1と172のように全く異なる3つのサブネットを使用する必要があります。しかし、同僚がこれがうまくいくと提案したので、ここで同僚のコメントを探しています。カーネルは私の制御下にあるので、カーネルが機能するようにするためにどんな解決策でも考えられるようにカーネルを作成しました。
説明する
3つのネットワークカードが同じサブネットにあるのはなぜですか? Eth0 は、Linux 起動時に静的に割り当てられるデフォルトの IP アドレスです。変更しないでくださいが、必要に応じて変更できます。問題は、サイトの誰かが誤ってeth1とeth2をeth0と同じサブネットを持つように割り当てた場合はどうなりますか?ソケットが一部のポートeth0でリッスンしている場合、アプリケーションはeth0にのみ応答しますか?
可能なルーティングテーブル
ルールは、要求がNICから来るとNICを通過することです。どこかでコピーしました。
ip route add 172.16.10.0/24 dev eth0 src 172.16.10.10 table 10
ip route add default via 172.16.10.251 table 10
ip route add 172.16.10.0/24 dev eth1 src 172.16.10.20 table 20
ip route add default via 172.16.10.251 table 20
ip route add 172.16.10.0/24 dev eth0 src 172.16.10.10
ip route add 172.16.10.0/24 dev eth1 src 172.16.10.20
ip route add default via 172.16.10.251
ip rule add from 172.16.10.10 table 10
ip rule add from 172.16.10.20 table 20
ip route flush cache
答え1
通常、アプリケーションは特定のインターフェイスではなくIPアドレスにバインドされます。 (例外はtcpdump / wiresharkなどのようにネットワークを直接妨害するアプリケーションですが、これはあなたの場合ではないので無視してください。)ほとんどのアプリケーションは1つのIPアドレスまたはすべてのIPアドレス(通常はそうではありません)にバインドできます。 2つ以上ですが、すべてではありません)。特定のアプリケーションに適したものは、コーディング方法によって異なります。
クライアントがこのソケットに接続すると、接続は4つの項目で識別されます。
- 自分のIPアドレス(例:192.168.1.100)
- 自分のポート(例:8080)
- クライアントIPアドレス
- クライアントポート
この接続で受信するデータに送信されるすべての応答は、次の4つの特性を使用して送信されます。つまり、サーバーの他のIPやインターフェースからは送信されません。
したがって、アプリケーションが実行するすべての操作が{IP、port}でリッスンし、その{IP、port}から接続を受け入れてクライアントに応答する限り、問題はありません。
問題が発生する可能性があるのは、アプリケーションが時々自己接続を開始することです。この場合(通常)コンピュータは使用するインターフェイスを決定します。コンピュータで3つのインターフェイスがすべて同じ有効であると見なされると、トラフィックが間違ったインターフェイスから流れ出す可能性があります。
コンピュータに常に特定のインターフェイスを使用させることも可能です。正確な方法は、特定のOS /配布版によって異なります。検索する用語は「unixソースルーティング」です。