linux - 如何获取将接收我在 netfilter LOCAL_IN Hook 中获得的数据包的进程的 pid?

标签 linux module kernel netfilter

我在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/

相关文章:

linux - Oracle 无法读取全局可访问 (777) 转储文件

python - 重定向 Python 解释器的 IO

linux - 将linux内核实现为路由器

linux - 如何将静态网站副本的 URL 缩短为少于 256 个字符? (使用 wget 创建)

linux - FileNotFoundError:[Errno 2]推送到heroku之后

linux - 如何通过SLIP、串口向wifi模块发送命令?

module - FORTRAN 95 : is it possible to share a module without sharing the source code?

python - 扩展特定版本的 Python(在 Linux Ubuntu/Unity 上)

c - 我如何通过网络代理 mmap 读取和写入?

linux - Netlink 套接字,libnl - - nl_recvmsgs_default 返回 -22