私はこの種のことをするためにネットワーク名前空間を使用します。異なる名前空間の各アダプターを使用すると、データトラフィックはネットワークスタックに反映されるのではなく、確実にネットワークを通過します。個別の名前空間は、逆方向のパケットフィルターなどが邪魔になるのを防ぎます。
したがって、反射エージェント(pingサーバーなど)としてiperf3を使用してeth0とeth1を想定します。[免責事項:メモリからのテキスト、すべてのタイプミスはタイプミス、YMMV]
ip netns add target
ip link set dev eth1 up netns target
ip netns exec target ip address add dev eth1 xxx.xxx.xxx.xxx/y
ip netns exec target iperf3 --server
これで、名前空間「ターゲット」を作成し、アダプターの1つをその名前空間に移動しました。IPアドレスを設定します。そして最後に、そのターゲット名前空間でアプリケーションを実行します。
これで、ネイティブ名前空間で任意の(互換性のある)プログラムを実行できます。プログラムがxxx.xxx.xxx.xxx IPアドレス(明らかに何らかのルートで到達可能である必要があります)を参照している場合、適切なオンワイヤトラフィックが発生します。ループバックパスは、あたかもそれがすべて一緒に別のコンピューターであるかのように、他の名前空間内のアダプターを見つけます。
終了したら、デーモンサーバーを強制終了し、名前空間を名前で削除すると、名前空間メンバーが元に戻り、バニラに戻ります。
killall iperf3
ip netns delete target
これは、単一のインターフェイスの「仮想関数」でも機能しますが、この例では、1つ以上の仮想関数(SR-IOVタイプのアダプターなど)を使用して、ローカルMACアドレスを配布する必要があります。だから私はサンプルコードのちょっとした準備をするのに十分なことをしていません。