适用场景
实验主机上同时运行多台普通虚拟机,希望减少来宾系统误开启路由功能后对其他设备的影响,可以为指定虚拟网卡启用路由器保护。本教程面向安装了 Hyper-V 管理模块的 Windows Server 2022、2025 主机,资料核对日期为 2026 年 10 月 28 日。
目标是保护一张明确属于普通业务虚拟机的网卡。虚拟路由器、承担网络转发职责的防火墙,以及其他需要合法发送路由通告的设备,应先核实网络设计,不能照搬设置。
原理:在虚拟交换机端口限制特定消息
路由器保护(Router Guard)是虚拟网卡对应端口的一项保护功能。启用后,会丢弃来自该虚拟机的路由通告和重定向消息,具体参数说明见 Microsoft 的 Set-VMNetworkAdapter 文档。
它不会替你判断哪台虚拟机在组织中被授权承担路由职责,这个判断由管理员通过端口配置表达。它也不是通用防火墙,不负责限制所有转发流量,不能替代访问控制、网络分段或来宾系统加固。
对普通终端启用保护,不等于禁止其接收合法路由器的通告。这里控制的是目标虚拟机发出的相关消息,不能把功能名称理解成关闭整台虚拟机的网络。
准备工作
在 Hyper-V 主机本地以管理员身份打开 PowerShell。准备一台允许维护的普通虚拟机,核实其业务角色、连接的虚拟交换机以及网卡用途。多网卡虚拟机尤其需要逐张确认,不能因为显示名称相同就认为它们属于同一网络。
下面分段执行,出现错误就先停止。所有输入都来自你查询到的真实对象:$vmName 保存虚拟机名称,$adapterId 保存目标虚拟网卡标识,二者均不是登录凭据。不要把示例中的说明文字当成对象名称输入。
分步骤操作
第一步:查询虚拟机和网卡
先列出主机上的虚拟机,再输入完整名称。为了避免名称中的通配字符扩大匹配范围,下面使用精确比较。
Get-VM | Select-Object Name, State
$vmName = Read-Host '输入目标虚拟机的完整名称'
$vm = @(Get-VM | Where-Object { $_.Name -eq $vmName })
if ($vm.Count -ne 1) { throw '没有找到唯一的目标虚拟机,请检查名称' }
Get-VMNetworkAdapter -VM $vm[0] |
Format-List Name, Id, SwitchName, MacAddress, RouterGuard
逐项核对交换机名称、MAC 地址和网卡标识。Id 用于区分显示名称相同的网卡,应完整复制,不要只截取末尾一段。Get-VMNetworkAdapter 官方文档说明了如何取得虚拟网卡对象。
第二步:选中单张网卡并记录原值
$adapterId = Read-Host '输入目标网卡的完整 Id'
$nic = @(Get-VMNetworkAdapter -VM $vm[0] |
Where-Object { $_.Id -eq $adapterId })
if ($nic.Count -ne 1) { throw '没有找到唯一的目标网卡,请检查 Id' }
$oldGuard = $nic[0].RouterGuard
$nic[0] | Format-List Name, Id, SwitchName, RouterGuard
$oldGuard
将输出中的对象身份和原状态记入维护记录,并保留当前 PowerShell 窗口。$oldGuard 是本次会话中的恢复依据,关闭窗口后变量不会继续保留。
如果原状态已经是开启(On),说明这张网卡已启用保护,可以直接进入验证;无需先关闭再开启。
第三步:预览后启用
先预览操作目标,再实际设置。两条命令均使用前面选中的单个网卡对象。
$nic[0] | Set-VMNetworkAdapter -RouterGuard On -WhatIf
$nic[0] | Set-VMNetworkAdapter -RouterGuard On -ErrorAction Stop
-WhatIf 只显示拟执行的操作,不能代替真正的设置。确认预览指向目标对象后再运行第二条。不要把输入对象改成主机全部网卡的集合,否则会扩大影响范围。
验证方法
重新从主机查询状态,避免仅查看修改前保存的对象。
Get-VMNetworkAdapter -VM $vm[0] |
Where-Object { $_.Id -eq $adapterId } |
Format-List Name, Id, SwitchName, RouterGuard
确认目标网卡的保护状态为开启,同时核对标识和交换机仍然正确。随后在来宾系统中检查原有网络访问是否正常,并确认正常业务连接没有异常。
状态查询能够证明端口配置已经改变,普通联网检查能够帮助发现误选网卡或角色判断错误,但二者不能证明所有类型报文都已通过抓包验证。本教程不要求在共享业务网络上发送路由通告进行试验,也不能把普通连通性检查写成完整的报文拦截测试。
常见错误
找不到命令时,先确认当前位于安装了 Hyper-V PowerShell 模块的管理环境;权限不足时,应检查管理员身份及主机管理权限。
输入标识后找不到网卡,可能是复制不完整,也可能是网卡已被删除重建。此时重新查询,不要通过放宽筛选条件继续修改。若虚拟机实际承担路由职责,启用保护后可能影响合法功能,应立即复核角色。
安全与回退
需要恢复时,在同一个会话中重新取得目标网卡,再使用保存的原状态。
Get-VMNetworkAdapter -VM $vm[0] |
Where-Object { $_.Id -eq $adapterId } |
Set-VMNetworkAdapter -RouterGuard $oldGuard -ErrorAction Stop
恢复后再次查询并核对业务。若会话已经关闭,应根据维护记录恢复原值,不能猜测所有网卡原本都处于关闭状态。后续新增或重建网卡时,应重新检查保护配置,因为它属于具体网卡,而不是来宾操作系统内部的一项永久规则。
参考资料与转载说明
本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。
评论一下?