【问题标题】:Does capturing outgoing frames using linux raw socket require ETH_P_ALL使用 linux 原始套接字捕获传出帧是否需要 ETH_P_ALL
【发布时间】:2014-01-01 02:05:25
【问题描述】:

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

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

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

所以我想知道这一点 - 使用ETH_P_ALL 是捕获与传入帧相同的传出帧的唯一方法吗?有没有其他方法可以指定捕获数据包的方向?

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

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

【问题讨论】:

    标签: linux packet-capture raw-sockets


    【解决方案1】:

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

    【讨论】:

    • 最后一句没有意义。 PF_PACKET 与询问者尝试使用的 AF_PACKET 相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多