Parsing 如何使用Scapy解析802.1q三重标记帧?
背景: 我正在使用Parsing 如何使用Scapy解析802.1q三重标记帧?,parsing,scapy,vlan,Parsing,Scapy,Vlan,背景: 我正在使用scapy解析ieee802.1Q三重标记帧。我正在使用scapy生成测试帧,并将它们捕获到一个pcap文件中。 解析通过读取pcap文件在单独的脚本中完成。我可以成功使用第一个802.1q标签 问题: 我不清楚如何访问第二和第三个802.1q标签。我试图使用haslayer()和getlayer有条件地检查帧头haslayer(Dot1Q)返回 与第一个Dot1Q标记关联的值 问题: 如果第一个标记的type字段为0x8100,则存在第二个标记。有没有办法前进到第二和第三个标
scapy
解析ieee802.1Q三重标记帧
。我正在使用scapy生成测试帧,并将它们捕获到一个pcap文件中。
解析通过读取pcap文件在单独的脚本中完成。我可以成功使用第一个802.1q标签
问题:
我不清楚如何访问第二和第三个802.1q标签。我试图使用haslayer()
和getlayer
有条件地检查帧头haslayer(Dot1Q)
返回
与第一个Dot1Q标记关联的值
问题:
如果第一个标记的type
字段为0x8100
,则存在第二个标记。有没有办法前进到第二和第三个标签?我已经查看了l2.py源代码并进行了实验,但还没有成功
代码:
发送三重标记帧:
sendp(Ether(dst='78:2B:CB:33:4B:9F',src="D4:AE:52:89:BA:FA")/Dot1Q(vlan=1,id=3,prio=2)/Dot1Q(vlan=2,id=3,prio=2)/Dot1Q(vlan=3,id=3,prio=2)/IP(dst='10.25.222.222')/ICMP())
帧显示:
###[ Ethernet ]###
dst = 78:2b:cb:33:4b:9f
src = d4:ae:52:89:ba:fa
type = 0x8100
###[ 802.1Q ]###
prio = 2L
id = 1L
vlan = 1L
type = 0x8100
###[ 802.1Q ]###
prio = 2L
id = 1L
vlan = 2L
type = 0x8100
###[ 802.1Q ]###
prio = 2L
id = 1L
vlan = 3L
type = 0x800
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 28
id = 1
flags =
frag = 0L
ttl = 64
proto = icmp
chksum = 0xc55
src = 10.25.123.123
dst = 10.25.222.222
\options \
###[ ICMP ]###
type = echo-request
code = 0
chksum = 0xf7ff
id = 0x0
seq = 0x0
###[ Padding ]###
load = '\x00\x00\x00\x00\x00\x00'
帧解析:
pkts=rdpcap(self.file_name)
for pkt in pkts:
try:
if pkt.haslayer(Ether):
src = pkt.getlayer(Ether).src
dst = pkt.getlayer(Ether).dst
type = pkt.getlayer(Ether).type
# Do something
if pkt.haslayer(Dot1Q):
prio = pkt.getlayer(Dot1Q).prio
id = pkt.getlayer(Dot1Q).id
vlan = pkt.getlayer(Dot1Q).vlan
type = pkt.getlayer(Dot1Q).type
# Do something
except:
raise `
您可以使用
pkt[Dot1Q:2]
,pkt[Dot1Q:3]
等访问pkt
的内部802.1Q
标记。如果数据包没有指定的层,则会引发相应的索引器
异常:
In [3]: pkt
Out[3]: <Ether dst=78:2B:CB:33:4B:9F src=D4:AE:52:89:BA:FA type=0x8100 |<Dot1Q prio=2 id=3 vlan=1 type=0x8100 |<Dot1Q prio=2 id=3 vlan=2 type=0x8100 |<Dot1Q prio=2 id=3 vlan=3 type=0x800 |<IP frag=0 proto=icmp dst=10.25.222.222 |<ICMP |>>>>>>
In [4]: pkt[Dot1Q:1]
Out[4]: <Dot1Q prio=2 id=3 vlan=1 type=0x8100 |<Dot1Q prio=2 id=3 vlan=2 type=0x8100 |<Dot1Q prio=2 id=3 vlan=3 type=0x800 |<IP frag=0 proto=icmp dst=10.25.222.222 |<ICMP |>>>>>
In [5]: pkt[Dot1Q:2]
Out[5]: <Dot1Q prio=2 id=3 vlan=2 type=0x8100 |<Dot1Q prio=2 id=3 vlan=3 type=0x800 |<IP frag=0 proto=icmp dst=10.25.222.222 |<ICMP |>>>>
In [6]: pkt[Dot1Q:3]
Out[6]: <Dot1Q prio=2 id=3 vlan=3 type=0x800 |<IP frag=0 proto=icmp dst=10.25.222.222 |<ICMP |>>>
In [7]: pkt[Dot1Q:4]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-7-a155defcb885> in <module>()
----> 1 pkt[Dot1Q:4]
/usr/local/lib/python2.7/dist-packages/scapy_real-2.2.0_dev-py2.7.egg/scapy/packet.pyc in __getitem__(self, cls)
770 elif type(lname) is not str:
771 lname = repr(lname)
--> 772 raise IndexError("Layer [%s] not found" % lname)
773 return ret
774
IndexError: Layer [Dot1Q] not found
[3]中的:pkt
出[3]:
In[4]:pkt[Dot1Q:1]
出[4]:
In[5]:pkt[Dot1Q:2]
出[5]:
In[6]:pkt[Dot1Q:3]
出[6]:
In[7]:pkt[Dot1Q:4]
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
---->1件装[Dot1Q:4]
/usr/local/lib/python2.7/dist-packages/scapy_real-2.2.0_dev-py2.7.egg/scapy/packet.pyc in_uuugetitem_uuu(self,cls)
770 elif类型(lname)不是str:
771 lname=repr(lname)
-->772 raise索引器(“未找到层[%s]“%lname”)
773返回ret
774
索引器:找不到层[Dot1Q]
当然,您可以检查类型值,只有在验证它是否为
0x8100
后,才能尝试访问内层。非常好。谢谢你,尤尔!