【问题标题】:Which process owns the given port (Linux kernel)?哪个进程拥有给定的端口(Linux 内核)?
【发布时间】: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


【解决方案1】:

回答自己。

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

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

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2017-04-18
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    相关资源
    最近更新 更多