我正在为Linux编写一个简单的应用程序层防火墙(暂时没什么特别的,只是我需要)。由于iptables的所有者模块不够,我决定使用libnetfilter_queue。在我的防火墙(C / C ++应用程序)中的某个时刻,我需要决定是否接受给定src / dest端口的数据包。现在问题来了。有没有简单/快速的方法来了解哪个进程拥有给定的端口?
基本上,我需要一个功能
pid_t port2pid(u_int16_t port)
似乎在用户空间中执行此操作的唯一方法是解析/proc
层次结构。我不想这样做,因为所有短暂的端口可能会很慢。内核必须在TCP堆栈中具有某种map port->进程。是否可以通过自定义内核模块实现这一目标?也许有人可以指出我完成同样任务的另一种方式?
答案 0 :(得分:1)
回答自己。
内核模块proc/net/tcp
提供文件tcp_diag
。它提供了所有TCP套接字及其状态的现成列表。
将套接字映射到进程的最佳方法是通过/proc/*/fd/*
中的文件描述符,因为套接字可能由许多同时使用它们的进程/线程共享。来自iproute2包的ss
实用程序的源代码是学习这些内容的好地方。