是否可以下载数据包

时间:2017-03-21 21:22:22

标签: linux sockets kernel packets

我正在尝试在Linux(Ubuntu)用户空间中编写某种非常基本的数据包过滤。

是否可以使用原始套接字(AF_PACKET)通过c程序下载用户空间中的数据包,而无需任何内核干预(如编写内核模块)和网络过滤?

非常感谢

塔利

2 个答案:

答案 0 :(得分:1)

有可能(假设我明白你要问的是什么)。有许多"零拷贝"驱动程序实现,允许用户空间获得一个大的内存映射缓冲区,其中(/来自)数据包直接DMA&#d; d。

这几乎排除了内核处理那些相同的数据包(可能但非常难以正确协调用户空间数据包嗅探与相同数据包的内核处理)。但是,如果您正在创建自己的IDS / IPS或其他任何不需要"终止"本地机器上的连接。

肯定是标准的AF_PACKET;你必须创建自己的或使用现有的实现:查看netmap,DPDK和PF_RING(可能PF_RING / ZC?不确定)。我在以前的职业生涯中从事了几项专有实施工作,所以我知道这是可能的。

基本思想是(1)完全复制驱动程序负责的所有内容 - 也就是说,将驱动程序实现完全移动到用户空间(DPDK基本上这样做)。这在纸面上是直截了当的,但是很多工作并且使驱动程序几乎完全自定义。

或(2)修改驱动程序源,以便关键网络缓冲区分配请求通过用户空间进程满足 mmap&#d; dd的地址。然后,您会遇到在用户空间和内核之间传递缓冲区生命周期/引用计数的问题。这非常混乱,但可以完成,整体工作可能较少。 (我不知道 - 如果你足够聪明的话,可能有办法让后一种方法自动化 - 我在这个领域已经有好几年了。)

无论你走哪条路,你都需要将几件作品放在一起才能做到这一点。例如,如果您想要真正的高性能,则需要使用适配器" RSS"键入机制将流量分成多个队列并将每个队列固定到特定的CPU - 然后确保相应的应用程序组件固定到同一个CPU。

所有这一切,除非您的需求非常严重,否则您最好使用普通的AF_PACKET。

答案 1 :(得分:0)

您可以使用iptable规则丢弃给定条件的数据包,但不能使用数据包筛选器丢弃,因为数据包筛选器会在原始数据包流经通常路径时获取数据包的副本。