将pcap文件连续输送到tshark/wireshark

Per*_*sen 5 sniffing pcap wireshark tshark

我有连续生成的pcap文件给我.它想要不断地将它们送到"永远在线"的tshark/wireshark.这是我尝试过的(OSX)

mkfifo tsharkin
tail -f -c +0 tsharkin | tshark -l -i - > tsharkout 2>stderr &
cat file1.pcap > tsharkin
Run Code Online (Sandbox Code Playgroud)

以上工作正常,我从tsharkout中的file1.pcap得到预期的输出

cat file2.pcap > tsharkin
Run Code Online (Sandbox Code Playgroud)

以上不起作用,我在tsharkout中什么都没得到,但是我在stderr中得到"1包丢弃"+"3包捕获"

cat file2.pcap > tsharkin
Run Code Online (Sandbox Code Playgroud)

再次尝试使tail/tshark进程停止/崩溃

我尝试再次这样做,但这次先使用file2.pcap然后再使用file1.pcap.这次file2.pcap处理得很好,file1.pcap使tail/tshark进程停止/崩溃.因此,我将得出结论,两个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
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到tsharkout中file1.pcap和file2.pcap的预期输出

问题是我的pcap文件一路走来,所以我不能在将它们全部合并到tshark之​​前.我需要能够在pcap文件到达时将其提供给"永远运行"的tshark.我怎样才能做到这一点?

pch*_*gno 2

TL;博士。libpcap 文件有一个标头。您需要为第二个及后续捕获文件删除它:

\n\n
cat file2.pcap | tail -c +25 > tsharkin\n
Run Code Online (Sandbox Code Playgroud)\n\n

当向 tshark 提供两次相同文件时,我的输出:

\n\n
1   0.000000 10.0.0.1 \xe2\x86\x92 10.0.0.2 TLSv1.2 246 Application Data\n2   0.058816 10.0.0.2 \xe2\x86\x92 10.0.0.1 TCP 66 443 \xe2\x86\x92 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499\n\n3   0.000000 10.0.0.1 \xe2\x86\x92 10.0.0.2 TLSv1.2 246 [TCP Spurious Retransmission] , Application Data\n4   0.058816 10.0.0.2 \xe2\x86\x92 10.0.0.1 TCP 66 443 \xe2\x86\x92 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

细节

\n\n

正如libpcap 格式的文档中所解释的,libpcap 文件有一个24 字节的全局标头。该全局标头后面直接跟着数据包(带有自己的 libpcap 标头),无需填充。

\n\n

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

\n\n

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

\n\n
tail -c +startoffset file\n
Run Code Online (Sandbox Code Playgroud)\n\n

全局标头有 24 个字节长,我们希望从第 25 个字节开始读取捕获文件。

\n\n

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

\n