要解决的问题

有一个虚拟机运行在 VMWare workstation 中,如何让这个虚拟机桥接到宿主机的网络上的某个 VLAN?

常见使用场景

只有一个网口的单臂软路由,同时宿主机为 Windows,虚拟机软件为 VMware Workstation,在虚拟机中运行 OpenWrt

需要在一个网口上,利用 VLAN 实现虚拟 WAN 口上的 PPPoE 拨号和 虚拟 LAN 口上的上网服务。

 

或者是电脑接入在交换机的trunk口,VMware Workstation的各虚拟机要接入对应的vlan(没多网卡和网卡支持VLAN的情况下)

 

方法

  1. 根据宿主机网卡的品牌,下载对应的 VLAN 设置软件。已知 Realtek 和 Intel 网卡都提供这样的软件。Realtek 网卡的软件为 Realtek Ethernet Diagnostic Utility
  2. 下文以 Realtek 网卡为例。如果你的网卡厂商不提供 VLAN 设置软件,请直接转到文末
  3. 在宿主机上设置你想要使用的 VLAN 编号,软件将会创建一个虚拟网卡。记住网卡名称和适配器名称
  1. 打开 VMWare 虚拟网络编辑器,新建一个网络,例如 VMnet12
  2. 桥接新建的网络到刚才添加的 VLAN 虚拟网卡上
  1. 给虚拟机添加一张连接到 VMnet12 网卡。另外我推荐修改 vmx 配置文件把网卡类型改成 vmxnet3 以获得最佳性能(vmxnet3为万兆半虚拟化网卡,默认的e1000性能很烂)
  1. 在虚拟机使用新加的网卡。注意在虚拟机里面就像一个普通的网卡一样用它就行了,千万不要带上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 必须先在宿主机设置桥接。