使用 dpkt 和 Python 解析数据包捕获时遇到问题

use*_*151 2 python parsing pcap

我已将 Cisco 路由器配置为转储 pcap 文件以获取特定接口上的流量,我尝试使用 dpkt 和 Python (2.7) 解析该接口。基本代码是:

f = open('pktrace1.pcap','rb')
pcap = dpkt.pcap.Reader(f)

for ts,buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    ip = eth.data
    tcp = ip.data

f.close()
Run Code Online (Sandbox Code Playgroud)

现在不幸的是,无论出于何种原因,来自路由器的 pcap 转储都将第 2 层信息留空,并且该帧以原始 IP 格式封装。上面的代码在第 7 行失败,并出现以下 AttributeError: 'str' object has no attribute 'data'

我想这是有道理的,因为它期望解析不存在的第 2 层以太网信息。

我对 Python 比较陌生,dpkt 文档对我没有太大帮助。有谁知道我如何让 dpkt 处理这些缺少以太网信息的数据包?或者也许如何让路由器(Cisco 2911,IOS 15.0)将它们与以太网信息原封不动地导出?

我觉得必须有一种简单的方法让 dpkt 处理这些转储,因为 Wireshark 可以完美地读取它们。任何帮助深表感谢!:)

小智 6

为了解析原始 IP pcap,我发现(从逻辑上讲)必须跳过 dpkt 以太网解码并直接跳转到 IP 解码,如下所示:

f = open('tun0.pcap')
pcap = dpkt.pcap.Reader(f)

for ts,buf in pcap:
    ip = dpkt.ip.IP(buf)
    tcp = ip.data

f.close()
Run Code Online (Sandbox Code Playgroud)

当我遇到同样的问题时,我遇到了你的问题,这是由于在 tun0 虚拟隧道接口上运行 tcpdump 引起的

unix 'file' 命令显示捕获文件类型为:

tun0.pcap: tcpdump capture file (little-endian) - version 2.4 (raw IP, capture length 8192)
Run Code Online (Sandbox Code Playgroud)

而来自真实界面的转储给出了:

eth0.pcap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 65535)
Run Code Online (Sandbox Code Playgroud)

我相信您现在已经找到了答案,但我发布此内容是为了防止其他人有同样的问题。这是我第一次“回馈”,所以我希望它是正确且有用的!