Linux kernel 我需要构建什么来直接访问内核级的以太网帧位?

Linux kernel 我需要构建什么来直接访问内核级的以太网帧位?,linux-kernel,network-programming,linux-device-driver,ethernet,Linux Kernel,Network Programming,Linux Device Driver,Ethernet,我想检索线路上所有以太网帧的以太网帧位,无论它们是否为我的机器指定(MAC级) 其逻辑必须在内核级别 因此,为了实现这一点,我需要构建一个独立的内核模块或以太网驱动程序或以太网网络接口 注意:我刚刚开始为我的项目学习Linux内核模块开发。如果不是发布此问题的合适位置,我很抱歉。对于接收发送给所有主机的帧,您必须将网络接口设置为混杂模式 要获取帧,可以使用不同的备选方案: PCAPAPI(库libpcap) 数据包套接字: 看看ebtables(我从未使用过它,所以在这一点上我不确定): 这里建

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

其逻辑必须在内核级别

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


注意:我刚刚开始为我的项目学习Linux内核模块开发。如果不是发布此问题的合适位置,我很抱歉。

对于接收发送给所有主机的帧,您必须将网络接口设置为混杂模式

要获取帧,可以使用不同的备选方案:

  • PCAPAPI(库libpcap)
  • 数据包套接字:
  • 看看ebtables(我从未使用过它,所以在这一点上我不确定):
  • 这里建议使用netfilter:
  • 如果您仍然想要破解内核,则不需要创建新的以太网设备驱动程序,只需编写一个内核模块,注册以接收从以太网设备驱动程序接收的帧。查看内核文件,您可以从函数开始:

    int netif_rx(struct sk_buff *skb)
    

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

    有非常好的工具可用于捕获和检索以太网帧。这些工具是tcpdump和wireshark。Tcpdump是命令行实用程序,而wireshark是基于GUI的实用程序。你可以用任何你觉得舒服的东西。有关此工具的更多信息,请参阅以下链接:


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

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

    Netfilter是一个很好的选择。它是一个数据包过滤框架(一组钩子),当数据包遍历相应的钩子时,将调用回调函数。这反过来又可以使您能够根据需要对数据包进行分类/处理

    另外,请注意,一些处理器具有基于硬件的数据包处理/加速器模块,这些模块可以配置为仅通过配置相应的输入端口来过滤感兴趣的数据包类型/协议。一些硬件模块还可以提取有效负载的元数据,并根据特定配置的提取/解析规则将其放入缓冲区,而无需用户进行任何干预


    这些是关于以太网帧的检索和处理的一些高级视图,请注意,它与您的系统架构/设计/驱动程序紧密相连。

    这方面的逻辑已经在内核级别实现。要使用它,请看一看libpcap和接口混杂模式,即“无论它们是否为我的机器指定(MAC级别)”。具有混杂模式的libpcap可以完成用户所需的一切。libpcap通过复制数据包而不是截取数据包来捕获帧。我希望能够接收线路上的所有帧,并将修改后的帧发送或重新注入NIC卡。libpcap复制数据包,但不会截获数据包。另一方面,我希望直接接收原始帧,并且能够将修改后的帧重新插入NIC卡。我认为使用pcap API是不可能的。@UtkalSinha,你是对的。如果你想拦截它,libpcap不是你需要的。内核,在我提到的级别,将把帧发送给每个注册接收它的函数。如果您不想让您的软件以外的任何人接收它,您将需要:1-修改设备驱动器2-修改netif_rx,3-检查注册函数是否可能返回表示不继续或“已使用”的值4-检查netfilter或ebtables。但是,为什么要将其重新插入NIC卡(在这种情况下,您需要设备驱动程序)?要修改并发回吗?是。我的意思是,如果有任何正在进行的传输,那么我应该能够检索以太网帧->修改以太网头->转发帧,如果我不想放弃它。那么我需要为它构建一个以太网设备驱动程序吗?或者一个简单的内核模块就足够了?这里有一个问题。如果两个不同节点之间存在传输,并且您的节点正在侦听同一帧,则您不能进行干扰,因为目标节点已在以太网级别接收到同一帧(这是您正在尝试做的吗?)。此外,如果有开关,您将不会收到该帧。除非您正在为交换机开发软件或介质为802.11。在发送以太网帧之前,发送方将广播ARP,如果我在该广播域中,则我可以通过回复ARP请求来获得帧。