- Wireshark抓取ws上的mqtt报文
- 1. 概述
- 2. 安装
- 2.1 安装Wireshark
- 2.2 安装插件
- 3. 使用指南
- 3.1 捕获
- 3.2 分析
1. 概述
本文档记录,如何使用Wireshark抓包工具,抓取基于Websocket
的MQTT报文。
Wireshark是一个免费开源的网络抓包工具,新版的Wireshark是可以直接抓取基于TCP的MQTT报文,而基于Websocket
的报文,需要通过插件来实现。
2. 安装
2.1 安装Wireshark
下载,直接安装最新版本就好:
https://www.wireshark.org/#download
安装中有一步骤提示,使用nacp代替winnacp;勾选上,这样Wireshark才能解析127.0.0.1
这样的环回地址。
2.2 安装插件
- 首先在电脑上新建一个
mqttws.lua
的文件,将以下代码添加进去:
local mqttws = Proto("mqttws", "MqttOnWebsocket");
local f_proto = ProtoField.uint8("mqttws.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("mqttws.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("mqttws.text", "Text")
mqttws.fields = { f_proto, f_dir, f_text }
wsField = Field.new("websocket")
wsDataField = Field.new("data.data")
pParsed = {}
pMqttMsgIndex = {}
mqttMsgTable = {}
mqttMsgIndex = 0
function mqttws.dissector(tvb, pinfo, tree)
if wsField() ~= nil then
local dataField = wsDataField()
if dataField ~= nil then
if pParsed[pinfo.number] == nil then
pParsed[pinfo.number] = true
local mqttData = mqttMsgTable[mqttMsgIndex]
if mqttData == nil then
mqttData = dataField.range:tvb():bytes()
else
mqttData:append(dataField.range:tvb():bytes())
end
mqttMsgTable[mqttMsgIndex] = mqttData
if mqttData:len() >= 2 then
local mqttMsgLength = tonumber(mqttData:get_index(1)) 2
if mqttMsgLength <= mqttData:len() then
pMqttMsgIndex[pinfo.number] = mqttMsgIndex
mqttMsgIndex = mqttMsgIndex 1
end
end
end
local msgIndex = pMqttMsgIndex[pinfo.number]
if msgIndex ~= nil then
local mqttData = mqttMsgTable[msgIndex]
local mqttTvb = ByteArray.tvb(mqttData, "Reassembled mqtt data")
local mqtt = Dissector.get("mqtt")
mqtt:call(mqttTvb, pinfo, tree)
end
end
end
end
register_postdissector(mqttws)
--local websocket = Dissector.get("websocket")
--local tcp_dissector_table = DissectorTable.get("tcp.port")
--tcp_dissector_table:add(9001, websocket)
--local ws_dissector_table = DissectorTable.get("ws.protocol")
--ws_dissector_table:add("mqtt", mqttws)
- 找到
C:Program FilesWiresharkinit.lua
文件(如果没有改默认安装目录),在文件的最后加一行代码:
dofile("你保存的路径\mqttws.lua")
- 重启Wireshark
3. 使用指南
Wireshark抓包分析,通常分为两步,第一步捕获, 第二步分析。二者有对应不同的选择器不要搞混了。
3.1 捕获
- 先选择数据流经的网卡,进行抓包:
这里我选择了Adapter ....
环回地址的网卡,因为我的服务跑在本机上;使用的捕获工具port 8001
,因为mqtt服务的websocket工作在此端口上。
- 选择开始,就进入捕获模式:
3.2 分析
- Wireshark会将多层次的
tcp
,websocket
包抓出来,这时候,使用mqtt
过滤器,直接可以过滤出我们想要的mqtt
报文情况: