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