我已将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行失败,出现以下数据:'str‘对象没有属性’AttributeError‘
我猜这是有意义的,因为它希望解析不存在的第2层以太网信息。
我对Python比较陌生,dpkt文档对我帮助不大。有人知道我如何让dpkt处理这些缺少以太网信息的数据包吗?或者,如何让路由器(Cisco 2911、IOS 15.0)准确地将它们与以太网信息一起导出?
我觉得必须有一种简单的方法来让dpkt处理这些转储,因为Wireshark可以完美地读取它们。非常感谢您的帮助!:)
发布于 2014-06-18 11:22:40
要解析原始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 ' 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)我相信你现在已经找到了答案,但我在这里贴出这篇文章,以防其他人有同样的问题。这是我第一次“回馈”,所以我希望它是正确的和有用的!
发布于 2013-12-26 22:31:38
我的名声太低,不能发表评论,但我想我可能有一些相关的数据可以分享,所以在答案框中
顺便说一句,您能提供一些关于您使用什么工具来生成pcap文件的详细信息,以及您的示例"pktrace1.pcap“数据吗?另外:如果使用AirPCAP适配器捕获,则可以根据自己的设置配置它捕获数据的方式。如果您需要访问数据,则需要确保已为AirPCAP加密狗正确启用网络密钥(否则您的思科路由器必须禁用网络安全),否则也无法访问数据。
那么写这篇文章的主要原因是:我之前使用过impacket库,我想这也会对你有帮助。下面是一个示例:
'''
Packet sniffer in python using the pcapy python library
python filter compile from http://carnivore.it/2010/06/12/python3_-_ctypes
pcapy compile from http://www.salstar.sk/pub/salpack/usr/sbin/httop.py and http://bytes.com/topic/python/answers/681254-python-packet-filter-pcapy
actual filtering answer on https://github.com/LeonB/dabbler/blob/master/pcapy-test.py ??
'''
import socket
from struct import *
import datetime
import sys
import radiotap
import pcapy
from impacket import ImpactDecoder, ImpactPacket
AIRPCAP_ADAPTER = '\\\\.\\airpcap00'
filter_string = '' # do not use with airpcap00 as this requires adapter to be on network so it seems (decryption key etc)
def main(argv):
cap = pcapy.open_live(AIRPCAP_ADAPTER, 65536, 1, 0)
#bpf = pcapy.compile (cap, 1500, filter_string, 0, 1)
cap.setfilter(filter_string)
print "Listening on %s: net=%s, mask=%s, linktype=%d" % (AIRPCAP_ADAPTER, cap.getnet(), cap.getmask(), cap.datalink())
# Read packets -- header contains information about the data from pcap,
# payload is the actual packet as a string
# callback for received packets
def recv_pkts(hdr, data):
decoder = ImpactDecoder.EthDecoder()
ether = decoder.decode(data)
print ether
# Parse the IP packet inside the Ethernet packet
packet_limit = -1 # infinite
cap.loop(packet_limit, recv_pkts) # capture packets
if __name__ == "__main__":
main(sys.argv)https://stackoverflow.com/questions/20777697
复制相似问题