tcpdump:捕获具有未知链接类型的虚拟接口上的传出数据包到libpcap?

时间:2013-01-17 21:52:37

标签: linux tcpdump

在我正在测试的系统中,它有几个虚拟的L2设备链接在一起,在Eth头和IP头之间添加我们自己的L2.5头。现在当我使用

tcpdump -xx -i vir_device_1

,它实际上显示了带有IP标头的SLL标头。如何捕获实际流出vir_device_1的完整数据包,即在ndo_start_xmit()设备调用之后?

2 个答案:

答案 0 :(得分:1)

  

如何捕获实际流出vir_device_1的完整数据包,即在ndo_start_xmit()设备调用之后?

通过编写自己的代码直接使用PF_PACKET / SOCK_RAW套接字(你说“SLL标题”,所以这可能是Linux),或者通过:

  • 确保为虚拟界面分配了特殊的ARPHRD_值;
  • 使用DLT_USER n 值之一作为特殊标题集,或者向tcpdump-workers@lists.tcpdump.org索取官方DLT_值分配给他们;
  • 修改libpcap以将ARPHRD_值映射到您正在使用的DLT_值;
  • 修改tcpdump以处理DLT_值;
  • 如有必要,修改将在该接口上捕获的其他程序或读取由该接口上的tcpdump写入的捕获文件以处理该值。

请注意,DLT_USER n 值专门保留供私人使用,没有正式版本的libpcap,tcpdump或Wireshark将 指定它们供自己使用(例如,如果您使用DLT_USER n 值,请不要打算提供补丁以将该值分配给您的标题类型,因为它们不会被接受;其他人可能已经将它用于他们的自己的特殊标题,并且必须继续支持),所以你必须维护libpcap,tcpdump的修改版本,等等,如果您使用其中一个值而不是分配官方值。

答案 1 :(得分:1)

感谢Guy Harris为我原来的问题提供了非常有用的答案!

我将此作为答案/注释添加到我在评论中提出的后续问题中。 基本上我的问题是PF_PACKET / SOCK_RAW收到的数据包的状态是什么。

对于软件设备(无队列),dev_queue_xmit()将调用dev_hard_start_xmit(skb, dev)开始传输skb缓冲区。此函数在调用dev_queue_xmit_nit()之前调用dev->ops->ndo_start_xmit(skb,dev),这意味着PF_PACKET看到的数据包处于ndo_start_xmit()中所做的任何更改之前的状态。