嗅探 UNIX 域套接字

blu*_*ast 10 linux socket

我知道某个进程正在写入某个 unix 域套接字 ( /var/run/asterisk/asterisk.ctl),但我不知道发件人的 pid。我怎样才能找出谁在写套接字?我试过:

sudo lsof /var/run/asterisk/asterisk.ctl
Run Code Online (Sandbox Code Playgroud)

但它只是列出了套接字的所有者。我想知道谁在写/读这个套接字,我也想嗅探数据。这可能吗?

Mic*_*ton 12

是的,你可以这样做。您只需要 systemtap。

考虑一个示例 systemtap 脚本,它将打印读取或写入指定 inode 的任何程序的 PID 和进程名称(而您的 Unix 域套接字就是这样的东西)。

您可以简单地修改此脚本以打印正在读取/写入的实际数据;我将把它作为练习留给读者。


Sco*_*ack 5

简短的回答是否定的,也不容易。

在 Linux 上,lsof 依赖于/proc/net/unix检索有关 UNIX 域套接字的信息。该界面列出了所有的束缚插座,但它并没有跟踪端点。因此,您可以看到存在哪些套接字,但无法看到连接到它们的内容。某处此信息追踪,它必须被跟踪或者插座的连接是行不通的。我还没有找到任何机制来检索连接信息。

嗅探问题稍微有趣一些,但同样令人失望。我所说的“不容易”的意思是不存在任何可以潜入并获取该数据的钩子。最接近的模拟是使用 tcpdump 或 Wireshark,两者都使用 libpcap 来实际完成繁重的工作。虽然网络 (AF_INET) 和 UNIX 域 (AF_UNIX) 都是使用socket()函数调用创建的,但都用于connect()连接、使用read()write()处理数据,它们由不同的内核子系统处理。这有一个不幸的副作用,即 libpcap 并非设计为与 UNIX 域套接字一起使用。

这个问题有一个稍微不那么暗淡的一面。查看recv(2). 这是一个使用的较低级别的系统调用read()。存在一个标记为recv()called MSG_PEEK。这将允许您嗅探通过 UNIX 域套接字的流量。所以这是好的一面,坏的一面是,据我所知,目前不存在任何旨在执行此操作的应用程序。所以你正在考虑一些开发工作。

我真的希望有F'YEAH的一个不错的简单回答你的问题的两个部分。


小智 5

我知道这并没有回答主要问题,但我已经结束了,只是在套接字上寻找嗅探通信。我决定为像我这样的人发帖。这是我如何做到的:

$> sudo socat -t100 -x -v UNIX-LISTEN:/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/php5-fpm.sock

您可以删除 -x 并保留 -v 进行 ascii 通信。希望能帮助某人。