2011-01-27 11 views
4

要約:同じマシン上に存在する2つの物理インターフェイス間でデータを渡すソケットを作成しようとしています。物理的なインタフェースを押し進めるのではなく、カーネル内で実行されます。この動作を無効にする方法はありますか?デバイスの設定、レジストリの調整、ルーティングテーブルの不具合、またはソケットオプションによるものでしょうか?私たちはWindows XP SP3を使用しています。Win32ソケット - 他のローカルインターフェイスに送信する際にIPパケットを物理インターフェイスから離れるようにする

いくつかの背景。カスタムIPv4機器を使用するために完全に自動化されたIPテストを構築しようとしています。私たちには、Windows XPマシンと、接続している各デバイス用の物理的なイーサネットインターフェイスの大規模なラボがあります。私たちのデバイスは効果的にそれぞれ独自のIPを持つイーサネットルーターです。

私たちの研究室のマシンから、私たちのデバイスを通して、同じコンピュータに戻ってデータを送信する必要があります。ユニキャストとマルチキャストUDP、TCP、およびブロードキャストIPトラフィックをデバイスから送信します。

トラフィックは、宛先と同じマシン上で発信されることが必要です(必要と思われる)。 これは、それぞれ独自のサブネット上に独自のIPを持つ2つの別個のNICを構成します。たとえば、NIC#1は10.0.0.1/24、NIC#2は10.0.1.1/24です。私たちのデバイスは、単純なパススルールーターのように動作し、10.0.0.0/24サブネットに1つ、10.0.1.0/24サブネットに1つずつ、2つのインターフェイスを持ち、パケットを前後に転送します。

私たちのデータを生成するには、よく理解され、サポートされており、顧客が使用しているもので、おそらく最も迅速なアプローチであるため、Win32ソケットを使用できるようにしたいと考えています。パケット注入はおそらくUDPとブロードキャストIPでは実行可能ですが、TCPではそうではありません。私はパケットインジェクションを使ったアイデアを楽しんだり、標準のWin32ソケットを強く好んでいました。

要約に記載されているように、パケットはマシンから離れることはありません。私は狂人のようなグーグルで、私はあまり見つけられませんでした。何か案は?

答えて

4

WindowsのコマンドラインROUTEユーティリティを使用します。特定のサブネット上の特定のIPアドレスに送信されたすべてのIPパケットが別のIP /デバイスに送信されるように設定できます。たとえば:あなたはNICインタフェースのインデックス番号を知っていればまた

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_2> METRIC 1 
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_1> METRIC 1 

、あなたの代わりにそれらを指定することができます。

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> METRIC 1 IF <NIC_2_INTF> 
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> METRIC 1 IF <NIC_1_INTF> 

この方法は、パケットがNIC#1のIPに送信されるたびに、パケットはNIC#2に接続されたデバイスに送られ、NIC#2に転送されます。また、NIC#2のIPに送信されたパケットの場合も同様です。

たとえば、PCがルータを使用してネットワークに接続されている場合、WireSharkがローカルIPトラフィックをキャプチャできるようにするための便利なテクニックです。 1つのローカルIP /ポートから別のローカルIP /ポートへのパケットをルーターからPCに戻して、WireSharkが監視できる物理インターフェイスを通過できるようにすることができます(WireSharkには、ローカルパケットごとに重複したコピー重複を除外することができます)。

+0

これは、人々が示唆したすべてのオプションと、検索で見つけたすべてのオプションの中で最も効果的です。私はまだこの「放送」トラフィックのための仕事をすることに問題があります。私はそれに取り組むのにもっと時間を費やす必要がありますが、私はWin7に付属しているIP_UNICAST_IFソケットオプションが必要になると感じています(皮肉なことに、ブロードキャスト用の 'ユニキャスト'オプションを使用しています) – antiduh

0

Winsockは常にパケットデータをカーネル空間に持ち込み、そこで処理します。一般的なAPIへの全体的なポイントは、どのデバイスも同じ「レイヤー」で処理されるということです。 Winsockを使用したい場合は、この動作を回避する(またはしたい)とは思われません。

バッファコピーの一部は、またはTransmitFileで削除できますが、2つのデバイスインターフェイス間で削除することはできません。

言われているように、Winsockが実行する追加のバッファー対処に関してパフォーマンス上の問題がありますか?セキュリティ上の懸念?

+0

あなたは何について話していますか?関心のあるNICのIPにソケットをバインド()しないでください。 –

0

テスターのエンドポイントを別個の仮想マシン内で実行する方法について教えてください。次に、ハードウェアは1つだけ必要ですが、お互いがローカルであることを知らない別々のTCP/IPスタックを持つことになります(ほとんどのVMソリューションはパケットをそのままホストにそのまま渡しますが、ホストVM間のブリッジングを設定しない限り、パケットを取得して別のVMに直接送信しますが、各VMを別の物理ネットワークアダプタにバインドします)。