首页 > 解决方案 > 在 Python 中使用 Scapy 过滤 OPC UA 数据包

问题描述

如何通过数据包的协议过滤传入的数据包?我在 Python 中使用 Scapy,我想专门过滤 OPC-UA 数据包。我只找到了有关 TCP 数据包的示例。

from scapy.all import *
from scapy.layers.inet import IP,TCP,ICMP, Ether, UDP

interface = "eth0"   #Name of interface to be sniffed
sniff(iface=interface, prn=check_pkt, store=0, filter="opc")

标签: scapyopcopc-ua

解决方案


遗憾的是,scapy 目前不支持 OpcUa。

但是,您可以通过使用标准的 opc ua 端口进行过滤来实现您的目标,即 4840。

filter = "port 4840"

还可以检查包中包含的字节,以便对 opc ua 包进行更详细的过滤。

例如:

filter = "(port 4840) " \
         "and (tcp[20:4] = 0x4d534746) " \
         "and ((tcp[46:2] = 0x3a03) or (tcp[46:2] = 0x7702)) "

这将过滤所有带有 message_type="MSG" 和 chunk_type="F" 的 Opc Ua 包,它们是 ReadRequests 或 PublishRequests。

在这种情况下tcp[20:4],表示“在 Tcp 数据包中从第 20 个字节开始并取接下来的 4 个字节”,并且0x4d534746MSGF.

可以在此处找到有关 berkeley 包过滤器语法的更多信息。


推荐阅读