我需要构建什么才能直接访问内核级别的以太网帧位?

What do I need to build to directly access the Ethernet frame bits in the kernel level?

我想检索线路上所有以太网帧的以太网帧位,无论它们是否发往(MAC 级别)我的机器。

The logic for that has to be at the kernel level.

所以为了实现这个,我需要构建一个单独的内核模块以太网驱动程序以太网网络接口

注意:我刚刚开始为我的项目学习 Linux 内核模块开发。如果这里不适合 post 这个问题,我很抱歉。

要接收发往所有主机的帧,您必须将网络接口设置为混杂模式。

要获取帧,您可以使用不同的替代方法:

  1. pcap API(库 libpcap)
  2. 数据包套接字:http://man7.org/linux/man-pages/man7/packet.7.html
  3. 看看ebtables(我从来没有用过所以在这一点上我不确定):http://linux.die.net/man/8/ebtables
  4. 这里提出netfilter:How to capture network frames in a kernel module

如果您仍想破解内核,则无需创建新的以太网设备驱动程序,只需编写一个内核模块来注册以接收从以太网设备驱动程序接收的帧。查看内核文件 http://lxr.free-electrons.com/source/net/core/dev.c ,你可以从函数开始:

int netif_rx(struct sk_buff *skb)

这是从设备驱动程序接收的帧。

有非常好的工具可用于捕获和检索以太网帧。这些工具是 tcpdump 和 wireshark。 Tcpdump 是命令行实用程序,而 wireshark 是基于 GUI 的实用程序。您可以根据自己的喜好使用它们。有关此工具的更多信息,请参阅以下链接:

http://www.tcpdump.org/tcpdump_man.html

https://www.wireshark.org/docs/wsug_html_chunked/

这取决于 linux 内核的版本以及正在使用的处理器。

一般来说,您可能需要在网络 driver 的中断处理程序级别进行一些更改。通常,一旦接收到数据包,driver 就会被相应的接收中断中断。一旦确定了接收中断,就不应在中断处理程序本身中完全处理数据包。相反,处理程序将触发下半部分,该部分将对数据包进行进一步处理,这是您可能需要确定数据包类型并根据您的要求进行处理的地方。 另请注意,某些 NIC 会直接将数据通过 DMA 方式传输到 sk_buff,然后将数据从那里发送到堆栈。在这种情况下,一旦从 DMA 获得 sk_buff 就可以获取供您使用(sk_buff 保存数据包的信息,如数据,header)。

Netfilter 是不错的选择之一。它是一个数据包过滤框架(钩子集),当数据包遍历相应的钩子时会调用回调函数。 in-turn 可以让您根据需要对数据包进行分类/处理。

另请注意,某些处理器具有基于硬件的数据包处理/加速器模块,只需配置相应的输入端口即可将其配置为过滤感兴趣的数据包类型/协议。一些硬件模块还可以提取有效载荷的元数据并将其按照某些配置的 extraction/parsing 规则放入缓冲区,而无需用户进行任何干预。

这些是关于以太网帧的检索和处理的一些高级视图,请注意它与您的系统紧密结合architecture/design/driver。