![如何实时查看应用程序网络协议通信](https://linux22.com/image/531876/%E5%A6%82%E4%BD%95%E5%AE%9E%E6%97%B6%E6%9F%A5%E7%9C%8B%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E9%80%9A%E4%BF%A1.png)
我想实时查看客户端-服务器应用程序使用的协议。我对任何统计数据都不感兴趣。我只想查看服务器和客户端发送的消息。如果有帮助的话,这是 FreeBSD 特有的。经过一番谷歌搜索,我发现 tcpdump 是正确的选择。所以我尝试在我的服务器上运行它,但无法缩小特定于我的应用程序的数据包内容。它是一堆实时滚动的文本。我的应用程序的实际通信并没有那么繁重,当它显示在终端上时不会丢失跟踪。
我想我可能没有提供足够的信息。如果需要的话请添加评论。我会很快回复。
非常感谢任何帮助或指点。
答案1
您可以轻松过滤 tcpdump 捕获的数据包。我假设您知道应用程序在哪个端口上进行通信?例如,假设您想要捕获端口 12345 上的所有流量。然后您可以运行:
$ tcpdump port 12345
或者,您可以捕获到文件,然后稍后使用 GUI 工具打开Wireshark:
$ tcpdump -s0 -w packets.log port 12345
答案2
您需要进行一些过滤,以将 tcpdump 限制为您想要的数据。例如,只查找涉及主机 a 和主机 b 的流量
tcpdump $options host a and host b
我通常在 tcpdump 中使用 -n、-X、-vv 和 -s0 选项。您还可以根据端口和许多其他内容进行过滤。要查看主机 a 和主机 b 之间的 smtp 对话,您可以像这样运行 tcpdump:
tcpdump -n -X -vv -s0 host a and host b and port smtp
这将限制显示的数据为涉及 ldap 端口、主机 a 和主机 b 的数据。如果缺少这 3 个中的任何一个,则不会显示。手册页将包含有关过滤的更多信息。
希望这对你有帮助,Rik
答案3
如果协议是基于文本的(例如 HTTP、SMTP 等),我喜欢ngrep。它使用libpcap
类似的tcpdump
东西,因此过滤语法是相同的。不同之处在于它的输出旨在显示数据包负载,并且它将允许您将输出限制为与正则表达式匹配的数据包。
例如,要查看邮件投递尝试,您可以执行以下操作:
ngrep -d eth0 -qlM -s 0 -W byline '^MAIL FROM:|^RCPT TO:' 'tcp port 25'