1

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

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

我遇到的问题是 VLAN 字段(四个字节)在我收到数据包之前被从数据包中剥离(所有其余数据包都存在)。我对两个 VM 之间的网络路径上的虚拟硬件的各种元素不是很熟悉,尽管我怀疑剥离正在那里进行。

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

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 字段被剥离?

4

1 回答 1

0

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

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

一种解决方法是使用多个 vNIC。或者,您可以尝试将物理 NIC 映射到 VM(PCI 直通或 DirectPath)。

于 2017-07-06T19:07:26.647 回答