代码之家  ›  专栏  ›  技术社区  ›  ImranRazaKhan

如何在tcpdump中基于主题名过滤MQTT流量

  •  0
  • ImranRazaKhan  · 技术社区  · 4 年前

     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                                    . .(.
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Christopher Maynard    4 年前

    “但是它会在几分钟内产生非常大的文件,我可以根据主题名筛选tcpdump吗”

    如果您试图限制捕获文件的大小,那么先前接受的答案不会这样做,因为它使用与最初提供的完全相同的捕获筛选器,即 src 10.x.x.x tshark ,数据包被写入 暂时的 文件,它将继续增长,直到捕获会话终止,然后理想情况下,它将被删除,但并不总是这样。临时文件的位置因使用的平台而异 切克 运行,但您应该能够通过运行 tshark -G folders | grep "^Temp" .


    tcpdump 切克 命令行参数来实现这一点。

    首先,如果不需要整个有效负载,可以应用 斯内普伦 在适当的值之后缩短数据包。这是使用 -s 选项,两个捕获工具的选项相同。

    好的,但是不管您是否决定应用snaplen,如果您想基于特定的主题名称进行过滤,很可能您可以实现这一点;不过,我在下面列出了几个注意事项。主要思想是使用 操作员, [] (参见 pcap-filter 注意 :都不是 命令 本身也不 pcap-filter 接线员,但是 wireshark-filter 所以过滤器应该:

    • 只匹配特定主机的数据包,在本例中为10.x.x.x
    • 只匹配MQTT数据包(通常按端口号,我假设它是标准的tcp/1883端口)
    • 仅匹配主题长度为26字节的发布消息

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

    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)"
    

    从上面对所需过滤器的描述可以看出,过滤器的每个单独组件都在为您做什么。

    在这里,您将得到一个所需数据包的捕获文件,如果需要,您可以稍后引用该文件。您甚至可以将相同的过滤器应用于 切克 如果您愿意的话,解决方案也是一样,因为正如我前面解释的, 切克 正在将数据包写入文件,无论是否显式指定。

    注意事项:

    • 为了说明解决方案的简单性,过滤器假设TCP头为20字节,但情况可能并非如此。如果您想要一个更健壮的解决方案来容纳任何TCP头大小,那么您需要根据 数据偏移量 在筛选器中使用 ((tcp[12]&0xf0)>>4)*4 ,然后用该值替换切片操作符偏移字段中出现的每个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消息有效负载。

        2
  •  2
  •   Ross Jacobs    4 年前

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