我怎样才能得到一个进程的pid,它将收到我在netfilter LOCAL_IN钩子中得到的数据包?

时间:2015-06-07 03:28:35

标签: linux module kernel netfilter

我添加了添加到netfilter LOCAL_IN钩子的函数,我想检测新连接所属的用户空间进程'pid,我该怎么办?

我可以通过检查tcp_hashinfo获取sk,但f_owner-> pid始终为0.

btw:在LOCAL_OUT钩子中,我可以通过当前指针获得pid。

2 个答案:

答案 0 :(得分:0)

这是猜测,随意反驳我。

在传入数据包上,如果它是TCP SYN(因此不是活动连接的一部分),它可以转到由多个进程持有的套接字(例如,使用多个工作进程的apache)。它可以被任何一个接受,因此不可能在netfilter代码中预测哪个PID实际上会接受该数据包。

一旦建立了连接,你也可以分叉一个程序并让两个进程同时打开句柄,这意味着数据可以转到一个进程或另一个进程,或者甚至拆分中间的一个进程他们只读取部分数据包。

因此,Netfilter没有真正的方法知道哪个PID实际上会在任何给定的数据包中接收数据。

希望这会有所帮助,并且(大部分)希望我没有误导!

答案 1 :(得分:0)

我同意@Joel C&s说的话。 LOCAL_IN中的current宏始终为NULL。但对于TCP连接,我认为可能有一个小技巧可用于检测哪个进程接收传入数据包。

LOCAL_OUT挂钩一起设置LOCAL_IN挂钩。在内核中维护全局数据结构。当LOCAL_IN挂钩收到数据包时,将数据包IP,端口,序列号和数据包长度存储在全局数据结构中。由于您使用的是TCP,因此接收器需要发送一个ack,因此肯定会有一个传入的数据包。在LOCAL_OUT挂钩中,您可以使用传出数据包的确认号在全局数据结构中进行搜索。然后,您将能够将先前的传入数据包与进程ID相关联。