You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过TCPDUMP捕获OPC UA中的WriteRequest/WriteResponse消息

如何仅通过TCPDUMP捕获OPC UA中的WriteRequest/WriteResponse消息

嘿,我完全懂你现在的困扰——在没法用tshark或wireshark的PLC上,纯靠tcpdump过滤特定的OPC UA写操作消息确实有点挠头,但咱们可以从OPC UA的协议结构入手,用tcpdump的字节偏移过滤来实现。

首先,先明确几个关键的协议细节:

  • OPC UA默认用4840端口通信,如果你的PLC改了端口,记得替换成实际值。
  • 未加密的OPC UA TCP消息里,WriteRequest的Service ID是0x0000000D,WriteResponse是0x0000000E(这俩是大端字节序的4字节值)。
  • 我们需要通过计算IP和TCP头的动态长度,定位到Service ID在整个数据包中的位置,然后过滤匹配这两个值。

直接上可用的tcpdump命令,你可以根据需求调整:

捕获WriteRequest和WriteResponse的核心命令

tcpdump -i any -nn -tttt -w plc_write_traffic.pcap "tcp port 4840 and (tcp[(ip[0]&0xf)<<2 + ((tcp[12]&0xf0)>>2) +24:4] = 0x0000000d or tcp[(ip[0]&0xf)<<2 + ((tcp[12]&0xf0)>>2) +24:4] = 0x0000000e)"

我给你拆解下这个命令里的关键部分:

  • -i any:监听所有网卡,如果你知道PLC用的具体网卡(比如eth0),可以替换成对应名称,效率更高。
  • -nn:不把IP/端口解析成域名/服务名,保持数字格式,避免解析延迟。
  • -tttt:输出完整的时间戳(YYYY-MM-DD HH:MM:SS),正好满足你记录命令激活时间的需求。
  • -w plc_write_traffic.pcap:把捕获的包保存到文件,方便之后拿到有wireshark的机器上复盘。
  • 过滤表达式里的(ip[0]&0xf)<<2是动态计算IP头的长度(IP头第1字节的后4位是头长度,乘以4),((tcp[12]&0xf0)>>2)是动态计算TCP头的长度(TCP头第13字节的前4位是头长度,乘以4),两者相加再加24,就是Service ID在整个数据包中的偏移位置,最后检查这4字节是否匹配写请求/响应的ID。

额外的实用技巧

  • 如果只想捕获其中一种消息(比如只抓WriteRequest),删掉过滤表达式里的or部分就行:
# 仅捕获WriteRequest
tcpdump -i any -nn -tttt -w plc_write_requests.pcap "tcp port 4840 and tcp[(ip[0]&0xf)<<2 + ((tcp[12]&0xf0)>>2) +24:4] = 0x0000000d"
  • 如果PLC的OPC UA端口不是4840,把命令里的4840替换成实际端口号。
  • 要是你的OPC UA通信是加密的(比如用了Basic256Sha256这类安全策略),这个方法就失效了——因为Service ID会被加密,没法直接通过字节匹配。这种情况下只能先捕获所有4840端口的流量,之后导出到有wireshark的机器上解密分析。
  • 可以加-c <数字>选项让tcpdump捕获指定数量的包后自动停止,比如-c 20就是抓20个符合条件的包。
  • 如果要在bash脚本里记录源IP和时间,可以把控制台输出重定向到日志文件:
tcpdump -i any -nn -tttt "tcp port 4840 and (tcp[(ip[0]&0xf)<<2 + ((tcp[12]&0xf0)>>2) +24:4] = 0x0000000d or tcp[(ip[0]&0xf)<<2 + ((tcp[12]&0xf0)>>2) +24:4] = 0x0000000e)" >> plc_write_logs.log

最后,你可以先抓几个包用tcpdump -xx查看十六进制输出,确认Service ID的位置是否和咱们计算的一致,毕竟有些特殊情况(比如IP/TCP头带选项)可能会影响偏移,但咱们的动态计算应该能覆盖大部分场景。

备注:内容来源于stack exchange,提问作者BrenDs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:35:31