7

I need to call a function every time a new TCP socket is created at my Linux server. The schema code is:

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

The question is, is there any library/tool/function to be notified when a new tcp socket is created at the UNIX/Linux server where the code is being executed?

The programming code is C.

4

5 回答 5

6

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

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 跟踪。

于 2014-05-08T03:30:01.630 回答
3

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

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

于 2013-12-22T18:03:38.557 回答
1

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

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

于 2013-09-06T15:52:54.140 回答
0

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

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

于 2013-12-22T17:21:40.417 回答
0

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

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

于 2013-09-06T15:53:54.253 回答