我可以监视像 tcpdump 这样的本地 unix 域套接字吗?

ck_*_*ck_ 76 unix domain sockets tcpdump

我想在不干扰原始连接的情况下监视 unix 套接字上的响应,并将它们通过管道传输到脚本进行处理。

我知道如何使用 tcpdump 进行 tcp 连接,但我似乎找不到本地 unix 套接字的解决方案。

这甚至可能吗?

小智 97

你可以使用socat。

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original
Run Code Online (Sandbox Code Playgroud)

上面发生了什么:首先将原始套接字移动到 sock.original。Socat 在原始位置创建一个新套接字('UNIX-LISTEN')并将所有内容转发到原始位置('UNIX-connect')。-v 告诉 socat 也将输出打印到 STDERR。

  • 当原始的 Unix 套接字在文件系统上有一个路径时,这很容易。但是,如果它是一个您实际上无法移动的抽象命名空间 unix 套接字呢? (4认同)
  • 小心添加更多的解释? (3认同)

小智 17

有一个人声称通过创建一个应用程序作为两个套接字之间的网关并记录所有流动的数据来做到这一点。所以你不能点击套接字,但如果你可以重新启动服务并调整它以使用这个家伙应用程序,你将能够看到所有流量。

这是帖子的链接:Unix Socket Sniffer

还有一种方法需要您找到附加到套接字的进程 id,然后使用 lsof 查找套接字的文件描述符,然后使用 strace 敲击文件描述符。

如果您可以停止使用套接字的任何客户端/服务器并重新配置它,我总是推荐第一种方法,第二种方法很棘手,需要您点击当前进程,这在某些应用程序上可能会导致它崩溃。

希望有人用另一种方式启发我们:)

祝你好运

  • 经过更多的挖掘,我发现了一个类似的问题,其中包含一些关于为什么不能直接在 stackoverflow http://stackoverflow.com/questions/8394613/watchdog-monitoring-unix-domain-socket-triggering-events-upon 上进行的详细信息-特定内容 (3认同)

小智 8

您也可以尝试在套接字任一侧的一个进程上使用 strace,因为这可以让您查看写入/读取的内容。我发现在我的生产环境中,我没有 socat,但有 strace。

对于任何有用的目的,必须将 -s 设置为大值。


小智 8

// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089
Run Code Online (Sandbox Code Playgroud)

然后:

sudo tcpdump -i lo -netvv port 8089
Run Code Online (Sandbox Code Playgroud)