python - 如何防止VLAN标记从套接字接收的数据包中剥离?

标签 python sockets networking vlan

我正在编写一个简单的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/

相关文章:

python - Django Rest Framework - 有条件地使序列化程序的字段成为必需的或不使用其他字段值

python - 将 ".db"字典类型文件读入pandas DataFrame

python - 使用 Python 套接字从 URL 获取 HTML 内容

linux - 禁用linux内部路由?

c# - Unity Build错误::audioinaec中的属性application @ allowBackups = false:与另一个值冲突

python - 如何简单地使用 PyQt 显示 QColor?

python - 使用 islice 和多处理批量读取和处理大型文本文件

angularjs - 连接到 Node REST api 的应用程序被客户防火墙阻止

java - Linux JVM 的 JAX WS 服务器实现性能问题?

flash - URLLoader 轮询时卡住