获取内核中套接字事件的通知

Get notifications for socket events in kernel

我需要为本地 tcp-connections/Unix-domain-connections 找到以最有效的方式启动连接的客户端进程。

我目前有一个在驱动程序中实现的解决方案,它拦截接受和连接系统调用,匹配它们,并找出客户端进程。

现在我尝试在没有我自己的驱动程序的情况下实现相同的

我尝试的不同方法:

  • Linux 审计系统插件,拦截适当的系统调用并以类似的方式解析客户端。这种方法有3个问题:
    1. 每个被截获的事件都从内核流向 auditd 进程,再流向其他一些中间进程,并且只流向我的插件。
    2. 审核规则适用于所有插件和审核日志 - 我无法定义自己的过滤规则集。 - 这可能会导致在使用审计系统的机器上效率极低。
    3. 它要求在机器上安装审核(对于许多 Linux 发行版来说这不是默认设置)。
  • 模仿netstat/lsof - 为了找到持有连接的进程,他们遍历整个procfs挂载 - 这是有道理的,因为连接建立后,每个连接可能属于多个进程。 如果我想为每个连接建立都这样做,这种方法是极其无效的。
  • 我想尝试其中一种 LSM(Linux 安全模块)解决方案 - 但我目前不熟悉它 - 他们的 LSM 是否可以为 运行 应用程序传递内核事件"decision"?

我很乐意听到建议和其他意见,它们可以引导我找到实现我最初目标的合理解决方案。

找到了一个仅适合我对 Unix 域套接字需求的选项 - 如果可以在服务器端运行代码(如我的情况),则可以按以下方式使用 getsockopt:

getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &len)

http://welz.org.za/notes/on-peer-cred.html

中有更多详细信息