首页 > 解决方案 > 如何根据 tcpdump 中的主题名称过滤 MQTT 流量

问题描述

我正在使用以下命令捕获 MQTT 流量以进行故障排除

 tcpdump -i team0 -w mqtt-trace.pcap src 10.x.x.x

但它会在几分钟内产生非常大的文件,我可以根据主题名称过滤 tcpdump

以下是 tcp 有效负载,我希望它只捕获具有PKGCTRL/1/status/frequency或者如果 tcpdump 可以直接支持应用层协议(如wireshark)上的过滤器的有效负载mqtt.topic == PKGCTRL/1/status/frequency

0000   00 13 95 36 2e ef 00 10 7e 07 87 3d 08 00 45 00   ...6....~..=..E.
0010   00 77 2e 0d 40 00 40 06 f6 78 0a 0b 80 f3 0a 0b   .w..@.@..x......
0020   80 f2 c3 6a 75 83 e4 f8 f7 7a 0a 89 67 76 50 18   ...ju....z..gvP.
0030   ea 60 59 f8 00 00 30 4d 00 1a 50 4b 47 43 54 52   .`Y...0M..PKGCTR
0040   4c 2f 31 2f 73 74 61 74 75 73 2f 66 72 65 71 75   L/1/status/frequ
0050   65 6e 63 79 0a 11 09 c2 7a 85 14 d0 71 37 16 12   ency....z...q7..
0060   06 08 01 10 01 18 00 12 1c 0a 0d 09 0b 46 25 75   .............F%u
0070   02 f2 48 40 10 21 18 00 11 00 60 76 14 d0 71 37   ..H@.!....`v..q7
0080   16 20 00 28 00                                    . .(.

标签: mqttwiresharktcpdump

解决方案


正如@hardillb 建议的那样,请改用 tshark 。由于 tshark 的架构,你不能同时写一个文件作为一个显示过滤器(它会太慢)。

要获取您需要的信息,它看起来像这样

$ tshark -i team0 -f "src 10.x.x.x" \
  -Y "mqtt.topic == PKGCTRL/1/status/frequency" -T fields -e mqtt.topic
  • -i team0: 过滤界面team0
  • -f "src 10.x.x.x": 使用捕获过滤器,和 tcpdump 的过滤一样。这将加快处理速度,因为它比显示过滤器(下一个项目符号)更快。
  • -Y "mqtt.topic == PKGCTRL/1/status/frequency":过滤与此显示过滤器匹配的数据包
  • -T fields -e mqtt.topic:只输出mqtt.topic字段,因为那是目标信息。

-T fields将输出由换行符垂直分隔的列数据。它不会被水平分隔,因为只有列,但默认是\t.


推荐阅读