tcpdump:从非零偏移开始解码数据包

我正在debugging一个Linuxembedded式平台,它有一个接口,在这个接口中,普通的以太网帧有一个额外的82字节的平台头部。 我能够使用tcpdump从此接口嗅探,但tcpdump不能有效解码,因为以太网标题没有开始它所期望的。 因此,我可以看到的是一个hex转储与-x选项,但为了方便,我想tcpdump解码它们。 我对82-octet头文件的内容不感兴趣,但希望看到后续封装的以太网帧的解码。

有没有一种方法可以告诉tcpdump开始解码从捕获的数据包开始的82个八位字节偏移量开始的以太网报头,而不是通常的0个八位字节?

不是比修改tcpdump源。

如果你想这样做,我会build议使用该设备的DLT_USERn DLT_ / LINKTYPE_值之一,或得到由tcpdump.org正式分配的一个,黑客libpcap返回这些设备的DLT_值,并篡改tcpdump通过跳过(或解码,如果有用的话)解码该82字节的平台头。

我再次遇到这个问题,忘记了我问过这个问题,但谷歌把我带回了这里:)。

我想出了一个解决方法,如果你碰巧有editcap (从wireshark)可用。 无需更改源代码:

 tcpdump -i eth0 -w - | editcap -C 82 - - | tcpdump -r - 

第一个tcpdump调用捕获数据包并将它们以pcap格式转储到pipe道中。 然后编辑capcap从pcap数据包stream中的每个数据包的开始处截掉82个字节。 然后最后的tcpdump调用读取pcap数据包stream,并解剖它正常。

请注意,pipe道会导致很多缓冲,所以输出不一定是即时的。 tcpdump具有面向行缓冲的-l选项,但即使使用stdbuf -i0 -o0我也无法完全删除缓冲区。 因人而异。