14

BERやネットワーク上の遅延などをエミュレートできるソフトウェアがいくつかあります。ソフトウェアのBERモジュールをテストして、実際に正しく機能することを確認する方法が必要です。私の解決策は、typeフィールドが未使用のtypeに設定された生のイーサネットフレームを送信するプログラムを作成することです。イーサネットフレームの内部には、ランダムなビットがあります。送信されるフレームごとに、フレームをpcapファイルに記録する必要があります。ネットワークリンクの反対側には、受信したすべてのパケットを独自のpcapログに書き込むだけの受信アプリケーションがあります。テストの実行が完了すると、2つのpcapログが比較されてBERが取得されます。

私はPythonモジュールを使用してScapyおり、これまでのところ、必要なことはすべて実行しています。ランダムデータを含む生のイーサネットフレームを送信して、Wiresharkで確認できます。wrpcap()ただし、上書きする代わりに、メソッドをpcapファイルに追加する方法がわかりません。にパケットのリストを書き込むことができることはわかっていますwrpcapが、このアプリケーションは無期限に実行できる必要があり、ハードドライブに送信されたすべてのパケットの書き込みをアプリケーションが終了するまで待つ必要はありません。 。それはメモリに保存するのに多くのことになるので、何かが起こった場合、私は最初からテストを最初からやり直す必要があります。

私の質問は、ファイルを上書きする代わりに、pcapを使用してファイルに追加するにはどうすればよいですか?それも可能ですか?そうでない場合、どのモジュールが必要なことを実行できますか? scapypcap

の機能を備えたものを探しているときScapyに遭遇しましたdpktが、そのためのドキュメントはあまり見つかりませんでした。dpkt私が求めていることを実行できますか?もしそうなら、どこでそれに関するいくつかの良いドキュメントを入手できますか?

4

4 に答える 4

19

後世の場合、scapy 2.2.0 でこれを処理するには、PcapWriter または RawPcapWriter がより簡単な方法のようです。ただし、ソースを参照する以外に多くのドキュメントを見つけることができませんでした。簡単な例:

from scapy.utils import PcapWriter

pktdump = PcapWriter("banana.pcap", append=True, sync=True)

...
pktdump.write(pkt)
...
于 2013-12-26T06:31:36.240 に答える
7

あなたが望むことをする方法がありますが、それは次のいずれかを意味します:

  • [1 つの大きなメモリを占有する]:ディスクからpcap既存のものを に読み込み、受信したフレームを に書き込みます。中間を自由に選択して保存できますが、 の に追加機能のようなものはないと思います。おっしゃったように、この手法は、完了するまで全体をメモリに保持していることも意味します。pcaprdpcap()scapy PacketList()PacketListPacketListpcapscapywrpcap()PacketList

  • [個々のpcapファイルを一緒に接着]: パケットの小さなスナップショットのみをメモリに保持します... pcapX 分ごとにスナップショットをディスクに保存し、スクリプトが終了したときにそれらの個々のファイルをまとめてください。

pcapLinuxmergecapのファイルとwiresharkパッケージのファイルを組み合わせることができます... 次のコマンドは、pak1.pcapとを結合pak2.pcapall_paks.pcapます:

mergecap -w all_paks.pcap pak1.pcap pak2.pcap

についてdpktは、ソースを調べたところ、パケットをインクリメンタルに書き込むことができる可能性がありますが、コードベースがどれほど安定しているか、維持されているかについては言えません...コミットログからは少し無視されているようです(最後のコミットは2011 年 1 月 9 日)。

于 2011-11-28T21:51:32.477 に答える
0

パケットが盗聴されているので、ここであなたをフォローしていると思いますが、それらすべてを単一の pcap ファイルに書き込みたいですか? pcap に追加することはできませんが、リストにパケットを追加してから、それらをすべて一度に pcap に書き込むことができます。

これがあなたの質問に答えるかどうか、またはまったく役立つかどうかはわかりません。そうでない場合はお知らせください。あなたのニーズに合わせて調整できます。この例では、スニッフィングされた 500 パケットごとに新しい pcap を作成するようにしきい値を設定しています。これを 2 回実行すると、2 回目に pcaps が上書きされる可能性があるので注意してください。

#!/usr/bin/python -tt

from scapy.all import *

pkts = []
iter = 0
pcapnum = 0

def makecap(x):
    global pkts
    global iter
    global pcapnum
    pkts.append(x)
    iter += 1
    if iter == 500:
        pcapnum += 1
        pname = "pcap%d.pcap" % pcapnum
        wrpcap(pname, pkts)
        pkts = []
        iter = 0

while 1:
    sniff(prn=makecap)

これにより、少しのレバレッジが得られるはずですが、最後のいくつかのパケットが失われる可能性があります (これを軽減するには、if ステートメントの値を下げます)。両側で同時に使用することを提案し、各 pcap が整列するようにします。マイクが提案するように、必要に応じて mergepcap を使用できます。これがうまくいくかどうか教えてください。

于 2012-04-19T15:31:26.953 に答える