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