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

Which process owns the given port (Linux kernel)?

本文关键字:Linux 内核 进程 拥有      更新时间:2023-10-16

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

基本上,我需要一个函数
pid_t port2pid(u_int16_t port)

在用户空间中,似乎唯一的方法是解析/proc层次结构。我不想这样做,因为所有的临时端口可能会很慢。内核必须在TCP堆栈中有某种映射端口->进程。是否有可能通过定制内核模块来实现?也许有人能给我指出完成同样任务的另一种方法?

回答自我

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

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