デュアルポートイーサネットNICがあります。両方のポートをリングに接続し、次のIPを2つのイーサネットインターフェイスに割り当てたとします。
- eth2 -> 192.168.2.1
- eth3 -> 192.168.3.1
192.168.3.1
たとえば、pingなどの物理ネットワークを介してポートの1つから別のポートにトラフィックを送信したいとします192.168.2.1
。ただし、LinuxカーネルのTCP / IPスタックはこれら2つのアドレスをローカルアドレスとして認識し、トラフィックをループバックアダプタに送信するため、トラフィックは物理ネットワークに到達しません。
私が持っていた最も近い解決策はAnastasovのものでした。自分にパッチを送る残念ながら、カーネル3.6から中断され、Ubuntu 13.10(カーネル3.11)では実行されません。 3.11用のパッチを再構築しようとしましたが、Ubuntuディストリビューションには見つかりませんでした。
- /linux/inetdevice.hを含む
- net/ipv4/devinet.c
- net/ipv4/fib_frontend.c
- ネットワーク/ipv4/route.c
- ドキュメント/ネットワーク/ip-sysctl.txt
「自分自身に送信」パッチを機能させる方法はありますか、それとも別の解決策がありますか?
答え1
ネットワークネームスペースを作成し、インターフェイスの1つをそのネームスペースに移動します。
ip netns add test
ip link set eth1 netns test
新しい名前空間でシェルを起動します。
ip netns exec test bash
その後、2台のコンピュータがあるかのように進みます。完了したら、シェルを終了して名前空間を削除します。
ip netns del test
答え2
まだ試していませんが、考えられる解決策がいくつかあると思います。
仮想デバイス
ホストのIPスタックから1つ以上のネットワークカードを取り外し、IPスタックの問題を解決します。これを仮想マシンに割り当てます。ただし、パフォーマンステストの場合、これはお勧めできません。ただし、CPUのパフォーマンスが十分であれば、追加のソフトウェア層がボトルネックを引き起こさない可能性があります(しかし、どうすればわかりますか?)。
その他の宛先アドレス
私の考えでは、NICパフォーマンステストのためにレイヤ2でパケットを送信したいと思います。したがって、異なるIPアドレス(非ローカルアドレス、いずれの場合でもパケットが有線で送信される)を持つIPパケットを使用できます。次に、トリックを使用して、ip neigh
この偽のIPアドレスを別のNICのMACアドレスにマッピングする永続ARPエントリを作成します。
この方法で IP 接続を確立することもできます。ただし、2つのNICが必要な偽IPの2つのうちの1つと通信していると信じるように、およびを使用する必要がありiptables
ます。SNAT
DNAT
オリジナルアクセス
真剣なプログラミングをしたい場合は、生のソケットを開き、イーサネットフレームを直接作成できます。おそらくこれが最速の解決策でしょう。