使用linux raw socket捕获传出帧是否需要ETH_P_ALL

时间:2014-01-01 02:05:26

标签: linux packet-capture raw-sockets

在Linux(2.6.39内核)上,使用原始套接字,我正在尝试接收系统自身发出的所有组播帧。

我创建了一个原始套接字socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP));,并且正在从套接字中读取帧,丢弃没有以“01:00:5e”开头的目标地址的帧。我知道有更好的方法来锁定UDP,但我正在玩,我注意到了这个特殊的问题,所以下面是这个问题的唯一范围。

我可以捕获所有飞来飞去的组播数据包,除了程序运行的系统生成的数据包。我可以让它开始捕获系统自己的数据包(以及发送到它的数据包)的唯一方法是将protocol调用中的socket()参数更改为htons(ETH_P_ALL)。我以这种方式捕获的数据包仍然具有0x0800类型ETH_P_IP

所以我对此感到疑惑 - 使用ETH_P_ALL是否只能捕获与传入帧相同的传出帧?有没有其他方法来指定捕获的数据包的方向?

packet(7)在这个问题上有点模糊,只说:

  

该协议类型的所有传入数据包在传递给内核中实现的协议之前将被传递到数据包套接字。

1 个答案:

答案 0 :(得分:0)

使用libpcap捕获所有传入和传出的数据包,并使用pcap_setdirection()指定将捕获数据包的方向。 libpcap比原始套接字快,因为它在内部使用PF_PACKET。