linux netfilter将数据包内容传递给用户空间套接字应用程序

linux netfilter将数据包内容传递给用户空间套接字应用程序,linux,linux-kernel,hook,netfilter,Linux,Linux Kernel,Hook,Netfilter,我想写一个Linux2.6netfilter模块,它可以检查传入的IP数据包信息,如dest IP、sourceip。之后,将这些信息传递给用户空间应用程序,该应用程序(即套接字应用程序)将在数据包到达挂钩时处理这些信息 我想尝试两种方法: 一,。在netfilter模块内部,制作一个fifo结构行,每次数据包到达hook,将数据包信息放入fifo。并借助于/proc/example文件系统。每次用户空间应用程序读取/proc/example文件时,都会从fifo头获取数据包信息 我是内核程序的

我想写一个
Linux
2.6
netfilter
模块
,它可以检查传入的
IP
数据包信息,如dest IP、sourceip。之后,将这些信息传递给
用户空间
应用程序,该应用程序(即
套接字
应用程序)将在数据包到达挂钩时处理这些信息

我想尝试两种方法:

一,。在
netfilter
模块内部,制作一个
fifo
结构行,每次数据包到达
hook
,将数据包信息放入fifo。并借助于
/proc/example
文件系统。每次用户空间应用程序读取
/proc/example
文件时,都会从fifo头获取数据包信息

我是
内核
程序的新手,这个程序使我的内核崩溃了好几次!
我想知道这条路可能吗

二,。在netfilter模块内部,制作一个char设备,用户空间应用程序从该char设备读取数据包信息。但我仍然不知道如何确保尽快获取数据包,当数据包到达netfilter钩子时,内核是否会向info user space app发送一些信号,然后user space app来提取数据包信息


非常感谢。

我不确定第一种方法,但使用第二种方法,您的用户空间应用程序可以使用select()调用,并将char设备作为唯一目标-只要select()返回,您就可以读取数据。只需确保阅读全部内容,而不只是假设一个数据包的价值。

你所说的尽快是什么意思?您是否有一些实际的硬/软实时要求

如果选择选项2,通过打开字符设备非阻塞并在读取fd上选择()ing,您应该能够相当快地获取新数据。我对内核级套接字做了类似的事情,其中套接字数据通过字符驱动程序呈现给用户级进程。只要我及时维修插座,我就很少看到延迟。这个驱动程序是在一个有一些软实时要求的环境中使用的,我们使用普通的内核工具来满足这些要求没有任何问题

看看Linux设备驱动程序,第三版。

我的做法: 创建一个内核模块以连接到您的网络活动。
然后使用Netlink,它可以从内核与用户空间通信,以传递数据IPC。

选项1是可行的,问题是什么?但是我通常使用
netlink
用户空间
内核空间
之间进行通信


您似乎只是在复制NFQUEUE+libnetfilter\u队列基础结构。
nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast