如何使用tcpdump从大型pcap文件中获取特定范围的数据包?

时间:2013-10-28 11:12:38

标签: tcpdump

我有一个巨大的pcap文件(100GB),我对少量数据包感兴趣,我知道这些数据包是5,000,000到5,000,020。

如何使用tcpdump读取pcap文件,按数据包编号(或范围)过滤掉数据包,然后将其写入新的pcap文件?

5 个答案:

答案 0 :(得分:9)

使用Wireshark附带的editcap非常简单(至少在CentOS和Debian上)。对于5,000,000到5,000,020个包号,您可以这样做:

editcap -r <big_pcap_file> <new_pcap_file> 5000000-5000020

答案 1 :(得分:2)

您可以使用名为tricap的小程序。 Tricap是Xplico的一部分。 源代码也可以从这里下载:https://github.com/M0Rf30/xplico/tree/master/system/trigcap

答案 2 :(得分:1)

你提出了一个非常有趣的问题(至少对我而言!),所以我开始研究答案。

我有点惊讶地发现tcpdump手册页和文档中没有提到任何数据包编号,我认为它可以与-r选项一起使用(从pcap文件中读取)。我开始认为pcap输出文件不包含数据包号码?

我知道如果你把它加载到Wireshark中,你会在最左边的列中看到一个数据包编号,但是因为你在谈论一个100Gb的文件,我不想建议你把它加载到Wireshark(也许是Wireshark) Linux服务器可以解决这个问题吗?Dunno ......)

无论如何,我遇到了editcap,我过去没有使用它,但它是一个命令行工具,是Wireshark的一部分。 editcap允许您指定数据包编号或数据包编号范围。所以这让我觉得也许数据包号码只是一个Wireshark的东西,并且pcap文件只存储数据包而不关心标记任何订单号?

editcap - 手册页:http://www.wireshark.org/docs/man-pages/editcap.html

editcap - 用户指南:http://www.wireshark.org/docs/wsug_html_chunked/AppToolseditcap.html

要小心,因为editcap主要功能似乎是删除数据包(重复),所以请注意那里的任何默认行为!

希望这会有所帮助,如果有人有更多的亮光,我很乐意听到它!

答案 3 :(得分:0)

没有简单的方法可以做到这一点,有几种方法可以减轻文件的大小,以及防止这样的大文件。以下是一些解决方法:

tcpdump -r infile apply filters -w outfile

示例:

tcpdump -r firstcap.pcap -nn host 192.168.1.177 -w 177file.pcap

使用此过滤器,您将所有包含主机192.168.1.177的数据包解析为名为177file.pcap的新pcap文件;您还可以指定tcp,udp,icmp和arp等协议,并将这些数据包解析为单独的文件。

我不确定您是否可以轻松获得特定范围,有一种解决方法,您可以使用头部和尾部在特定的一组线上进行归零:

例如:

假设你想要1000个数据包文件中的400-500行:

tcpdump -r firstcap.pcap -c 500 | tail -100 >> outfile.txt

这将打印前500个数据包,然后将输出管道传输到尾部,这将只显示500个数据包捕获的最后100个数据包,因此有效地为400-500。然后你只是将ASCII中的所述packerts附加到outfile.txt,即它不再是pcap格式。

注意:非常重要的是要注意尾部打印最后N行非数据包,因此如果您以十六进制格式显示数据包,则必须在计算中考虑这一点。

为了避免创建巨大的pcap文件,您可以使用tcpdump轻松旋转捕获,我在这里写到:

http://www.ppartyka.com/2014/03/tutorial-tcpdump-pcap-file-too-large.html

希望这有帮助。

答案 4 :(得分:0)

您可以像使用tshark一样

$ tshark -r <pcapfile> -Y "frame.number >= 3 && frame.number <= 5" -w <output-pcapfile>

例如:-

$ tshark -r mae1_799.pcap -Y "frame.number >= 3 && frame.number <= 5"
3   0.000426 192.168.31.86 → 192.168.31.55 SCTP 64 SACK 
4   0.011255 192.168.60.55 → 192.168.201.55 TCP 68 80 → 53917 [ACK] Seq=1 Ack=1 Win=237 Len=0 TSval=3820568953 TSecr=1221428662
5   0.015323 192.168.12.3 → 192.168.12.2 SCTP 76 HEARTBEAT

您可以使用-w选项写入新文件,

$ tshark -r mae1_799.pcap -Y "frame.number >= 3 && frame.number <= 5" -w new.pcap

并确保您具有必需的数据包,

$ tcpdump -r new.pcap 
reading from file new.pcap, link-type LINUX_SLL (Linux cooked)
10:22:00.076746 IP 192.168.31.86.2905 > 192.168.31.55.2905: sctp (1) [SACK] [cum ack 661849925] [a_rwnd 102400] [#gap acks 0] [#dup tsns 0] 
10:22:00.087575 IP 192.168.60.55.http > 192.168.201.55.53917: Flags [.], ack 1035058538, win 237, options [nop,nop,TS val 3820568953 ecr 1221428662], length 0
10:22:00.091643 IP 192.168.12.3.2009 > 192.168.12.2.2008: sctp (1) [HB REQ] 

Wireshark 2.6.0 Release开始,您可以将成员资格运算符用于frame.number in {start..end}之类的范围,

$ tshark -r mae1_799.pcap -Y "frame.number in {3..5}"
3   0.000426 192.168.31.86 → 192.168.31.55 SCTP 64 SACK 
4   0.011255 192.168.60.55 → 192.168.201.55 TCP 68 80 → 53917 [ACK] Seq=1 Ack=1 Win=237 Len=0 TSval=3820568953 TSecr=1221428662
5   0.015323 192.168.12.3 → 192.168.12.2 SCTP 76 HEARTBEAT 

写入文件:

$ tshark -r mae1_799.pcap -Y "frame.number in {3..5}" -w new.pcap