我可以监视本地的unix域套接字,如tcpdump吗?


Answers:


15

有人声称可以通过创建一个充当两个套接字之间的网关并记录所有流数据的应用程序来做到这一点。因此,您无法在套接字上轻按,但如果您可以重新启动该服务并对其进行调整以使用此Guy应用程序,则可以看到所有流量。

这是文章的链接:Unix套接字嗅探器

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

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

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

祝好运


是的,您也可以使用socat来执行Middleman方法,但是我希望找到一种更直接的方法,而无需在其他地方修改现有设置。
ck_ 2012年

1
然后lsof和strace是我知道的唯一方法。当您从流程中分离strace时,请当心产品,并检查此后一切是否正常运行。
Valor 2012年

3
经过一些周围挖我发现的一些细节了类似的问题,为什么这是不能直接在计算器上stackoverflow.com/questions/8394613/...
ck_

80

您可以使用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

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


3
愿意添加更多解释吗?
卡扎尔克2013年

4
当原始的unix套接字在文件系统上具有路径时,这很容易。但是,如果它是您实际上无法移动的抽象名称空间Unix套接字,该怎么办?
Valerio Schiavoni

6

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

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


这对我来说效果很好,而且很容易做到。使用strace -p <pid>观看正在运行的进程。
马特·芒森

快速命令: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.log然后运行测试。您可以使用/tmp/php.log来缓慢检查日志是否太大。如果您的流量过多,请使用带有您的名字或其他名称的查询字符串进行请求,以便您可以在日志中进行搜索
higuita

1
@higuita我知道已经很长时间了,但是除了循环之外,您还可以printf处理重复。printf " -p %s" $(pidof php5-fpm)将为每个pid参数加上前缀,-p并且编写起来更加实用。
JoL

2
// 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

然后:

sudo tcpdump -i lo -netvv port 8089

埃尔马尼菲科!谢谢
typelogic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.