【问题标题】:How to run code every time a new socket is created on my Linux machine?每次在我的 Linux 机器上创建新套接字时如何运行代码?
【发布时间】:2013-09-10 18:11:26
【问题描述】:

每次在我的 Linux 服务器上创建新的 TCP 套接字时,我都需要调用一个函数。架构代码是:

do {
    new_socket = block_until_new_socket_created();
    do_something(new_socket);
} while (true);

问题是,在执行代码的 UNIX/Linux 服务器上创建新的 tcp 套接字时,是否会通知任何库/工具/函数?

编程代码是C。

【问题讨论】:

  • 如何调用套接字描述符的进程标识符。抱歉,如果不清楚。
  • 我什至不明白这是什么意思。
  • 您可以从内核端执行此操作,而无需更改其源代码。如果您有权将模块加载到服务器上的内核,则可以使用 kprobes 探测内部内核函数,该函数会创建新套接字。但这可能太多了(尽管它可能比听起来容易;))。
  • 感谢 Flow 的版本。
  • @nos 证明没有 Linux 库似乎是一项相当艰巨的任务

标签: c linux sockets unix tcp


【解决方案1】:

我认为您不会收到创建套接字的通知。您可以做的是通过阅读/proc/net/tcp 定期检查打开的套接字。该文件中的一列是套接字的“inode”。

一旦有了 inode,您就可以通过扫描/proc/[pid]/fd 目录找到打开该套接字的进程(可能有多个)。

【讨论】:

  • 使用libpcap之类的网络嗅探器可以获得一种通知。附加到所有接口并使用 SYN 标志跟踪数据包。获得 SYN+ACK 意味着客户端的连接成功或服务器端的临时分配(并且正在进行的 ACK 最终确定它)。这不完全是 socket 创建案例,而是连接创建案例,但对于主题启动器也可能有用。
【解决方案2】:

你应该可以使用 nmap 来查看你的 Linux 机器上可用的开放套接字。例如,如果您碰巧创建了一个服务器并将其绑定到一个端口号,比如 9999,nmap 将显示该端口是打开的。

我认为套接字服务器不可能获取 PID...但是,您可以使用“top”命令使用该套接字获取程序的 PID。

【讨论】:

    【解决方案3】:

    如果感兴趣的套接字由 inetd 管理,那么您可以修改它以在它接受新连接时触发您的事件。

    但是,如果您还想使用套接字和绕过 inetd 的套接字,则需要使用其他答案中提出的方法。

    【讨论】:

      【解决方案4】:

      我不知道这在“普通程序”中是否可行,但您可以编写一个自己的内核模块来“挂钩”在创建套接字时调用的相关系统调用(我认为是sys_socket,但我不确定这一点)。但正如@Zoska 指出的那样,您需要加载内核模块的特权。

      “挂钩”意味着(基本上)您将原始调用重定向到您自己的自定义函数 - 反过来 - 可以调用 original 系统调用并在之前和之后执行操作,以便您可以让你的函数通知你的程序。 Here 是关于系统调用挂钩的一些信息。

      【讨论】:

        【解决方案5】:

        老问题,但至少有两种方法可以做到这一点:

        1) 使用审计子系统

        您可以配置 auditd 和 Linux 审计子系统,以便在每次发生任何系统调用时记录一条消息。它将包括时间戳和调用过程。挂钩“connect()”和/或“bind()”的东西应该可以为您提供套接字所需的东西。这就是 auditd 的设计初衷。

        2) 使用 ip_conntrack (netfilter/ip_tables)

        使用类似 libnetfilter-conntrack 库(使用 ip_conntrack 内核模块)之类的东西会根据需要通知您所有带有过滤的新套接字。但是,它只会告诉您本地和远程地址/端口和时间戳,而不是 inode。这意味着要将其与pid相关联,您必须首先从conntrack读取通知,然后解析/proc/net/{tcp/udp/whatever}文件中的文件以找到套接字和inode,然后解析所有 /proc/$pid/fd/* 文件以找出哪个 pid 拥有该 inode。 在每一步中,您都必须希望在您读取该三步过程中的文件时套接字还没有消失。此类系统由 netsniff-ng utils 包中的 flowtop 使用。

        所有系统都需要 root,尽管一旦 root 配置了 auditd,如果您愿意,非 root 也可以读取日志。我认为您希望尽可能使用 auditd 。 ip_conntrack 界面一开始似乎更好一些,但 auditd 可以免费获得所有你想要的信息,包括 pid 跟踪。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多