我在netfilter LOCAL_IN钩子(Hook)中添加了函数,我想检测新连接所属的用户空间进程的pid,我该怎么办?
我可以通过检查 tcp_hashinfo 来获取 sk,但是 f_owner->pid 始终为 0。
顺便说一句:在LOCAL_OUT钩子(Hook)中,我可以通过当前指针获取pid。
最佳答案
这只是猜测,欢迎反驳。
在传入数据包上,如果它是 TCP SYN(因此不是事件连接的一部分),则它可能会转到由多个进程持有的套接字(例如,使用多个工作进程的 apache)。它可以被它们中的任何一个接受,因此不可能在 netfilter 代码中预测哪个 PID 将实际接受该数据包。
一旦建立了连接,您还可以 fork 一个程序并让两个进程同时打开句柄,这意味着数据可以发送到一个进程或另一个进程,甚至如果其中一个进程只读取数据包的一部分,甚至可以从中间拆分。
因此,Netfilter 无法真正知道哪个 PID 将实际接收任何给定数据包中的数据。
希望这有帮助,并且(主要)希望我没有误导!
关于linux - 如何获取将接收我在 netfilter LOCAL_IN Hook 中获得的数据包的进程的 pid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30689762/