【问题标题】:Parsing PPPoE packets with dpkt使用 dpkt 解析 PPPoE 数据包
【发布时间】:2015-04-14 23:50:27
【问题描述】:

我正在尝试使用 dpkt 库从 pcap 文件列表中检索 5 元组信息。为了解析带有 VLAN 标签的 PPPoE 数据包,我编写了这样的代码(仅供测试):

import dpkt
import socket

def decode(pc):
    for ts, pkt in pc:
        eth = dpkt.ethernet.Ethernet(pkt)
        pppoe = dpkt.pppoe.PPPoE(eth.data)
        ip = pppoe.data
        if ip.p == dpkt.ip.IP_PROTO_UDP:
            udp = ip.data
            yield(ip.src, udp.sport, ip.dst, udp.dport, ip.v)
        else: pass

def test():
    pc = dpkt.pcap.Reader(open('epon.pcap','rb'))
    for src, sport, dst, dport, ip_version in decode(pc):
        print "from", socket.inet_ntoa(src),":",sport, " to ",socket.inet_ntoa(dst),":",dport

test()

原来是error,说明解析错误:

AttributeError: 'str' object has no attribute 'p'

那么正确的代码应该是什么样的呢?我是一个 Python 初学者,dpkt 源代码真的让我很困惑......

【问题讨论】:

  • 你期望 'p' 是什么?一个IP地址? IP版本?

标签: python parsing pppoe dpkt


【解决方案1】:

您拥有的捕获在一个 vlan 中有一个 vlan(堆叠 vlan)。

在不修改 dpkt 库的情况下,您将需要手动解析第二个 VLAN。

您将遇到的另一个问题是 pppoe 的有效负载是 ppp 而不是 ip。

你可以把你的代码改成这样:

import struct

...

def decode(pc):
for ts, pkt in pc:
    eth = dpkt.ethernet.Ethernet(pkt)
    if eth.type == dpkt.ethernet.ETH_TYPE_8021Q:
         eth.tag, eth.type = struct.unpack('>HH', eth.data[:4])
         eth.data = eth.data[4:]
    pppoe = dpkt.pppoe.PPPoE(eth.data)
    ppp = pppoe.data
    ip = ppp.ip
    if ip.p == dpkt.ip.IP_PROTO_UDP:
        udp = ip.data
        yield(ip.src, udp.sport, ip.dst, udp.dport, ip.v)
    else: pass

【讨论】:

  • 它确实有效!谢谢。但是,程序从test2.pcap文件中解析了200个udp数据包后返回TypeError: getattr(): attribute name must be string,对于其他大文件,在解析不同数量的数据包后也失败了。有什么问题?
  • 我在使用此代码解析时没有收到这样的错误。但看起来并非所有帧都带有 VLAN。
猜你喜欢
  • 2014-01-13
  • 2014-10-11
  • 2011-09-14
  • 2012-11-08
  • 2012-02-09
  • 2017-05-23
  • 2015-12-17
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多