2015-04-14 3 views
0

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

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 действительно меня много озадачивает ...

+0

Что вы ожидаете 'р' быть? IP-адрес? IP-версия? – Tux

ответ

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 
+0

Это действительно работает! Благодарю. Тем не менее, программа возвращает 'TypeError: getattr(): имя атрибута должно быть строкой после парсинга 200 udp-пакетов из файла [test2.pcap] (https://app.box.com/s/xlpiydclprou2igoc8y57376oral4cik). Оно также не удалось для другие большие файлы после разбора различного количества пакетов. В чем проблема? –

+0

Я не получил такую ​​ошибку, анализируя это с помощью этого кода. Но похоже, что не все фреймы с VLAN. – weinrea