我有一个巨大的 pcap 文件(100GB),我对少数数据包感兴趣,我知道这些数据包的数字是 5,000,000 到 5,000,020。
如何使用tcpdump
读取 pcap 文件,按数据包编号(或范围)过滤数据包,然后将它们写入新的 pcap 文件?
我有一个巨大的 pcap 文件(100GB),我对少数数据包感兴趣,我知道这些数据包的数字是 5,000,000 到 5,000,020。
如何使用tcpdump
读取 pcap 文件,按数据包编号(或范围)过滤数据包,然后将它们写入新的 pcap 文件?
Wireshark 附带的使用非常简单editcap
(至少在 CentOS 和 Debian 上)。对于 5,000,000 到 5,000,020 个数据包编号,您可以执行以下操作:
editcap -r <big_pcap_file> <new_pcap_file> 5000000-5000020
您可以使用一个名为 tricap 的小程序。Tricap 是 Xplico 的一部分。源代码也可以从这里下载:https ://github.com/M0Rf30/xplico/tree/master/system/trigcap
你提出了一个非常有趣的问题(至少对我来说!),所以我开始研究答案。
看到 tcpdump 手册页和文档没有提及任何数据包编号,我感到有些惊讶,我原以为它可以与 -r 选项一起使用(从 pcap 文件中读取)。我开始认为 pcap 输出文件不包含数据包号?
我知道如果你将它加载到 Wireshark 中,你会在最左边的列中看到一个数据包编号,但是由于你说的是一个 100Gb 的文件,我不想建议你将它加载到 Wireshark 中(可能是 Linux 服务器上的 Wireshark可以处理吗?不知道......)
无论如何,我遇到了 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 的主要功能似乎是删除数据包(重复),所以要注意那里的任何默认行为!
希望这会有所帮助,如果有人对此有更多的了解,我很想听听!
没有简单的方法可以做到这一点,有几种方法可以减轻文件的大小,并防止出现如此大的文件。以下是一些解决方法:
tcpdump -r infile 应用过滤器 -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 等协议,并将这些数据包解析到单独的文件中。
我不确定您是否可以轻松获得特定范围,有一种解决方法,您可以在特定的一组行上使用 head 和 tail 归零:
例如:
假设您想要 1000 个数据包文件中的第 400-500 行:
tcpdump -r firstcap.pcap -c 500 | tail -100 >> outfile.txt
这将打印前 500 个数据包,然后将该输出通过管道传输到尾部,这将仅显示 500 个数据包捕获的最后 100 个数据包,因此有效地为 400-500。然后你只是将 ASCII 中的所述打包程序附加到 outfile.txt,即它不再是 pcap 格式。
注意:非常重要的是要注意 tail 打印最后 N 行而不是数据包,因此如果您以十六进制格式显示数据包,则必须在计算中考虑到这一点。
为避免创建巨大的 pcap 文件,您可以使用 tcpdump 轻松旋转捕获,我在这里写过:
http://www.ppartyka.com/2014/03/tutorial-tcpdump-pcap-file-too-large.html
希望这可以帮助。
你可以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 版本开始,您可以将成员资格运算符用于范围,例如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