嗅探UNIX域套接字

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

 sudo lsof /var/run/asterisk/asterisk.ctl 

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

简短的答案是不,也不容易。

在Linux上,lsof依靠/proc/net/unix来检索有关UNIX域套接字的信息。 这个接口列出了所有绑定的套接字,但是它并没有跟踪端点。 所以你可以看到什么套接字存在,但你不能看到连接到他们。 在这个信息跟踪的地方,它必须被跟踪,否则套接字连接将不起作用。 我还没有find任何机制来检索连接信息。

嗅探的问题稍微有趣一点,但同样令人失望。 我所说的“不容易”的含义是,没有任何潜入和抓取数据的钩子。 最接近的模拟是使用tcpdump或Wireshark,两者都使用libpcap来实际执行繁重的工作。 虽然networking(AF_INET)和UNIX域(AF_UNIX)都是使用socket()函数调用创build的,但都使用connect()来连接,都使用read()write()来处理数据,它们由不同的内核子系统。 这具有不幸的副作用,即libpcap不能用于UNIX域套接字。

这个问题稍微有些暗淡一些。 看看recv(2)的手册页。 这是read()使用的较低级别的系统调用。 recv()存在一个名为MSG_PEEK的标志。 这将允许您嗅探通过UNIX域套接字的stream量。 所以这是光明的一面,而我所知道的最糟糕的一面是,目前没有任何应用程序可以做到这一点。 所以你正在看一些发展的努力。

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

是的,你可以做到这一点。 所有你需要的是systemtap。

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

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

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

$> 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通信。 希望能帮助别人。