2

製造中のバーンインサイクルでプロセッサボードを実行するためのテストスクリプトを作成しています。netcatを使用して、あるプロセスから1つのイーサネットポートから別のイーサネットポートに戻って受信プロセスにファイルを転送したいと思います。netcatはこれに使用するのが簡単なツールのようです。

問題は、別々のIPサブネットにIPアドレスを使用してイーサネットポートを設定し、一方から他方にデータを転送しようとすると、カーネルのプロトコルスタックが内部ルートを検出し、データ転送は期待どおりに完了しますが、完了しないことです。有線で出て行きます。パケットは内部でルーティングされます。

これはネットワークの最適化には最適ですが、私がやりたいテストを失敗させます。

これを機能させる簡単な方法はありますか?動作するiptablesのトリックはありますか?それとも、ルートテーブルに対してできることはありますか?

4

2 に答える 2

2

デフォルトのルーティング動作では、すべての内部ルートが表のようにマークされているため、内部ルーティングが推奨されscope linkますlocal。これをチェックしてください:

ip rule show
ip route show table local

カーネルが複数のルーティングテーブルをサポートしている場合は、localテーブルを変更するだけで目標を達成できます。必要ありませんiptables

192.168.1.1がターゲットIPアドレスであり、eth0がパケットをネットワークに送信するインターフェイスであるとします。

ip route add 192.168.1.1/32 dev eth0 table local
于 2013-03-07T12:50:15.537 に答える
1

私はこの種のことをするためにネットワーク名前空間を使用します。異なる名前空間の各アダプターを使用すると、データトラフィックはネットワークスタックに反映されるのではなく、確実にネットワークを通過します。個別の名前空間は、逆方向のパケットフィルターなどが邪魔になるのを防ぎます。

したがって、反射エージェント(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アドレスを配布する必要があります。だから私はサンプルコードのちょっとした準備をするのに十分なことをしていません。

于 2018-04-03T02:10:42.113 に答える