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