バックグラウンド:
私はscapy
解析に取り組んでいますIEEE 802.1Q triple tagged frames
。scapy を使用してテスト フレームを生成し、それらを pcap ファイルにキャプチャしています。解析は、pcap ファイルを読み取ることにより、別のスクリプトで行われます。最初の 802.1q タグで問題なく動作します。
問題:
2 番目と 3 番目の 802.1q タグにアクセスする方法がわかりません。フレームヘッダー を使用haslayer()
して条件付きで調べようとしています。最初の Dot1Q タグに関連付けられた値を返します。getlayer
haslayer(Dot1Q)
質問:
type
1 番目のタグのフィールドが の場合0x8100
、2 番目のタグが存在します。2タッグ、3タッグに進む方法はありますか?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 `