如何防止VLAN标记被套接字收到的数据包剥离?

时间:2017-07-05 13:55:22

标签: python sockets networking vlan

我正在编写一个简单的python脚本来解析通过socket接收的原始数据包的标头。该脚本在VM上运行,另一个VM正在生成数据包并将其发送。(两个VM都在运行Linux)。这是一个设置的一部分,其中在发送数据包之前为数据包创建自定义标头,并且脚本的整个目的是通过套接字接收完全无瑕疵的数据包,并验证其内容。

第一个标头是标准以太网标头,DMAC和SMAC各有6个字节,VLAN相关字段(TPID,PCP和ID)有4个字节,Ethertype有2个字节。

我遇到的问题是在收到数据包之前从数据包中删除了VLAN字段(四个字节)(数据包的所有其余部分都存在)。我不太熟悉两个虚拟机之间的网络路径上的虚拟硬件的各种元素,但我怀疑剥离是在那里进行的。

以下是我用来打开套接字的方法:

def openSocketToInterface(nicInterface):
    ETH_P_ALL = 3 # To receive all Ethernet protocols
    socketToInterface = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 
        socket.htons(ETH_P_ALL))
    socketToInterface.bind((nicInterface, 0))
    subprocess.check_call('ifconfig %s promisc' % (nicInterface), 
        shell=True)
    return socketToInterface

有没有办法阻止VLAN字段被剥离?

1 个答案:

答案 0 :(得分:0)

vSwitches和vNIC不使用标记。标签的目的是在线上标记物理帧。虚拟帧不需要,vSwitch知道它们属于哪个端口组。

即使您在ESXi上设置了具有所有VLAN的镜像端口组(允许混杂模式,VID 4095),也不会标记任何帧。

解决此问题的方法是使用多个vNIC。或者,您可以尝试将物理NIC映射到VM(PCI passthrough或DirectPath)。