![tcpdump:从非零偏移量开始解码数据包](https://linux22.com/image/638653/tcpdump%EF%BC%9A%E4%BB%8E%E9%9D%9E%E9%9B%B6%E5%81%8F%E7%A7%BB%E9%87%8F%E5%BC%80%E5%A7%8B%E8%A7%A3%E7%A0%81%E6%95%B0%E6%8D%AE%E5%8C%85.png)
我正在调试一个 Linux 嵌入式平台,该平台有一个接口,其中常规以太网帧在前面附加了一个额外的 82 八位字节平台报头。我能够使用 tcpdump 从此接口嗅探,但 tcpdump 无法进行有用的解码,因为以太网报头没有从它期望的位置开始。因此,我只能看到使用 -x 选项的十六进制转储,但为了方便起见,我希望 tcpdump 对其进行解码。我对 82 八位字节报头的内容不感兴趣,但想看看后续封装的以太网帧的解码。
有什么方法可以告诉 tcpdump 从距捕获的数据包开头 82 个八位字节偏移处开始解码以太网头,而不是通常的 0 个八位字节?
答案1
除了修改 tcpdump 源之外没有其他办法。
如果您想这样做,我建议要么使用该设备的 DLT_USERn DLT_/LINKTYPE_ 值之一,要么获取 tcpdump.org 正式分配的值,破解 libpcap 以返回这些设备的 DLT_ 值,然后破解 tcpdump 以通过跳过(或解码,如果有用)82 八位字节平台标头对其进行解码。
答案2
我再次遇到了这个问题,忘记我问过这个问题,但谷歌把我带回了这里:)。
如果你碰巧有editcap
(摘自 wireshark)可用。无需更改源代码:
tcpdump -i eth0 -w - | editcap -C 82 - - | tcpdump -r -
第一个 tcpdump 调用捕获数据包并以 pcap 格式将其转储到管道中。然后 editcap 从 pcap 数据包流中的每个数据包开头截断 82 个字节。然后最后一个 tcpdump 调用读取 pcap 数据包流并正常剖析它。
请注意,管道会导致大量缓冲,因此输出不一定是即时的。 tcpdump 具有-l
面向行缓冲的选项,但即使如此,stdbuf -i0 -o0
我也无法完全删除缓冲。 YMMV。