【问题标题】:Is this how to use Scapy to parse a Netflow packet?这是如何使用 Scapy 解析 Netflow 数据包?
【发布时间】:2020-06-04 05:29:42
【问题描述】:

我是 scapy 的新手,正在寻找确认以下命令是挖掘(解析)UDP/NetflowV9 数据包的有效方法。

我问的原因是该方法对我来说似乎有效并且适用于我尝试过的许多数据包。但是,我遇到的至少一个数据包失败了。失败的解码/解析是针对具有如下 4 个 Flowset 的 UDP/Netflow 数据包:

  • 流集 1:具有 2 个流记录的数据流集
  • 流程集 2:选项模板流程集
  • 流集 3:具有 1 个流记录的数据流集
  • 流程集 4:数据模板流程集

接近

pkt = rdpcap(pcap)
pkt[0][UDP].payload  
NetflowHeader(pkt[0][UDP].payload)  
NetflowHeader(pkt[0][UDP].payload).payload  
NetflowHeaderV9(NetflowHeader(pkt[0][UDP].payload).payload)
NetflowHeaderV9(NetflowHeader(pkt[0][UDP].payload).payload).payload
NetflowDataflowsetV9(NetflowHeaderV9(NetflowHeader(pkt[0][UDP].payload).payload).payload)
NetflowDataflowsetV9(NetflowHeaderV9(NetflowHeader(pkt[0][UDP].payload).payload).payload).payload
NetflowOptionsFlowsetV9(NetflowDataflowsetV9(NetflowHeaderV9(NetflowHeader(pkt[0][UDP].payload).payload).payload).payload)

上面的命令似乎可以显示有关前 2 个流集的详细信息,但是最后一个命令的输出对于流集 3 有错误的数据(与 Wireshark 显示的不匹配)。特别是,首先,对于flowset 3 flowsetID 和长度错误。我什至还没有尝试查看 flowset 4,因为 flowset 3 的数据是错误的。

所以,我只是想确认我的方法是正确的。如果我的方法是正确的,那么我将尝试找到一种方法来匿名化 pcap 文件(单帧)并在单独的 stackoverflow 帖子中询问。我不想在流记录中透露 IP 地址。

【问题讨论】:

  • 是的,但可能我没有掌握一些东西。解析/剖析部分仅显示两个要点。我尝试使用其中一个要点“netflowv9_defragment”中的命令/方法,它确实从帧中解码了 Eth/IP/UDP,但所有 Netflow 内容都显示为如下十六进制值:<Raw load='\x00\t\x00\x05\x08 在那之后,我开始尝试各种其他 Netflow 命令,并且似乎让它工作,据我目前所知,这个单帧。
  • 您需要给我们一些代码才能使用:/您正在执行的确切调用是什么?您尝试了什么...您是否将 Netflow 标头绑定到您正在使用的 UDP 端口,还是默认端口? (在您的第一个示例中似乎并非如此)
  • 当然,我会努力的。我需要匿名化 pcap,检查我看到的行为是否仍然存在,然后将其上传到某个地方。
  • @Cukic0d,非常感谢您的帮助。在匿名化我的 netflow pcap 后,我决定将 dport 也更改为 2055。之后,我能够使用 netflowv9_defragment(pkt)[0] 来解析数据包。同样,另外,在做了bind_layers(UDP, NetflowHeader, dport=9990)之后,netflow_v9_defragement也解析了原来的pcap。

标签: scapy netflow


【解决方案1】:

我最初的问题的答案是我没有正确使用 scapy 来解析来自 pcap 的 Netflow 流量。

我相信正确的做法(感谢@Cukic0d 的帮助)是:

  1. 通过bind_layers( UDP, NetflowHeader, dport=xxxx ) 将您的 pcap 中 Netflow 流量的目标端口绑定到默认的 Netflow 端口 2055,其中 xxxx 是您的 pcap 中 Netflow 流量的目标端口。如果您的 Netflow 流量已经在 2055 年,则这是不必要的。可能对于 2056 年也没有必要。
  2. 读入 pcap(一次或逐帧)。要逐帧读取,请循环执行:pkt = rdpcap(pcap) 其中 pcap 是您的 pcap 文件的路径。
  3. 使用 netflowv9_defragment 解析刚刚读入的完整单个 netflow 帧,如下所示:netflowv9_defragment(pkt)[0]

【讨论】:

  • 注意你也可以使用(我最喜欢的)sniff(session= NetflowV9Session)。例如,要读取 pcap:sniff(session=NetflowV9Session, offline="q.pcap")。此外,您应该在整个数据包列表(整个 pcap)上调用碎片整理功能,因为某些层可以在其他数据包中发送。
  • 好的,感谢您提供更多信息。我使用 rdpcap 的原因是我的 pcap 很大,有 500,000 帧。我认为由于内存限制,我不应该尝试一次处理整个文件。有这方面的指导吗?
  • sniffrdpcap 更有效。您还可以将sniffprn=...store=0 一起使用
  • 我很困惑 sniff 命令中的 NetflowV9Session 是什么。当我尝试时,我得到: NameError: name 'NetflowV9Session' is not defined
  • 如何使用 scapy 和 python 打印 IPFIX 流的 src、dest 和字节?
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 2014-07-23
  • 2022-10-23
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多