不断将 pcap 文件提供给 tshark/wireshark

Continuously feeding pcap files to tshark/wireshark

我不断收到 pcap 文件。它想不断地将它们喂给 "ever-running" tshark/wireshark。这是我尝试过的 (OSX)

mkfifo tsharkin
tail -f -c +0 tsharkin | tshark -l -i - > tsharkout 2>stderr &
cat file1.pcap > tsharkin

以上工作正常,我从 tsharkout

中的 file1.pcap 得到了预期的输出
cat file2.pcap > tsharkin

以上不起作用,我在 tsharkout 中什么也没得到,但我在 stderr 中得到“1 个数据包丢失”+“3 个数据包捕获”

cat file2.pcap > tsharkin

再次尝试使 tail/tshark 进程 stop/crash

我又试了一次,但这次先是 file2.pcap,然后是 file1.pcap。这次 file2.pcap 处理得很好,file1.pcap 正在使 tail/tshark 处理 stop/crash。所以我会得出结论,这两个 pcap 文件没有任何问题,但似乎 tshark 不喜欢向它抛出一个以上的 pcap 文件。

为了测试它,我尝试先使用 mergecap 合并 file1.pcap 和 file2.pcap,然后将其输入 tshark

mergecap -F pcap -w file1_2.pcap file1.pcap file2.pcap
cat file1_2.pcap > tsharkin

这很好用,我从 tsharkout

中的 file1.pcap 和 file2.pcap 得到了预期的输出

问题是我的 pcap 文件一路到达,所以我不能在将它们全部合并到 tshark 之前。我需要能够在 pcap 文件到达时将其提供给 "ever-running" tshark。我怎样才能做到这一点?

TL;DR. libpcap 文件有 a header。您需要为第二个和后续捕获文件删除它:

cat file2.pcap | tail -c +25 > tsharkin

我的输出,当输入 tshark 两次相同的文件时:

1   0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 Application Data
2   0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499

3   0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 [TCP Spurious Retransmission] , Application Data
4   0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499

详情

the documentation for the libpcap format, libpcap files have a 24 bytes global header. This global header is directly followed by packets (with their own libpcap header 中所述)没有填充。

因此,当将 libpcap 文件提供给 tshark 时,第一个文件工作正常,因为 tshark 需要一个全局 header。但是,它并不期望您为它提供的后续文件有一个。这可能会导致 tshark 将第二个文件的开头(实际上是一个全局 header,再次)视为格式错误的数据包并将其丢弃(“1 个数据包已丢弃”)。我不知道为什么 tshark 在第三个文件处停止。

如果您确定所有捕获文件都具有相同的格式(注意 pcapng 文件)并且相同的header,然后您可以安全地删除第二个文件(和后续文件)的全局 header,然后再将它们发送到您的命名管道。一种方法是使用您已在问题中使用的尾部语法:

tail -c +startoffset file

全局header是24个字节长,我们想从第25个字节开始读取捕获文件。

注意 相同 header. 如果您的所有捕获文件都以相同的方式检索,则它们可能具有相同的全局 header。特别是,物理层协议(例如以太网)需要相同。全局 header 还包含格式的版本(例如 2.4)、时区和数据包的最大捕获长度。