我正在编写一个简单的python脚本来解析通过套接字接收的原始数据包的 header 。该脚本在一个VM上运行,另一个VM正在生成数据包并将其发送。(两个VM都在运行linux)。这是设置的一部分,其中在发送数据包之前为数据包创建了自定义 header ,脚本的全部目的是通过套接字完全接收完好的数据包,并验证其内容。
第一个 header 是标准的以太网 header ,其中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字段被剥离吗?
最佳答案
vSwitch和vNIC不使用标记。标签的目的是在电线上标记物理框架。虚拟框架不需要它,vSwitch知道它们属于哪个端口组。
即使您在具有所有VLAN的ESXi上设置了镜像端口组(允许为混杂模式,VID 4095),也不会标记任何帧。
解决该问题的一种方法是使用多个vNIC。或者,您可以尝试将物理NIC映射到VM(PCI直通或DirectPath)。
关于python - 如何防止VLAN标记从套接字接收的数据包中剥离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44928282/