2

我想写一个Linux2.6 netfilter module,可以检查传入的IP数据包信息,例如dest-ip,source-ip。之后将这些信息传递给应用程序,一旦数据包到达 HOOK ,user space应用程序(即应用程序)将处理这些信息。Socket

我想尝试两种方法:

1. 在netfilter模块内部,做一个fifostruct line,每次数据包到达时hook,将数据包信息放入fifo。并在/proc/examplefilesystem 的帮助下。每次用户空间应用读取/proc/example文件时,都会从fifo头获取一个数据包信息。

我是kernel程序的新手,这个程序使我的内核崩溃了好几次。-_-!我想知道这种方式可能吗?

2. 在 netfilter 模块内部,制作一个 char 设备,用户空间应用程序从这个 char 设备中读取数据包信息。但是我仍然不知道如何确保尽快得到数据包,有什么办法当数据包到达netfilter钩子时,内核会向info用户空间应用程序发送一些信号,然后用户空间应用程序来选择数据包信息?

非常感谢你。

4

4 回答 4

3

我的做法是:创建一个内核模块来连接你的网络活动。然后使用可以从内核与用户空间对话的Netlink来传递数据IPC。

于 2011-10-06T12:26:53.000 回答
2

选项 1 可行且可行 有什么问题?但我通常用来在user-spacekernel space使用之间进行通信netlink

netlink_kernel_create

netlink_kernel_release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast
于 2013-02-28T22:03:40.657 回答
1

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

于 2009-08-17T16:19:44.650 回答
1

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

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

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

于 2009-08-17T17:53:55.707 回答