我想用vlan部分构造一个ip包。
用scapy很容易做到:

from scapy import inet
newpkt = inet.Ether()/inet.Dot1Q()/inet.IP()

有时我想在包里有inet.Dot1Q(),有时没有。
inet.Dot1Q()的默认值应该是什么,以便在运算符“/”中绕过它?
我试过''None-它们不起作用。
from scapy import inet
myDot1Q = SOME DEFAULT VALUE
newpkt = inet.Ether()/myDot1Q/inet.IP()
#new packet is a valid IP packet here

编辑:对我问题的另一种解释
1)我可以创建带有VLAN标记的数据包
inet.Ether()/inet.Dot1Q/inet.IP()

2)我可以创建具有双VLAN标记的数据包
inet.Ether()/inet.Dot1Q/inet.Dot1Q/inet.IP()

3)如何构建可能是未标记数据包、VLAN标记数据包或双VLAN标记数据包的数据包?最好有这样的东西:
#No VLAN
myVlan = ???
myDoubleVlan = ???

#VLAN
myVlan = inet.Dot1Q()
myDoubleVlan = ???

#Double VLAN
myVlan = inet.Dot1Q()
myDoubleVlan = inet.Dot1Q()

#In any case the packet structure should remain the same
inet.Ether()/myVlan/myDoubleVlan/inet.IP()

我不知道默认值???应该是什么才能正确地构造包。

最佳答案

首先,我想不出你为什么不使用这样一个简单的解决方案:

# example for single Vlan
# myVlan = Dot1Q()
# myDoubleVlan = None

# generate the package
package = Ether()
if myVlan: package /= myVlan
if myDoubleVlan: package /= myDoubleVlan
package /= IP()

但无论如何,如果这种方法是出于任何不可接受的原因,还有另一种可能性。。。
您可以重写Packet类并创建自己的类,该类与除法运算符无关您只需要重写__div__方法并添加一些圆括号以保持正确的优先级。
以下是您将如何实现它:
from scapy.all import *

class NeutralPacket(Packet):
    def __init__(self,  _pkt="", _internal=0, **fields):
        super(NeutralPacket, self).__init__(_pkt, _internal, **fields)
    def __div__(self, other):
        return other

#No VLAN
myVlan = NeutralPacket()
myDoubleVlan = NeutralPacket()

#VLAN
myVlan = Dot1Q()
myDoubleVlan = NeutralPacket()

#Double VLAN
myVlan = Dot1Q()
myDoubleVlan = Dot1Q()

# this part doesn't need to change, but you need to have two
# additional parenthesis for proper precedence
Ether()/(myVlan/(myDoubleVlan/IP()))

附加说明:
__div__()方法是divisionoperator实现。解释器将a/b作为a.__div__(b)执行,并且Packet类有自己的这个操作符的实现。如果你看一下它的code,你会发现它基本上把packagepayloadb附加到packagea上。
我们在这里所做的只是返回other包,在本例中是b,实际上完全忽略了a
注意,当NeutralPacket是左边的运算符时,这只在一个方向上起作用,因为否则它是另一个正在执行的类'__div__()方法为了处理这个问题,我们必须添加圆括号,这样优先级将使我们的NeutralPacket类始终是左侧运算符由于这不会影响到由于Packet的实现而产生的整体结果,所以这对您的案例非常有效唯一不起作用的是如果NeutralPacket是最右边(即最后一个)的运算符,那么就不能强制使用正确的优先级。但对于VLAN来说,这不是问题,因为上面总是有层。。

10-07 19:16
查看更多