デュアルポートイーサネットNICがあり、両方のポートをループで接続し、次のIPを2つのイーサネットインターフェイスに割り当てたとします。
物理ネットワークを介して、一方のポートからもう一方のポートにトラフィックを送信したい。 ping 192.168.3.1
from 192.168.2.1
。ただし、LinuxカーネルのTCP/IPスタックは、これら2つのアドレスがローカルであることを認識し、代わりにトラフィックをループバックアダプターに送信するため、トラフィックが物理ネットワークに到達することはありません。
私が解決策に最も近いのはAnastasovの send-to-self patch ですが、残念ながらカーネル3.6以降廃止されているため、Ubuntu 13.10(カーネル3.11)では動作しません。 3.11のパッチを書き直そうとしましたが、Ubuntuディストリビューションでこれらを見つけることができないようです。
Send-to-selfパッチを機能させる方法、または代替ソリューションはありますか?
ネットワーク名前空間を作成し、インターフェイスの1つをその名前空間に移動します。
ip netns add test
ip link set eth1 netns test
新しい名前空間でシェルを開始します。
ip netns exec test bash
次に、2台のマシンがあるかのように進みます。終了したら、シェルを終了し、名前空間を削除します。
ip netns del test
私はまだそれを試していませんが、回避策にはいくつかの可能性があると思います。
仮想マシン
NICの少なくとも1つをホストのIPスタックから分離することにより、IPスタックの問題を解決します。それを仮想マシンに割り当てます。ただし、パフォーマンステストの場合、これはあまり望ましくない場合があります。しかし、十分なCPUパワーがあれば、追加のソフトウェア層がボトルネックにならない可能性があります(しかし、どうやって知っていますか?)。
異なるターゲットアドレス
NICパフォーマンステストの場合にのみ、パケットをレイヤー2に転送する必要があると思います。したがって、異なるIPアドレス(パケットが送信されるように非ローカルアドレス)を持つIPパケットを使用できます。次に、不正行為を行います。ip neigh
を使用して、この偽のIPアドレスを他のNICのMACアドレスにマップする永続的なARPエントリを作成します。
その方法でIP接続を行うこともできます。ただし、iptables
をSNAT
およびDNAT
とともに使用して、両方のNICが2つの必要な偽のIPのいずれかと通信していると信じるようにする必要があります。
生のアクセス
重要なプログラミングを行う場合は、rawソケットを開いて、イーサネットフレームを自分で作成できます。これはおそらく最速の解決策でしょう。