3

バックグラウンド:

私はscapy解析に取り組んでいますIEEE 802.1Q triple tagged frames。scapy を使用してテスト フレームを生成し、それらを pcap ファイルにキャプチャしています。解析は、pcap ファイルを読み取ることにより、別のスクリプトで行われます。最初の 802.1q タグで問題なく動作します。

問題:

2 番目と 3 番目の 802.1q タグにアクセスする方法がわかりません。フレームヘッダー を使用haslayer()して条件付きで調べようとしています。最初の Dot1Q タグに関連付けられた値を返します。getlayerhaslayer(Dot1Q)

質問:

type1 番目のタグのフィールドが の場合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 `            
4

1 に答える 1