我已经配置了一个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()
现在,不幸的是,无论出于何种原因,从路由器转储的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虚拟隧道接口上运行tcpdump引起的
Unix“文件”命令将捕获文件类型显示为:
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)
我确定您现在已经找到答案了,但是如果其他人有相同的问题,我会在此发布。这是我第一次“回馈”,所以我希望它是正确和有用的!