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

时间:2009-08-17 16:12:12

标签: linux linux-kernel hook netfilter

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

我想尝试两种方式:

1。在netfilter模块内部,创建fifo结构线,每次数据包到达hook时,将数据包信息放入fifo。并在/proc/example文件系统的帮助下。每次用户空间应用程序读取/proc/example文件时,都会从fifo头部获取数据包信息。

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

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

非常感谢。

4 个答案:

答案 0 :(得分:3)

我这样做的方式: 创建一个内核模块以吸引您的网络活动。 然后使用Netlink,它可以从内核与用户空间通信,传递数据IPC。

答案 1 :(得分:2)

选项1是可行的,可行的是什么问题?但我通常使用user-space

kernel spacenetlink之间进行通信

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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