我正在编写一个简单的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字段被剥离?
答案 0 :(得分:0)
vSwitches和vNIC不使用标记。标签的目的是在线上标记物理帧。虚拟帧不需要,vSwitch知道它们属于哪个端口组。
即使您在ESXi上设置了具有所有VLAN的镜像端口组(允许混杂模式,VID 4095),也不会标记任何帧。
解决此问题的方法是使用多个vNIC。或者,您可以尝试将物理NIC映射到VM(PCI passthrough或DirectPath)。