使用 dpkt 解析 PPPoE 数据包
Parsing PPPoE packets with dpkt
我正在尝试使用 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 源代码真的让我很困惑...
您的捕获在 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
我正在尝试使用 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 源代码真的让我很困惑...
您的捕获在 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