1、抓包命令:
tcpdump -i any -n -w mqtt_packets.pcap 'tcp port 1883'
或者
tcpdump -i any -n -w /tmp/$(date +%Y%m%d_%H%M%S).pcap 'tcp port 1883'
解释:
-
-i any
表示在所有网络接口上抓包。 -
-n
表示不解析主机名(加速抓包过程)。 -
'tcp port 1883'
是 tcpdump 的过滤表达式,表示只抓取目标或源端口为 1883 的 TCP 数据包。MQTT 默认端口是 1883。 -
-w
参数, 将抓取的数据包保存到文件中mqtt_packets.pcap或者以当前年月日为标题的文件中,格式如"20240826_152954.pcap",文件名还可以带路径。
2、举例说明:
抓包命令如下图所示,tcpdump在/usr/sbin目录下,并且具有足够权限,全下如下图所示:
使用上述命令会进行抓包,想停止抓包,直接按键盘ctrl+c即可;
即会在当前目录下生成抓包文件,如下图所示:
把文件下载下来,可以用wireshark打开并进行过滤,可以使用mqtt直接过滤,看到topic的具体描述,如下图所示:
3、注意事项
有时候明明很确认网卡上有包,但是tcpdump就是抓不到那些包,则可能是发送包是SSL加密的,但是tcpdump没有对SSL的支持;如要使用tcpdump抓取SSL加密的数据包,你需要确保tcpdump编译时包含了对SSL的支持。
在Linux中,要检查一个进程是否包含SSL支持,可以通过检查进程的内存映射来查看是否加载了SSL库,如libssl
。你可以使用cat
命令配合/proc
文件系统来查看进程的内存映射。以下是一个示例命令,用于检查PID为1234
的进程是否加载了SSL库:
cat /proc/1234/maps | grep libssl
如果该命令返回了包含libssl
字样的行,那么表示该进程包含对SSL的支持。
举例如下,如图可知系统中的tcpdump不支持SSL加密,而CspBu_client包含对SSL的支持。
若你的tcpdump支持SSL,并且你有SSL流量的私钥,则可以使用如下命令抓取数据包, 你可以使用tcpdump
的-r
选项来指定一个密钥文件,其中/path/to/keyfile.pem
是私钥文件的路径:
tcpdump -i any -w /tmp/mqtt_$(date +%Y%m%d_%H%M%S).pcap -r /path/to/keyfile.pem 'tcp port 1883'