0

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

tcpdump -xx -i vir_device_1

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

4

2 回答 2

1

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

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

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

请注意,DLT_USERn值是专门为私人使用而保留的,并且任何官方版本的 libpcap、tcpdump 或 Wireshark 都不会将它们分配给自己使用(即,如果您使用DLT_USERn值,请不要费心提供补丁来分配它对您的标头类型的价值,因为它们不会被接受;其他人可能已经将它用于他们自己的特殊标头,并且必须继续支持),因此您必须维护 libpcap 的修改版本, tcpdump 等,如果您使用其中一个值而不是获得指定的官方值。

于 2013-01-18T19:54:05.763 回答
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()

于 2013-01-22T00:23:17.510 回答