Debian 6 ボックスにいくつかの物理ネットワーク インターフェイスがあり、それぞれに異なるサブネット IP アドレスがあります。インターフェイスのうちの 2 つがスイッチ ハブに接続されているため、相互に通信できます。2 つのインターフェース間に TCP 接続をセットアップしたいと考えています。
これが私がすることです: 最初に SOCK_STREAM ソケットを取得します。次に、setsockopt(..., SO_BINDTODEVICE,...) を使用して、ソケットを特定のインターフェイス eth4 にバインドします。次に、sockaddr_in 構造をセットアップし、そのインターフェイス (eth4) のポートとアドレスを入力します。次に bind() を呼び出して、そのローカル アドレス/ポートをソケットにバインドします。次に、listen() の後に accept() を実行します。これは、着信接続要求の待機をブロックします。この時点で netstat を実行すると、予想どおりの結果が得られます。つまり、ソケットは確かに LISTEN 状態であり、ローカル アドレスには eth4 アドレスとポートが正しく表示されます。
次に、別のプログラムで、ソケットを取得し、setsockopt(..., SO_BINDTODEVICE,...) を使用してソケットを別のインターフェイス eth5 にバインドするルーチンを作成します。次に、eth4 インターフェースに使用したのと同じポート番号と eth4 インターフェースのアドレスを使用して、sockaddr_in 構造をセットアップします。次に、connect() を実行します。すべてがうまくいき、接続が成功し、私のロギングは実際に 2 つのプロセスが実際にこの TCP 接続に接続されていることを示しています。
しかし、netstat を実行すると、2 つの PID/プログラムが接続されていることが示されますが、接続端を eth5 のアドレスに明確にバインドしているにもかかわらず、ローカル アドレスと外部アドレスの両方が eth4 から同じアドレスを示しています。
それで、私の質問は、netstat が接続の両側で同じアドレスを表示するのはなぜですか?
私が思いつく唯一の説明は、カーネルが接続先アドレスが実際にはローカルであることを認識し、私が行った SO_BINDTODEVICE バインディングを無視し、実際に eth5 から eth4 に接続する代わりに、TCP 接続を内部にするということです。
それが正しい場合、同じLinuxボックス上の2つの別々のインターフェース間で実際にTCP接続を確立するにはどうすればよいですか?実際には内部ではなく外部に接続しますか?
-アンドレス