Разбор пакетов PPPoE с помощью dpkt

Я пытаюсь получить информацию о 5 кортежах из списка файлов pcap, используя библиотеку dpkt. Чтобы разобрать пакеты PPPoE с тегами VLAN, я пишу такие коды (только для теста):

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()

Получается ошибка, что означает неправильный разбор:

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

Так каким же должен быть правильный код? Я новичок в Python, и исходный код dpkt меня очень озадачивает...


person Xin    schedule 14.04.2015    source источник
comment
Что вы ожидаете от «p»? IP-адрес? IP-версия?   -  person Tux    schedule 14.04.2015


Ответы (1)


Захват, который у вас есть, имеет vlan внутри vlan (stacked 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
person weinrea    schedule 14.04.2015
comment
Это работает! Спасибо. Однако программа возвращает TypeError: getattr(): attribute name must be string после обработки 200 пакетов udp из файла test2.pcap. для других больших файлов после разбора разного количества пакетов. В чем проблема? - person Xin; 15.04.2015
comment
Я не получил такой ошибки при разборе этого кода. Но похоже, что не все кадры связаны с VLAN. - person weinrea; 15.04.2015