既知のトラフィックを(libpcapを使用して)NICからキャプチャし、テストしようとしているアプリケーションにフィードする必要があるテストツールを作成しています。
私がセットアップしようとしているのは、Webサーバー(この場合はlighttpd)と、同じマシン上で分離されたテストネットワーク上で実行されているクライアント(curl)です。スクリプトはセットアップ全体を駆動します。目標は、クライアントの数と、各クライアントがWebサーバーからダウンロードするファイルのセットを指定できるようにすることです。
私の最初のアプローチは、単にループバック(lo)インターフェイスを使用することでした... 127.0.0.1でWebサーバーを実行し、クライアントにファイルをフェッチさせhttp://127.0.0.1
、loインターフェイスでlibpcapベースのツールを実行します。これは、ループバックインターフェイスが実際のイーサネットインターフェイスをエミュレートしないという事実を除けば、問題なく機能します。それに関する主な問題は、パケットがすべて一貫性のないサイズであるということです... 32kバイト以上で、いくらかランダムです... loでMTUを下げることもできません(まあ、できますが、効果はありません!)。
また、実際のインターフェイス(eth0)で実行しようとしましたが、内部Webサーバーと通信する内部Webクライアントであるため、トラフィックがインターフェイスを離れることはなく、libpcapはそれを認識しません。
それで私はtun/tapに目を向けました。私はsocatを使用して2つのtunインターフェイスをtcp接続でバインドしたので、実際には次のようになりました。
10.0.1.1/24 <-> tun0 <-socat-> tcp connection <-socat-> tun1 <-> 10.0.2.1/24
これは本当に素晴らしい解決策のようです...tun/ tapデバイスは実際のイーサネットデバイスをエミュレートするので、Webサーバーをtun0(10.0.1.1)で実行し、キャプチャツールをtun0で実行して、クライアントをtun1(10.0.2.1)にバインドできます。 )... tcを使用して、このトラフィックにシェーピングルールを適用し、Linuxボックス内に仮想WANを作成することもできます...しかし、それは機能しません...
これが私が使用したsocatコマンドです:
$ socat -d TCP-LISTEN:11443,reuseaddr TUN:10.0.1.1/24,up &
$ socat TCP:127.0.0.1:11443 TUN:10.0.2.1/24,up &
これにより、それぞれのIPアドレスを持つ2つのtunインターフェイス(tun0
および)が生成されます。tun1
を実行するping -I tun1 10.0.1.1
と応答がありませんが、iを実行するとtcpdump -n -i tun0
、ICMPエコー要求が反対側に到達し、応答の兆候が戻ってこないことがわかります。
# tcpdump -i tun0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes
16:49:16.772718 IP 10.0.2.1 > 10.0.1.1: ICMP echo request, id 4062, seq 5, length 64
<--- insert sound of crickets here (chirp, chirp)
それで、私は明らかな何かを見逃していますか、それともこれは間違ったアプローチですか?他に試すことができるものはありますか(たとえば、2つの物理インターフェイス、eth0とeth1 ???)。
最も簡単な方法は、2台のマシンを使用することですが、このすべてが自己完結型である必要があるため、他の依存関係なしに、1台のマシンですべてのスクリプトと自動化を行うことができます...
アップデート:
2つのsocatをtcp接続で接続する必要はありません。これを行うことは可能です(そして私にとっては望ましいことです)。
socat TUN:10.0.1.1/24,up TUN:10.0.2.1/24,up &
同じ問題がまだ存在します...