【问题标题】:How to filter MQTT traffic on base of topic name in tcpdump如何根据 tcpdump 中的主题名称过滤 MQTT 流量
【发布时间】:2020-10-04 10:24:55
【问题描述】:

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

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

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

下面是tcp有效载荷,我希望它只捕获具有PKGCTRL/1/status/frequency的有效载荷,或者如果tcpdump可以直接支持应用层协议上的过滤器,如wiresharkmqtt.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                                    . .(.

【问题讨论】:

  • 你试过使用tshark命令行版本的wireshark吗?
  • 使用某种 MQTT 客户端可能会更好,因为它更适合仅捕获主题和有效负载。那里有很多可供选择。我自己做了一个学习实验:github.com/john2exonets/MQTT-Packet-Monitor

标签: mqtt wireshark tcpdump


【解决方案1】:

我认为先前接受的答案不一定会按照您的想法执行,甚至可能不会按照您的意愿执行。最初的问题是,“但它会在几分钟内产生非常大的文件,我可以根据主题名称过滤 tcpdump”

如果您尝试限制捕获文件的大小,那么之前接受的答案并没有这样做,因为它使用与最初提供的完全相同的捕获过滤器,即src 10.x.x.x。这意味着您正在捕获与以前相同数量的数据。仅仅因为没有指定捕获文件名并不意味着数据包没有被写入文件;他们是。在tshark 的情况下,数据包被写入一个临时文件,该文件将继续增长,直到捕获会话终止,然后理想情况下它将被删除,但并非总是如此。临时文件的位置因运行tshark 的平台而异,但您应该可以通过运行tshark -G folders | grep "^Temp" 轻松找到该目录。


现在,如果您想减小捕获文件的大小或您看到的数据包数量,那么您应该能够修改tcpdumptshark 命令行参数来实现这一点。

首先,如果您不需要整个有效负载,您可以应用 snaplen 在一些适当的值后缩短数据包。这是使用-s 选项完成的,这对于任一捕获工具都是相同的选项。

好的,但是无论你决定是否应用 snaplen,如果你想根据特定的主题名称进行过滤,很可能你可以做到这一点;但是,我在下面列出了一些注意事项。主要思想是使用 slice 运算符 [](参见 pcap-filter 手册页)将 TCP 有效负载的各个字节与特定值进行比较。 (注意tcpdump 本身和 pcap-filter 都没有将此运算符称为 slice 运算符,但 wireshark-filter 确实如此,所以我也这样做。)所以过滤器应该:

  • 仅匹配发往/来自特定主机的数据包,在本例中为 10.x.x.x
  • 仅匹配 MQTT 数据包(通常按端口号,我假设它是标准 tcp/1883 端口)
  • 仅匹配具有 QoS 0 的 PUBLISH 消息
  • 仅匹配主题长度为 26 字节的 PUBLISH 消息
  • 仅匹配主题为“PKGCTRL/1/status/frequency”的 PUBLISH 消息

这是一个应该工作的命令(至少在大多数情况下 -> 请参阅下面的注意事项):

tcpdump -i team0 -w mqtt-trace.pcap \
    "(src host 10.x.x.x) and \
    (tcp port 1883) and \
    ((tcp[20]&0xf6)=0x30) and \
    (tcp[22:2]=26) and \
    (tcp[24:4]=0x504b4743 and tcp[28:4]=0x54524c2f and \
     tcp[32:4]=0x312f7374 and tcp[36:4]=0x61747573 and \
     tcp[40:4]=0x2f667265 and tcp[44:4]=0x7175656e and tcp[48:2]=0x6379)"

从上面对所需过滤器的描述中应该可以清楚地看到过滤器的每个单独组件为您做什么。

在这里,您将获得所需数据包的捕获文件,如果需要,您可以稍后参考。如果您愿意以及写入命名的捕获文件,您甚至可以将相同的过滤器应用于tshark 解决方案,因为正如我之前解释的,tshark 正在将数据包写入文件,无论您是否明确指定。

注意事项:

  • 为简单说明解决方案,过滤器假定 TCP 标头为 20 字节,但情况可能并非如此。如果您想要一个更健壮的解决方案来适应任何 TCP 标头大小,那么您需要从 TCP 标头的 数据偏移量 字段确定 TCP 标头大小,这在过滤器中使用 @ 完成987654337@,然后用该值替换切片运算符的偏移字段中每次出现的 20。比如tcp[22:2]=26变成tcp[(((tcp[12]&0xf0)>>4)*4)+2:2]=26等等

  • 因为 MQTT 剩余消息长度字段是根据MQTT3.1.1 section 2.2.3 Remaining Length 进行可变长度编码的,所以上面提供的过滤器仅适用于剩余长度字段从 0 到 127 的值,即剩余长度字段 只能是一个字节。鉴于本例中的主题为 26 字节,主题长度本身为 2 字节,这意味着过滤器仅适用于 99 字节或更少 (127 - (2 + 26)) 的 MQTT 消息负载。

【讨论】:

  • 非常感谢您的详细回答,是的,我确认它正在 /tmp 目录中创建临时文件。
  • 这是一个很好而彻底的答案(通常)。您的回答不清楚为什么要将 MQTT 主题分成 4 个字节。这是 tcpdump 要求的吗?
  • “您的回答不清楚为什么要将 MQTT 主题分成 4 个字节。tcpdump 是否需要这样做?”是的。您不能将任意长度放入诸如 tcp[40:4]=0x2f667265 之类的表达式中 - 比较必须是 1、2 或 4 个字节。
  • 虽然 “比较必须是 1、2 或 4 个字节。”,我认为可能缺少的是 pcap-filter 手册页中的明确文档。我什至不知道我是怎么知道的,因为我不记得我第一次从哪里学到的。也许 slice 不是用于此运算符的最佳名称,因为它与捕获过滤器有关,因为 Wireshark 的切片运算符确实允许任意长度,因此语义不同?不过我不知道还能叫什么。
  • 显然 pcap-fitler 手册页中有明确的文档,我只是忽略了它,因为我的眼睛之前正在扫描数字,而数字只是用文字写出来。以下是手册页中的相关文本: Size 是可选的,表示感兴趣字段中的字节数;它可以是一、二或四,默认为一。.
【解决方案2】:

正如@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2023-02-22
    • 2021-10-29
    相关资源
    最近更新 更多