
现场拓扑不变:PoE/24VDC网口温湿度变送器,边缘网关双网口或镜像端口抓包。目标是把两次协议交互的报文栈拆开看,而非简单验证通断。
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 管理站/陷阱接收端同理 注意:PoE 场景下别在交换机 CPU 软镜像上丢包,线速镜像走 ASIC;抓包机网卡关 LRO/GRO,避免重组假象。
tcp port 502 or udp port 161 or udp port 162 or udp port 1620 modbus || snmp || bootp || arp || icmp 以太网帧 → 802.1Q(若带 VLAN)→ IP → TCP → MBAP 头 → PDU
抓包中展开 Wireshark MODBUS TCP 子树,重点看:
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: 0x0003MODBUS
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/寄存器表为准。
Malformed Packet。验证:Length = 后续字节数(UID+PDU)= 1+ (2+N*2) tcp.time_delta。实测轮询周期 T_poll 下,请求→响应 RTT 本地网段 <1ms,跨 VLAN 路由后 2–5ms 抓包过滤:snmp || snmptrap
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响应:
SNMPv2c
PDU: GetResponse
request-id: 0x7b2a
variable-bindings: 1 item
OID = INTEGER: 242 # 同上×10Wireshark 未加载 MIB 时显示数值 OID,View → Name Resolution → Enable SMI,或 snmp.alias。
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注意点:
一次越限事件,端到端串联:
ip.addr==192.168.10.20,时间线展开 Modbus 侧对照:同一窗口内 TCP stream 显示周期读请求,值已越限,证明双通道一致。
tcp port 502 确认 SYN 到达变送器,响应否。未响应→固件未启用 Modbus/TCP,或 ACL 绑定管理网段 tshark -r cap.pcap -Y 'modbus && modbus.func_code==3' -T fields -e frame.number -e modbus.regval_uint16 tshark -r cap.pcap -Y snmp -V | less -b filesize:100000 -b files:10 抓包不是验证连通,是把协议栈各层状态摊开:MBAP 事务、TCP 连接生命周期、UDP 无连接投递、NAT/镜像引入的视图偏差。Modbus TCP 看事务配对与连接复用,SNMP 看绑定变量与 Trap 投递路径。工程排障时,两份 pcap(边缘侧+变送器侧)对照,比单点日志快得多。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。