首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Wireshark抓包实战:以太网温湿度变送器SNMP与Modbus TCP/IP协议栈的报文深度解析

Wireshark抓包实战:以太网温湿度变送器SNMP与Modbus TCP/IP协议栈的报文深度解析

原创
作者头像
BJ盛世宏博小程
发布2026-09-22 15:38:56
发布2026-09-22 15:38:56
1050
举报

Wireshark抓包实战:以太网温湿度变送器SNMP与Modbus TCP/IP协议栈的报文深度解析

一、抓包前准备

现场拓扑不变:PoE/24VDC网口温湿度变送器,边缘网关双网口或镜像端口抓包。目标是把两次协议交互的报文栈拆开看,而非简单验证通断。

1. 抓包点选择

  • 边缘网关侧抓包tcpdump -i eth0 -nn -s0 -G 3600 -w /var/tmp/cap_%Y%m%d_%H%M.pcap 'tcp port 502 or udp port 161 or udp port 162';SNMP 管理站/陷阱接收端同理
  • 交换机端口镜像(SPAN/RSPAN):把变送器下行口镜像到抓包机,避免网关侧 NAT 掩盖真实 MAC/IP
  • 变送器侧旁路 TAP:工业场景更稳,尤其 PoE 供电时,TAP 透传供电不影响 PD

注意:PoE 场景下别在交换机 CPU 软镜像上丢包,线速镜像走 ASIC;抓包机网卡关 LRO/GRO,避免重组假象。

2. Wireshark 配置

  • 捕获过滤器(BPF):tcp port 502 or udp port 161 or udp port 162 or udp port 1620
  • 显示过滤器实战用: tcp.port==502 || snmp || snmptrapd 更细:modbus || snmp || bootp || arp || icmp
  • 协议启用:Preferences → Protocols → MODBUS/TCP 设字节序、寄存器基址;SNMP 加 MIB 路径,否则 OID 只显示数字
  • 时间参考:NTP 同步后,Wireshark → View → Time Display Format → Seconds Since Previous Displayed Packet,便于算 RTT/轮询周期

二、Modbus TCP/IP 报文栈解析

1. 报文封装回溯

以太网帧 → 802.1Q(若带 VLAN)→ IP → TCP → MBAP 头 → PDU

  • MBAP Header(事务ID 2B / 协议ID 2B=0000 / 长度 2B / 单元ID 1B)
  • PDU:功能码 + 数据。常见读保持寄存器 0x03,写多寄存器 0x10

抓包中展开 Wireshark MODBUS TCP 子树,重点看:

代码语言:javascript
复制
Frame 142: 66 bytes on wire
Ethernet II, Src MAC, Dst MAC
802.1Q vlan 10, pcp 0
IPv4, Src 192.168.10.10 (gateway), Dst 192.168.10.20 (sensor)
TCP, sport 49182, dport 502, seq, ack, flags [PSH,ACK]
Modbus/TCP
  Transaction Identifier: 0x0001
  Protocol Identifier: 0x0000
  Length: 0x0006
  Unit Identifier: 0x01
  Modbus PDU: Read Holding Registers (0x03)
    Reference Number: 0x0000   # 注意:Wireshark 显示的是协议层,实际起始地址
    Word Count: 0x0003

2. 请求/响应配对

  • 网关轮询:每周期发 N 次读请求,事务ID 自增。Wireshark 右键 → Follow → TCP Stream,确认请求响应配对
  • 响应帧:
代码语言:javascript
复制
MODBUS
  Transaction Identifier: 0x0001
  Length: 0x0007
  Unit Identifier: 0x01
  PDU: Read Holding Registers Response
    Byte Count: 0x06
    Register Value[0]: 0x00F2  -> 24.2℃
    Register Value[1]: 0x012C  -> 30.0%RH? 需按点表换算
    Register Value[2]: 0x0000  -> 状态字

换算:厂商约定 INT16×10,0x00F2=242/10=24.2℃;0x012C=300/10=30.0%RH——明显偏低,说明点表映射不同,别硬套,以厂家 MIB/寄存器表为准。

3. 常见异常报文

  • TCP 重传 / DUP ACK:链路闪断、PoE 端口复位后 PHY 重协商,网关半开连接未清。Follow TCP Stream 看到请求无响应,RTO 退避
  • TCP Zero Window:pymodbus 阻塞 + 发送缓冲积压,接收窗口归零
  • RST from sensor:对端 TCP 栈重启后未知四元组,网关复用旧 socket。现象:捕获到 RST,ACK
  • MBAP 长度错:某些国产固件 Length 字段含单元ID或不包含,Wireshark 标 Malformed Packet。验证:Length = 后续字节数(UID+PDU)= 1+ (2+N*2)
  • 功能码异常响应:返回错误码 0x83 + 异常码 0x02(非法地址)/0x06(忙)。抓包看到响应 PDU 首字节 0x83
  • 轮询风暴:捕获到每秒数十次读请求,交换机缓冲溢出,Modbus TCP 事务ID 乱序。调采集间隔 + 连接池复用

4. 时延分析

  • I/O Graphs:x 轴时间,y 轴 tcp.analysis.ack_rtt 或自定义 tcp.time_delta。实测轮询周期 T_poll 下,请求→响应 RTT 本地网段 <1ms,跨 VLAN 路由后 2–5ms
  • 断链恢复:TCP 三次握手耗时 + Modbus 首次读。抓包看 SYN→SYN/ACK→ACK→PSH。PoE 复位后 DHCP 耗时另算,可在 DHCP Offer 前看到 ARP probe/DAD

三、SNMP 报文栈解析

1. 两种交互

  • Manager → Agent GET/GETNEXT/GETBULK(UDP 161)
  • Agent → Manager Trap/Inform(UDP 162)

抓包过滤:snmp || snmptrap

2. GET 请求/响应

代码语言:javascript
复制
Frame 88: 102 bytes
IPv4, Src 192.168.10.10, Dst 192.168.10.20
UDP, sport 43211, dport 161
SNMPv2c
  version: v2c (1)
  community: public
  PDU: GetRequest
    request-id: 0x7b2a
    error-status: noError (0)
    error-index: 0
    variable-bindings: 1 item
      iso.org.dod...1.3.6.1.4.1.<ENT>.1.1.0 = NULL  # 私有MIB温湿度OID

响应:

代码语言:javascript
复制
SNMPv2c
  PDU: GetResponse
    request-id: 0x7b2a
    variable-bindings: 1 item
      OID = INTEGER: 242    # 同上×10

Wireshark 未加载 MIB 时显示数值 OID,View → Name Resolution → Enable SMI,或 snmp.alias

3. Trap 报文

代码语言:javascript
复制
Frame 201: 148 bytes
IPv4, Src 192.168.10.20:49189, Dst 192.168.10.10:162
UDP, len 104
SNMPv2-Trap-PDU
  request-id: 0x0
  notification-sysUpTime.0 = Timeticks: (123456) 0:20:34.56
  snmpTrapOID.0 = OID: enterprises.<ENT>.traps.envAlarm
  varbinds:
    envTemp.0 = INTEGER 242
    envHumi.0 = INTEGER 300
    envStatus.0 = INTEGER 1

注意点:

  • Agent 源端口随机高位,目的端口 162;管理站须监听 162/udp,云侧 CVM 安全组放行,NAT 后需固定目标地址回传
  • v1 Trap 走 community + agent-addr 字段;v2c Trap PDU 结构不同,Wireshark 解剖树差异
  • InformRequest 期望 manager 回确认,抓包应看到往返;工业设备常不支持

4. SNMP 工程坑点在报文层

  • community 明文:抓包即见,跨公网回传前边缘侧转发,勿暴露管理平面
  • MIB 私有:Wireshark 显示 raw OID,需向厂家要 MIB 模块放入 ~/.snmp/mibs 或 Wireshark MIB dir,否则无法展开
  • UDP 无重传:Trap 丢失在抓包机侧表现为只发未收,对照变送器侧抓包确认是否发出。NAT 会话超时后返回路径不通,边缘中继更稳
  • Coexistence:同一网口设备同时跑 Modbus TCP 502 与 SNMP 161,抓包确认资源占用,部分固件 SNMP Agent 阻塞时 Modbus 仍响应
  • GETBULK 误用:表遍历时 max-repetitions 过大致响应分片,IP 层 DF=1 时 ICMP need frag,Wireshark 见 ICMP unreachable + 重传

四、协议栈跨层关联实战

一次越限事件,端到端串联:

  1. 变送器内部判定越限 → 发 SNMP Trap(UDP 162)
  2. 边缘网关本地 snmptrapd 收包,转 MQTT 上报云;同时 Modbus TCP 轮询继续
  3. 抓包机关联:过滤 ip.addr==192.168.10.20,时间线展开
    • t0 Trap OUT from sensor
    • t0+0.8ms gateway UDP recv, daemon proc
    • t0+12ms MQTTS PUBLISH to cloud
    • 云侧规则引擎写入 InfluxDB,Grafana 告警

Modbus 侧对照:同一窗口内 TCP stream 显示周期读请求,值已越限,证明双通道一致。

五、排障工作流

  • 连通性:ping/arp 确认 L2/L3;抓包看 ARP 请求否、DHCP 否(固定 IP 时无用)
  • 端口可达:tcpdump tcp port 502 确认 SYN 到达变送器,响应否。未响应→固件未启用 Modbus/TCP,或 ACL 绑定管理网段
  • SNMP 社区/MIB:snmpwalk -v2c -c public <ip> .1.3.6,抓包核对 GetNext 链路
  • 多协议资源:并发压测时抓包,看 socket backlog、UDP 丢弃(netstat -su),Agent 单线程时 Modbus 与 SNMP 串行化
  • PoE 复位后:抓包窗口对齐交换机日志,看端口 down→up 后 ARP/ND 刷新、TCP 重连、SNMP 冷启动 Trap(coldStart)
  • TLS 上云无关:边缘侧已收敛,抓包看本地明文 Modbus/SNMP,云侧另抓 MQTTS 解密需密钥导出,不在本文范围

六、Wireshark 技巧速查

  • 着色规则:TCP RST/Black、Modbus Error/Red、SNMP Trap/Yellow
  • 专家信息:Analyze → Expert Info,过滤 note/warn/err
  • 导出对象:不适用;导出 Carrays 给固件侧 debug
  • 命令行校验:tshark -r cap.pcap -Y 'modbus && modbus.func_code==3' -T fields -e frame.number -e modbus.regval_uint16
  • SNMP 解码:tshark -r cap.pcap -Y snmp -V | less
  • 合并多机台抓包:mergecap,按时间排序,重建跨机房时序
  • 大文件:dumpcap 环形缓冲 -b filesize:100000 -b files:10

七、落地建议

  • 调试期抓包标准化:每次变更前后留 pcap,命名含设备SN/IP/协议/工况
  • 边缘网关内置 tcpdump 上报日志时脱敏(community、PSK 不进 pcap 外传)
  • CI/现场脚本:部署后自动跑轮询+snmpwalk,断言响应字段,失败留包
  • 物模型映射:Modbus 寄存器→属性,SNMP OID→属性,边缘侧统一 schema 上报腾讯云 IoT Explorer,别把协议细节暴露给上层应用
  • 协议栈文档化:点表、MIB、端口、community、ACL 进交付包

八、小结

抓包不是验证连通,是把协议栈各层状态摊开:MBAP 事务、TCP 连接生命周期、UDP 无连接投递、NAT/镜像引入的视图偏差。Modbus TCP 看事务配对与连接复用,SNMP 看绑定变量与 Trap 投递路径。工程排障时,两份 pcap(边缘侧+变送器侧)对照,比单点日志快得多。


物联网 #Modbus #TCP/IP #UDP #POE供电 #腾讯云 #Wireshark #Python #InfluxDB #以太网温湿度传感器 #网口温湿度变送器 #机房监控

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • Wireshark抓包实战:以太网温湿度变送器SNMP与Modbus TCP/IP协议栈的报文深度解析
    • 一、抓包前准备
      • 1. 抓包点选择
      • 2. Wireshark 配置
    • 二、Modbus TCP/IP 报文栈解析
      • 1. 报文封装回溯
      • 2. 请求/响应配对
      • 3. 常见异常报文
      • 4. 时延分析
    • 三、SNMP 报文栈解析
      • 1. 两种交互
      • 2. GET 请求/响应
      • 3. Trap 报文
      • 4. SNMP 工程坑点在报文层
    • 四、协议栈跨层关联实战
    • 五、排障工作流
    • 六、Wireshark 技巧速查
    • 七、落地建议
    • 八、小结
  • 物联网 #Modbus #TCP/IP #UDP #POE供电 #腾讯云 #Wireshark #Python #InfluxDB #以太网温湿度传感器 #网口温湿度变送器 #机房监控
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档