【发布时间】:2014-07-03 13:13:51
【问题描述】:
我正在为 Linux 编写一个简单的应用层防火墙(现在没什么特别的,只是我需要的东西)。由于 iptables 的所有者模块不够用,我决定使用 libnetfilter_queue。在我的防火墙(C/C++ 应用程序)的某个时刻,我需要决定是否接受具有给定 src/dest 端口的数据包。现在问题来了。是否有任何简单/快速的方法可以知道哪个进程拥有给定端口?
基本上,我需要一个函数
pid_t port2pid(u_int16_t port)
似乎在用户空间中执行此操作的唯一方法是解析/proc 层次结构。我不想这样做,因为所有临时端口都可能很慢。内核必须在 TCP 堆栈中有某种映射端口-> 进程。是否有可能通过自定义内核模块来实现?也许有人可以为我指出完成相同任务的另一种方式?
【问题讨论】:
-
您可能也对 /proc/net/tcp 感兴趣,但您应该知道用户空间程序可以共享 fds,将它们相互传输并 dup() 它们,因此在内核中有可能是从 fd+pid 到内核文件描述符的映射,而不是相反。
-
我看过的所有其他答案似乎都没有提到
/proc/net。另外,我发现了ss实用程序,它的来源非常有趣。感谢您的提示。 -
不幸的是,
ss也会为套接字所有者解析/proc/*/fd/*。当数据到达给定端口时,内核如何知道将数据发送到哪个进程?一个套接字可能是共享的,但内核知道如何处理数据。我不敢相信它会按顺序查看每个流程。 -
这对于 SO cmets 来说太多了,甚至可能不适合 SO 问题,但请记住,要与内核交互,用户空间会通过使用 fd 参数启动任何操作,内核不会“发送”任何东西。
-
为什么节奏不对?我只是希望朝着正确的方向轻推。你是对的,用户空间开始发送,但是如果数据从网络到达怎么办(比如浏览器的 HTTP 回复)。那么端口号是实际进程等待数据的唯一链接。因此必须有一种方法将端口映射到进程。
标签: c++ linux-kernel network-programming netfilter