用 Hyper-V 给 Windows 添加虚拟网卡

Hyper-V 宿主机可以有自己的虚拟网卡,用来直连物理交换机上的某个 VLAN。场景是:物理交换机端口做了 Trunk,承载多个 VLAN,但宿主机只需要接入其中一个。

先决条件:Windows 开启了 Hyper-V 功能(Win+R 输入 optionalfeatures,勾选 Hyper-V)。

创建虚拟交换机

用管理员身份打开 PowerShell,执行:

New-VMSwitch -Name "vTrunk" -NetAdapterName "以太网" -AllowManagementOS $false
  • -Name:虚拟交换机名称,随意起,后面引用要用
  • -NetAdapterName:绑定的物理网卡名,在控制面板里能看到
  • -AllowManagementOS $false:宿主机不通过这个交换机走管理网络,避免路由冲突

这一步只是建立了虚拟交换机和物理网卡的连接,宿主机自己还没有接口可以通信。

给宿主机加虚拟网卡

上一步创建的交换机默认只服务虚拟机,宿主机要接入,需要单独加一块虚拟网卡:

Add-VMNetworkAdapter -ManagementOS -SwitchName vTrunk

-ManagementOS 表示这块网卡属于宿主机(管理操作系统),而不是某台虚拟机。加完之后打开网络适配器设置,会看到一个新的虚拟网卡。

但到这里还不够——这块网卡默认会收到 Trunk 口上所有 VLAN 的流量,需要告诉它只认其中一个。

给虚拟网卡配 Access VLAN

物理交换机端口是 Trunk,上面跑着多个 VLAN,帧都带着 802.1Q 标签。Hyper-V 的虚拟交换机只是透明转发,打标签和剥标签的工作由虚拟网卡来做:把虚拟网卡设为 Access 模式并指定 VLAN ID 后,它发出的帧会打上该 VLAN 的标签,收到带对应标签的帧则剥掉标签再交给系统。效果等效于物理交换机上的一个 Access 端口。

所以宿主机要接入某个 VLAN,直接在它的虚拟网卡上配 Access VLAN ID 即可:

Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName "vTrunk" -Access -VlanId 20
  • -ManagementOS:作用对象是宿主机的虚拟网卡,不是某台虚拟机的
  • -VMNetworkAdapterName:上一步加出来的那块网卡的名字。没指定 -Name 时默认叫「以太网 2」之类,也可以在 Add-VMNetworkAdapter 时用 -Name 显式起名,后面引用更稳
  • -Access:把网卡设为 Access 模式
  • -VlanId 20:Access 模式下必须指定,表示这块卡只收发 VLAN 20 的帧

设完之后,去网络适配器属性里确认新虚拟网卡的 VLAN 设置已经生效,再给它配上 VLAN 20 的 IP 地址,宿主机就接入目标网段了。

虚拟机侧怎么做

如果虚拟机也要接入同一个 VLAN:

Add-VMNetworkAdapter -VMName "MyVM" -SwitchName vTrunk
Set-VMNetworkAdapterVlan -VMName "MyVM" -VMNetworkAdapterName "网卡" -Access -VlanId 20

虚拟机网卡默认不带 VLAN 设置,不执行 Set-VMNetworkAdapterVlan 的话,它会收到 Trunk 口上所有 VLAN 的流量,通常不是想要的结果。

参考