Skip to main content
 首页 » 编程设计

python之使用 dpkt 和 Python 解析数据包捕获时出现问题

2025年05月04日16lyhabc

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

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() 

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

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

我是 Python 的新手,dpkt 文档对我帮助不大。有人知道我如何让 dpkt 处理这些缺少以太网信息的数据包吗?或者如何让路由器(Cisco 2911、IOS 15.0)完整地导出以太网信息?

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

请您参考如下方法:

要解析原始 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() 

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

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

tun0.pcap: tcpdump capture file (little-endian) - version 2.4 (raw IP, capture length 8192) 

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

eth0.pcap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 65535) 

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