すでにデータを取得しています。ただし、得られるのは UDP パケットと送信元アドレスです。IPv4 ヘッダーと UDP ヘッダーを含む完全な未加工のパケットが必要な場合、それは異なります。
一部のプラットフォームでは、通常の UDP ソケットを に設定できますIP_HDRINCL
。または、他の同等のものがあります。これを行うと、それぞれrecvfrom
がデータにヘッダーを含めるため、必要なものはすべて揃っています。
他のプラットフォームでは、SOCK_RAW
代わりにSOCK_DGRAM
. raw ソケットでできることは劇的に異なります。多くの Unix プラットフォームでは、 with を使用IPPROTO_UDP
してSOCK_RAW
からbind
、通常の UDP アドレスとポートを使用できますが、制限がある場合があり、プラットフォームごとに異なります。たとえば、OS X では、raw ソケットを作成するには root になる必要があり、raw ソケットをバインドできるのは単一のインターフェイス アドレス ( ''
/ INADDR_ANY
/がないことを意味します'0.0.0.0'
) だけです。「SOCK_RAW Python」と「SOCK_RAW」をグーグルで検索すると、必要なものを見つけることができるはずです。( sockets モジュールのドキュメントの最後の例は、Windows で raw ソケットを使用する方法を示しています。)
データを取得したら、それをpcap
ファイルに保存するのは難しくありません。この形式は、The Wireshark Wiki のLibpcapFileFormatに記載されています。stdlib モジュールに精通していれば、struct
この形式の書き方を簡単に理解できるはずです。簡単なサンプルを次に示します。
pcap_hdr = struct.pack('=IHHiIII',
0xa1b2c3d4, # magic number
2, 4, # pcap 2.4 format
0, # UTC timezone for timestamps
0, # "in practice, all tools set it to 0"
65535, # max packet length
228) # LINKTYPE_IPV4, or maybe you want LINKTYPE_RAW
pcapfile.write(pcap_hdr)
自分でやりたくない場合は、ライブラリを使用して pcap ファイルを作成した経験はありませんがscapy
、最初に調べる場所、次に/のpython-libpcap
バインディングを調べます。これらのいずれも機能しない場合は、PyPI を確認してください。libpcap
WinPcap
これらすべてがあなたの理解を超えているように聞こえる場合は、おそらく、この方法で物事を行いたくないでしょう。UDP サーバーを実行し、Wireshark を使用して、送信されたすべてのパケットをキャプチャします。