九、Wireshark抓包分析实战
9.1 Modbus TCP 过滤器
| 过滤器表达式 | 说明 |
|---|---|
tcp.port == 502 |
捕获所有Modbus TCP流量 |
modbus |
简单过滤器 |
modbus.func_code == 3 |
只显示读保持寄存器 |
modbus.func_code == 6 |
只显示写单寄存器 |
modbus.trans_id == 0x0001 |
特定事务ID |
modbus.proto_id != 0 |
非标准协议标识(异常) |
modbus.unit_id == 1 |
特定单元ID |
modbus.error == 1 |
只显示异常响应 |
9.2 RTU over serial 抓包(Linux)
bash
# 方法1:创建虚拟串口用于监听
socat -d -d pty,link=/tmp/ttyV0,rawer tcp:127.0.0.1:1234
# 将设备连接到虚拟串口
# 在Wireshark中捕获 /tmp/ttyV0,使用"Serial"接口
# 方法2:使用serial2pcap工具
sudo apt-get install wireshark
sudo modprobe can
# 使用外部串口嗅探硬件(如ComSpy)
9.3 分析步骤
9.3.1 抓包命令
bash
# 捕获到文件
sudo tcpdump -i eth0 -s 1500 -w modbus_capture.pcap 'tcp port 502'
# 同时捕获并解码
sudo tcpdump -i eth0 -A -s 1500 'tcp port 502 and host 192.168.1.100'
9.3.2 Wireshark分析流程
-
打开pcap文件:File → Open → modbus_capture.pcap
-
应用过滤器 :输入
modbus回车 -
查看请求:选择一个包,展开 Modbus/TCP 部分
-
跟踪流:右键 → Follow → TCP Stream
-
查看时序:Statistics → Flow Graph
9.3.3 解读示例(读保持寄存器)
bash
Frame 1: 192.168.1.10 → 192.168.1.100 (Modbus TCP)
Transcation ID: 0x0001
Protocol ID: 0x0000
Length: 0x0006
Unit ID: 0x01
Modbus PDU:
Function Code: Read Holding Registers (3)
Starting Address: 0x0000
Quantity: 0x0002
Frame 2: 192.168.1.100 → 192.168.1.10 (Modbus TCP)
Transcation ID: 0x0001
Protocol ID: 0x0000
Length: 0x0005
Unit ID: 0x01
Modbus PDU:
Function Code: Read Holding Registers (3)
Byte Count: 0x04
Register 0x0000: 0x1234
Register 0x0001: 0x5678
9.4 常见问题诊断
| 现象 | Wireshark显示 | 可能原因 | 解决方法 |
|---|---|---|---|
| 无响应 | 只有请求,无响应 | 设备IP错误、端口错误、防火墙 | 检查连接,ping设备 |
| 重置连接 | TCP RST包 | 端口未监听 | 确认设备支持Modbus TCP |
| 超时重传 | TCP Dup ACK, Retransmission | 网络丢包 | 检查网线、交换机 |
| 乱序响应 | 事务ID不匹配 | 设备实现有bug | 忽略乱序响应,等待匹配 |
| 异常响应 | Modbus Exception | 请求非法 | 查异常码表 |