如何根据 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Python-对Pcap文件进行处理,获取指定TCP流

如何从 pcap 文件中提取所有数据包的 TCP 标头?

linux下如何编辑拆分pcap数据包

如何有效地将大型数据框拆分为多个拼花文件?

使用tcpdump和wireshark分析tcp流

如何有效地将大型 .tsv 文件上传到 pyspark 中具有拆分列的 Hive 表?