首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用dpkt解析PPPoE包

用dpkt解析PPPoE包
EN

Stack Overflow用户
提问于 2015-04-14 02:27:44
回答 1查看 1.3K关注 0票数 0

我正在尝试使用dpkt库从pcap列表中检索5元组信息。为了用VLAN标记解析PPPoE数据包,我编写了如下代码(仅供测试):

代码语言:javascript
复制
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()

结果发现错误,这意味着解析是错误的:

代码语言:javascript
复制
AttributeError: 'str' object has no attribute 'p'

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-14 15:50:27

在vlan (堆叠vlan)中有一个vlan。

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

另一个问题是,pppoe的有效负载是ppp,而不是ip。

您可以将代码更改为如下内容:

代码语言:javascript
复制
import struct

..。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29618183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档