【问题标题】:What do I need to build to directly access the Ethernet frame bits in the kernel level?我需要构建什么来直接访问内核级别的以太网帧位?
【发布时间】:2016-02-03 14:05:03
【问题描述】:

我想检索网络上所有以太网帧的以太网帧位,无论它们是否注定(MAC 级别)用于我的机器。

其逻辑必须在内核级别。

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

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

【问题讨论】:

  • 其逻辑已经在内核级别实现。要使用它,请查看 libpcap,以及关于“无论它们是否注定(MAC 级别)用于我的机器”的接口混杂模式。具有混杂模式的 libpcap 可以从用户空间完成您需要的一切。
  • libpcap 通过复制数据包而不是通过拦截数据包来捕获帧。我希望能够接收网络上的所有帧,并将修改后的帧发送或重新注入 NIC 卡。

标签: linux-kernel network-programming linux-device-driver ethernet


【解决方案1】:

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

为了获取框架,您可以使用不同的替代方案:

  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)

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

【讨论】:

  • libpcap 会复制数据包,但不会拦截数据包。另一方面,我想直接接收原始帧,并且我应该能够将修改后的帧重新插入 NIC 卡。我认为 pcap API 是不可能的。
  • @UtkalSinha,你是对的。如果你想拦截它,libpcap 不是你需要的。内核,在我提到的级别,会将帧发送到每个重新注册的函数以接收它。如果您不希望其他任何人但您的软件接收它,您将需要:1-修改设备驱动器 2-修改 netif_rx,3-检查注册函数是否可能返回一个值,这意味着不要继续或“已使用” 4-检查 netfilter 或 ebtables。但是为什么要在网卡中重新插入(这种情况下需要设备驱动)?修改并发送回去?
  • 是的。我的意思是,如果有任何正在进行的传输,那么我应该能够检索以太网帧->修改以太网标头->如果我想丢弃它,则转发该帧。那么我需要为它构建一个以太网设备驱动程序还是一个简单的内核模块就足够了?
  • 那里有问题。如果在 2 个不同节点之间进行传输,并且您的节点只是在侦听相同的帧,则您不能干扰,相同的帧已经被以太网级别的目标节点接收(这是您想要做的吗?)。此外,如果有开关,您将不会收到该帧。除非您正在为交换机开发软件或介质是 802.11。
  • 在发送以太网帧之前,发送者将广播 ARP,如果我在该广播域中,那么我可以通过回复 ARP 请求来获取帧。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    Netfilter 是值得尝试的好选择之一。它是一个数据包过滤框架(一组挂钩),当数据包遍历相应的挂钩时,会调用回调函数。这反过来又可以让您根据自己的要求对数据包进行分类/处理。

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 2016-09-06
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2020-03-04
      • 2014-03-02
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多