每次在我的Linux机器上创建新套接字时如何运行代码?

时间:2013-09-06 15:23:30

标签: c linux sockets unix tcp

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

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

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

编程代码为C.

5 个答案:

答案 0 :(得分:4)

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

1)使用审计子系统

您可以配置auditd和Linux审核子系统,以便每次发生任何系统调用时都记录消息。它将包括时间戳和调用进程。钩住连接()'和/或' 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,尽管一旦auditd由root配置,如果需要,日志可以由非root用户读取。我认为您希望尽可能使用auditd。 ip_conntrack界面起初看起来好一点,但是auditd可以免费获得你想要的所有信息,包括pid跟踪。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

获得inode之后,您可以通过扫描/proc/[pid]/fd目录找到打开该套接字的进程(可能有几个)。

答案 3 :(得分:0)

那么你应该可以使用nmap来查看linux机器上可用的开放套接字。例如,如果您碰巧创建服务器并将其绑定到端口号(例如9999),则nmap将显示该端口已打开。

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

答案 4 :(得分:0)

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

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