用 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 的流量,通常不是想要的结果。