如何通过数据包的协议过滤传入的数据包?我在Python中使用Scappy,我想专门过滤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")
遗憾的是,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)) "
这将过滤所有 Opc Ua 包,其中 message_type="MSG" 和 chunk_type="F" 是 ReadRequests 或 PublishRequests。
在这种情况下,tcp[20:4]
表示"在 Tcp 数据包中从字节 20 开始并取接下来的 4 个字节",0x4d534746
是MSGF
的十六进制表示形式。
有关伯克利数据包过滤器语法的更多信息,请参阅此处。