如何根据 TCP 流有效地拆分 pcap 文件?
Posted
技术标签:
【中文标题】如何根据 TCP 流有效地拆分 pcap 文件?【英文标题】:How to efficiently split pcap files based on TCP stream? 【发布时间】:2018-12-18 01:36:17 【问题描述】:我正在尝试将包含数百个 TCP 流的大型 pcap 文件拆分为单独的文件。我目前的方法(见下文)对我来说似乎效率很低。我的问题是:通过 TCP 流将 pcap 文件拆分为单独文件的最有效方法是什么?
目前的做法
在我目前的方法中,我首先使用 tshark 找出文件中有哪些 TCP 流。接下来,对于这些 TCP 流中的每一个,我读取原始文件并提取给定的流。下面的代码 sn-p 显示了我的方法:
#!/bin/bash
# Get all TCP stream numbers
for stream in `tshark -r $file -T fields -e tcp.stream | sort -n | uniq`
do
# Extract specified stream from $file and write it to a separate file.
tshark -r "$file" -Y "tcp.stream eq $stream" -w "$file.$stream.pcap"
done
但是,这种方法似乎效率低下,因为 tshark 必须多次读取 pcap 文件(每个流一次)。理想情况下,我想要一个解决方案,它可以遍历原始 pcap 文件一次,并在找到属于特定连接的数据包后,将其附加到该文件中。
其他方法
我也四处寻找其他方法,但它们似乎不适合我的情况:
PcapPlusPlus' PcapSplitter 对 TCP 连接的定义略有不同。他们将“连接”定义为相同的(协议、源 ip、目标 ip、源端口、目标端口)元组,如果多个 TCP 流具有相同的元组,这可能会表现出奇怪的行为。我相信 wireshark/tshark 实际上基于 SYN:SYN-ACK 和 FIN:FIN-ACK 标志的 TCP 流(但如果我错了,请纠正我)。 Python's Scapy Scapy 与 PcapSplitter 存在相同的问题,因为除了上述 5 元组之外,它不提供任何拆分 TCP 流的方法。 (当然我可以自己写,但这超出了我目前的工作范围)。对于这两种解决方案,我也不完全确定它们是否能够正确处理错误捕获。
问题
因此,我想对如何以最有效的方式基于 TCP 流将 pcap 文件拆分为单独的文件提出一些建议。
【问题讨论】:
【参考方案1】:你看过Tracewrangler吗?它适用于 Windows,但 documentation 确实提到它可以在 wine 下运行。
这可能是我能想到的最好的工具,但您可能想看看 Wireshark wiki Tools 页面上列出的其他工具。
【讨论】:
嗯,我不确定在 Wine 上运行的软件是否会比直接使用 tshark 运行得更快:/ Wine 的性能并不真正为人所知... 好吧,Tracewrangler 似乎在 Windows 上本地运行得很好,所以如果你有一台 Windows PC,你可以在那里尝试一下。如果没有,您可以随时在 wine 下尝试,并将其与您当前的策略进行基准比较以比较性能。无论如何,该工具是免费的,对于我们这些可以使用它的人来说非常方便。【参考方案2】:一种有效的方式(从性能的角度来看)是不经意间为该任务提供一个专用程序。
libpcap-library 可能需要实现这些功能:
pcap_open_offline
用于打开 pcap 文件进行读取
pcap_dump_open
用于打开 pcap 文件进行写入
pcap_dump
用于将数据包写入目标文件
还有一堆用于过滤/处理输入的函数。
【讨论】:
【参考方案3】:您可以使用 pkt2flow: https://github.com/caesar0301/pkt2flow
Usage: ./pkt2flow [-huvx] [-o outdir] pcapfile
Options:
-h print this help and exit
-u also dump (U)DP flows
-v also dump the in(v)alid TCP flows without the SYN option
-x also dump non-UDP/non-TCP IP flows
-o (o)utput directory```
【讨论】:
以上是关于如何根据 TCP 流有效地拆分 pcap 文件?的主要内容,如果未能解决你的问题,请参考以下文章