VMware Workstation 桥接模式的网卡上让虚拟机使用 VLAN 的正确方法
要解决的问题
有一个虚拟机运行在 VMWare workstation 中,如何让这个虚拟机桥接到宿主机的网络上的某个 VLAN?
常见使用场景
只有一个网口的单臂软路由,同时宿主机为 Windows,虚拟机软件为 VMware Workstation,在虚拟机中运行 OpenWrt
需要在一个网口上,利用 VLAN 实现虚拟 WAN 口上的 PPPoE 拨号和 虚拟 LAN 口上的上网服务。
或者是电脑接入在交换机的trunk口,VMware Workstation的各虚拟机要接入对应的vlan(没多网卡和网卡支持VLAN的情况下)
方法
-
根据宿主机网卡的品牌,下载对应的 VLAN 设置软件。已知 Realtek 和 Intel 网卡都提供这样的软件。Realtek 网卡的软件为 Realtek Ethernet Diagnostic Utility
-
下文以 Realtek 网卡为例。如果你的网卡厂商不提供 VLAN 设置软件,请直接转到文末
-
在宿主机上设置你想要使用的 VLAN 编号,软件将会创建一个虚拟网卡。记住网卡名称和适配器名称

-
打开 VMWare 虚拟网络编辑器,新建一个网络,例如 VMnet12
-
桥接新建的网络到刚才添加的 VLAN 虚拟网卡上

-
给虚拟机添加一张连接到 VMnet12 网卡。另外我推荐修改 vmx 配置文件把网卡类型改成
vmxnet3
以获得最佳性能(vmxnet3为万兆半虚拟化网卡,默认的e1000性能很烂)

-
在虚拟机使用新加的网卡。注意在虚拟机里面就像一个普通的网卡一样用它就行了,千万不要带上vlan tag
如果网卡厂商没提供 VLAN 设置软件 (很多普通网卡都不支持咯)
具体请参阅本文
思路是:利用 Hyper-V 命令行工具(不需要启用 Hyper-V 平台),来创建虚拟 VLAN 网卡,实现和上面步骤3一样的效果
# "Ethernet" is the available NIC that you want the VSwitch to be based on //新建一个 虚拟机交换机,桥接到 Ethernet 网卡 New-VMSwitch -Name "新建虚拟交换机名称" -NetAdapterName "Ethernet" # Create virtual adapters for each vlan you want to assign. //新建一个虚拟网卡,属于 某个虚拟交换机 Add-VMNetworkAdapter -ManagementOS -Name 虚拟网卡名称 -SwitchName 交换机名称 # Then configure the interface you just created to listen for the vlan tag needed // 把虚拟网卡加入 某个VLAN Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName 虚拟网卡名称 -Access VlanID 10 # Now you have a virtual interface that is configured for a specific vlan. To have access to that vlan inside a virtual machine, simply change the settings from VMware Workstation Virtual Network Editor and have a vmnet that is bridged with the Hyper-V virtual NIC. //vmware Workstation 把相关vmnet桥接到这个虚拟网卡上
实战命令:
PS C:\WINDOWS\system32>New-VMSwitch -Name "trunk" -NetAdapterName "Ethernet"
//以本地网卡Ethernet创建交换机trunk,默认不打标签 Untagged
PS C:\WINDOWS\system32> Add-VMNetworkAdapter -ManagementOS -Name trunk-x -SwitchName trunk
//在交换机trunk下创建虚拟网卡trunk-x
PS C:\WINDOWS\system32> Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName trunk-x -Trunk -AllowedVlanIdList 1-4094 -NativeVlanId 1
//交换机trunk下的虚拟网卡trunk-x配置成trunk模式,通过所有Vlan ID,默认Pvlan1
PS C:\WINDOWS\system32> Get-VMNetworkAdapterVlan -ManagementOS
VMName VMNetworkAdapterName Mode VlanList
------ -------------------- ---- --------
vlan1 Access 1
Container NIC c9ffa239 Untagged
trunk-x Trunk 1,1-4094
trunk Untagged
//显示hyper-v主机下,所有网卡的vlan情况
PS C:\WINDOWS\system32> Get-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName trunk-x
VMName VMNetworkAdapterName Mode VlanList
------ -------------------- ---- --------
trunk-x Trunk 1,1-4094
//显示hyper-v主机下,trunk-x网卡的vlan情况
注意
本方法的实质是桥接虚拟机网卡到 VLAN 虚拟网卡上,这样做是因为 VMware 根本没法桥接带有 VLAN Tag 的 Ethernet 帧而不得已为之。
这样做的缺点是无法让虚拟机感知到 VLAN 的存在,也就是说你不能像 eth0.2
这样直接在虚拟机里面指定 VLAN 编号,要使用某个 VLAN 必须先在宿主机设置桥接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~