哪个进程拥有给定端口(Linux内核)?

时间:2014-07-03 13:13:52

标签: c++ linux-kernel network-programming netfilter

我正在为Linux编写一个简单的应用程序层防火墙(暂时没什么特别的,只是我需要)。由于iptables的所有者模块不够,我决定使用libnetfilter_queue。在我的防火墙(C / C ++应用程序)中的某个时刻,我需要决定是否接受给定src / dest端口的数据包。现在问题来了。有没有简单/快速的方法来了解哪个进程拥有给定的端口?

基本上,我需要一个功能

pid_t port2pid(u_int16_t port)

似乎在用户空间中执行此操作的唯一方法是解析/proc层次结构。我不想这样做,因为所有短暂的端口可能会很慢。内核必须在TCP堆栈中具有某种map port->进程。是否可以通过自定义内核模块实现这一目标?也许有人可以指出我完成同样任务的另一种方式?

1 个答案:

答案 0 :(得分:1)

回答自己。

内核模块proc/net/tcp提供文件tcp_diag。它提供了所有TCP套接字及其状态的现成列表。

将套接字映射到进程的最佳方法是通过/proc/*/fd/*中的文件描述符,因为套接字可能由许多同时使用它们的进程/线程共享。来自iproute2包的ss实用程序的源代码是学习这些内容的好地方。