在 VMM 中管理端口 ACL

重要

此版本的 Virtual Machine Manager (VMM) 已终止支持。 建议 升级到 VMM 2022

在 System Center - Virtual Machine Manager (VMM) 中可集中配置和管理 Hyper-V 端口访问控制列表 (ACL)。 可以为网络控制器托管构造和不由网络控制器管理的网络配置端口 ACL。

  • 端口 ACL 是一组规则,用于在第 2 层端口级别上筛选流量。 VMM 中的端口 ACL 可筛选对特定 VMM 对象的访问。 网络对象可附加最多一个端口 ACL。
  • ACL 包含规则,可以附加到任意数量的网络对象。 可以创建不包含规则的 ACL,然后在以后添加规则。 每个 ACL 规则仅对应于一个端口 ACL。
  • 如果 ACL 具有多个规则,则会根据优先级应用这些规则。 规则与条件匹配并应用后,则不会处理其他规则。
  • 全局设置端口 ACL 应用于基础结构中所有 VM 虚拟网络适配器。 没有针对全局设置的单独对象类型。 相反,全局设置端口 ACL 附加到 VMM 管理服务器。
  • 端口 ACL 设置只能通过 VMM 中的 PowerShell cmdlet 公开,不能在 VMM 控制台中配置。
  • 端口 ACL 可应用于:
    • 网络控制器部署中的虚拟子网和适配器。
    • 不由网络控制器托管的网络中的虚拟子网、网络适配器、VM 网络和 VMM 管理服务器。

开始之前

  • 若要将 ACL 应用于网络控制器托管的对象,请使用 ManagedByNC 标记,并将其设置为 True。 如果未设置为 True,则 ACL 仅适用于不由网络控制器管理的网络对象。
  • ACL 类型不可互换。 不能将 ManagedByNC 设置为 false 的 ACL 应用于由网络控制器管理的对象,反之亦然。
  • 这两种 ACL 之间的主要区别在于,在对非网络控制器管理的对象应用 ACL 后,需要修正每个网络适配器。
  • 此外,在优先级范围方面也存在差异:
    • Hyper-V 端口 ACL(不由网络控制器托管) :1 - 65535
    • SDN 端口 ACL(由网络控制器托管) :1 - 64500
  • 需要完整的 VMM 管理员权限才可将端口 ACL 附加到全局设置。 若要将 ACL 附加到 VMM 对象 (VM 网络、子网、虚拟网络适配器) ,需要是 VMM 管理员、租户管理员或自助服务用户。

不支持的方案

下面是不受支持的方案的列表:

  • ACL 与多个实例进行共享时,管理单个实例的单个规则。 所有规则都在其父 ACL 中集中管理并应用到 ACL 附加的位置。
  • 将多个 ACL 附加到实体。
  • 将端口 ACL 应用于 Hyper-V 父分区(管理操作系统)中的虚拟网络适配器。
  • 在 VMM 中创建包含 IP 级协议(而不是 TCP 或 UDP)的端口 ACL 规则。 其他协议仍由 Hyper-V 以本机方式支持。
  • 将端口 ACL 应用于逻辑网络、网络站点 (逻辑网络定义) 、子网 VLAN 和其他未提及为受支持的 VMM 网络对象。

部署步骤

使用 VMM PowerShell 接口执行以下操作:

  1. 定义端口 ACL 和规则。

    • 规则将作为“扩展端口 ACL” (VMNetworkAdapterExtendedAcl) 应用于 Hyper-V 服务器上的虚拟交换机端口。 这意味着它们仅可应用于运行 Windows Server 2012 R2 或更高版本的主机,因为 VMM 不会为早期版本创建旧版 Hyper-V 端口 ACL (VMNetworkAdapterAcl)。
    • 规则将作为“扩展端口 ACL” (VMNetworkAdapterExtendedAcl) 应用于 Hyper-V 服务器上的虚拟交换机端口。 这意味着它们只能应用于运行 Windows Server 2016 或更高版本的主机,因为 VMM 不会 (VMNetworkAdapterAcl) 为早期版本创建旧版 Hyper-V 端口 ACL。
    • 对于 TCP 来说,VMM 中定义的所有端口 ACL 规则都具有状态。 无法创建无状态的 TCP ACL 规则。
  2. 将端口 ACL 附加到全局设置。 这会将 ACL 应用到所有 VM 虚拟网络适配器。

  3. 将端口 ACL 附加到 VM 网络、VM 子网或 VM 虚拟网络适配器。

  4. 管理端口 ACL 规则。

创建端口 ACL

  1. 在 VMM 中打开 PowerShell。

  2. 使用 New-SCPortACL cmdlet 创建端口 ACL。

    New-SCPortACL [-Name] <String> [-Description <String>] [-JobVariable <String>] [-ManagedByNC] [-OnBehalfOfUser <String>] [-OnBehalfOfUserRole <UserRole>] [-Owner <String>] [-PROTipID <Guid>] [-RunAsynchronously] [-UserRole <UserRole>] [-VMMServer <ServerConnection>] [<CommonParameters>]
    

参数

参数 详细信息
Name; Description 端口 ACL 名称和描述
JobVariable 存储作业进度
ManagedByNC 指定是否由网络控制器托管对象
OnBehalfOfUser/OnBehalfOfRole 使用用户名或角色运行作业
Owner 以一个有效的域用户帐户形式指定 VMM 对象的所有者。 示例:Contoso\PattiFuller 或 PattiFuller@Contoso
ProTipID 触发操作的 ProTip 的 ID
RunAsychronously 指示是否以异步方式运行作业
UserRole 指定用户角色
VMMServer 指定 VMM 服务器
CommonParameters 了解详细信息

示例

为网络控制器托管的对象创建端口 ACL“DemoACLManagedByNC”:

PS: C:\> New-SCPortACL -Name "DemoACLManagedByNC" -Description "PortACL Example Managed by NC" -ManagedByN

为不由网络控制器托管的对象创建端口 ACL“DemPortACL”:

PS: C:\> New-SCPortACL -Name "DemoPortACL" -Description "Port ACL Example Non Managed by NC"

定义端口 ACL 的规则

  1. 在 VMM 中打开 PowerShell。

  2. 使用 New-SCPortACLRule cmdlet 创建一个或多个规则。

    New-SCPortACLrule -PortACL <PortACL> -Name <string> [-Description <string>] -Type <Inbound | Outbound> -Action <Allow | Deny> -Priority <uint16> -Protocol <Tcp | Udp | Any> [-LocalAddressPrefix <string: IPAddress | IPSubnet>] [-LocalPortRange <string:X|X-Y|Any>] [-RemoteAddressPrefix <string: IPAddress | IPSubnet>] [-RemotePortRange <string:X|X-Y|Any>]
    

参数

参数 详细信息
Name, Description 规则名称和描述
类型 指定要应用 ACL 的流量方向(“入站”或“出站”)
操作 指定 ACL 是否允许或阻止流量(“允许”或“拒绝”)
LocalAddressPrefix 指定用于标识应筛选的流量的源 IP 地址或子网。
LocalPortRange 指定用于标识流量的源端口范围。
RemoteAddressPrefix 指定用于标识要筛选的流量的源 IP 地址或子网。
RemotePortRange 指定用于标识流量的目标端口范围。
协议 指定应用规则的协议。
优先级 在端口 ACL 中指定规则的优先级。 按顺序应用规则。 优先级设置在 1 至 65535 之间,其中最小的数字具有最高优先级。 用于网络控制器托管的对象的端口 ACL 规则应设为等于或大于 100。 网络控制器不支持低于 100 的优先级。

示例

创建端口 ACL 并将对象存储在 $portACL 中:

PS: C:\> $portACL = New-SCPortACL -Name "RDP ACL" -Description "Acl on RDP access"

创建端口 ACL 规则,以允许从远程子网进行 RDP 访问:

PS: C:\> New-SCPortACLRule -Name "AllowRDPAccess" -PortACL $portACL -Description "Allow RDP Rule from a subnet" -Action Allow -Type Inbound -Priority 110 -Protocol Tcp -LocalPortRange 3389 -RemoteAddressPrefix 10.184.20.0/24

修改 ACL 规则优先级:

PS: C:\> $portACLRule = Get-SCPortACLRule -Name "AllowRDPAccess" `` <br/><br/> `` PS: C:\> Set-SCPortACLRule -PortACLRule $portACLRule -Priority 220

第一个命令获取端口 ACL 规则“AllowRDPAccess”。 第二个命令将规则的优先级更改为 220。

修改目标地址范围的端口 ACL 规则和规则的协议:

PS: C:\> $portACLRule = Get-SCPortACLRule -Name "AllowRDPAccess" `` <br/><br/> `` PS: C:\> Set-SCPortACLRule -PortACLRule $portACLRule -RemoteAddressPrefix 172.185.21.0/24 -Protocol Udp

第一个命令检索规则“AllowRDPAccess”。 第二个命令将协议更改为 UDP,并将目标设置为子网 172.185.21.0/24。

附加和分离端口 ACL

端口 ACL 可附加到全局设置、VM 网络、VM 子网和虚拟网络适配器。 附加到全局设置的端口 ACL 默认适用于所有 VM 虚拟网络适配器。

  1. 在 VMM 中打开 PowerShell。

  2. 使用 Set-SCVMMServer cmdlet 附加端口 ACL。

    Set-SCVMMServer –VMMServer <VMMServer> [-PortACL <NetworkAccessControlList> | -RemovePortACL ]
    

参数

参数 详细信息
VMM 服务器 应用端口 ACL 的 VMM 服务器的名称。
PortACL (可选)将指定端口 ACL 附加到全局设置。

示例

将 ACL 附加到全局设置:

Set-SCVMMServer -VMMServer "VMM.Contoso.Local" -PortACL $acl`` <br/><br/> ExampleL: `` Set-SCVMMServer -VMMServer "VMM.Contoso.Local" -PortACL $acl

将 ACL 从全局设置分离:

Set-SCVMMServer -VMMServer "VMM.Contoso.Local" -RemovePortACL

在创建期间将 ACL 附加到 VM 网络:

New-SCVMNetwork [–PortACL <NetworkAccessControlList>] [rest of the parameters]

将 ACL 附加到现有的 VM 网络:

Set-SCVMNetwork -PortACL $acl`

在创建期间将 ACL 附加到 VM 子网:

New-SCVMSubnet [–PortACL <NetworkAccessControlList>] [rest of the parameters]

将 ACL 附加到现有的 VM 子网:

Set-SCVMSubnet [–PortACL <NetworkAccessControlList> | -RemovePortACL] [rest of the parameters]

检索和查看端口 ACL 和规则

  1. 在 VMM 中打开 PowerShell。

  2. 运行 Get-SCPortACL cmdlet 来检索和查看端口 ACL:

    Get-SCPortACL [[-Name] <String> ] [-ID <Guid> ] [-OnBehalfOfUser <String> ] [-OnBehalfOfUserRole <UserRole> ] [-VMMServer <ServerConnection> ] [ <CommonParameters>]
    
  3. 运行 Get-SCPortACLRule 来检索和查看规则:

    Get-SCPortACLRule [-Name <String> ] [-ID <Guid> ] [-OnBehalfOfUser <String> ] [-OnBehalfOfUserRole <UserRole> ] [-PortACL <PortACL> ] [-VMMServer <ServerConnection> ] [ <CommonParameters>]
    

参数

参数 详细信息
无参数 检索所有 ACL
Name/ID 按名称或 GUID 检索
OnBehalfOfUser/OnBehalfOfUserRole 使用用户名或角色运行
VMMServer 在特定 VMM 服务器上检索 ACL
CommonParameters 了解详细信息

示例

检索特定 ACL:

    PS: C:> $portACL = Get-SCPortACL -Name "DemoPortACL"

获取特定 ACL 的规则:

    PS: C:> Get-SCPortACLRule -Name "AllowRDPAccess"

获取 ACL 的所有规则:

    PS: C:> Get-SCPortACLRule -PortACL $portACL

修改端口 ACL 和规则

  1. 在 VMM 中打开 PowerShell。

  2. 运行 Set-SCPortACL cmdlet 来修改端口 ACL:

    Set-SCPortACL [-PortACL] <PortACL> [[-Description] <String>] [-JobVariable <String>] [-Name <String>] [-OnBehalfOfUser <String>] [-OnBehalfOfUserRole <UserRole>] [-PROTipID <Guid>] [-RunAsynchronously] [-VMMServer <ServerConnection>] [<CommonParameters>]
    
  3. 运行 Remove-SCPortACL 来删除 ACL:

    Remove-SCPortACL [-PortACL] <PortACL> [-Confirm] [-JobVariable <String>] [-OnBehalfOfUser <String>] [-OnBehalfOfUserRole <UserRole>] [-PROTipID <Guid>] [-RunAsynchronously] [-VMMServer <ServerConnection>] [-WhatIf] [<CommonParameters>]
    

    参数

参数 详细信息
Name/Description 端口 ACL 的名称和描述
JobVariable 存储作业进度
OnBehalfOfUser/OnBehalfOfUserRole 使用用户名或角色运行。
ProTipID 触发操作的 ProTip 的 ID
RunAsynchronously 指示是否以异步方式运行作业。
确认 运行作业前进行提示
WhatIf 显示未运行命令会发生什么情况

示例

设置 ACL 描述:

PS: C:> $portACL = Get-SCPortACL -Name "DemoPortACL"
PS: C:> Set-SCPortACL -PortACL $portACL -Description "Port ACL Example Non Managed by Network Controller"

第一个 cmdlet 检索 ACL,第二个 cmdlet 在 ACL 上设置描述。

删除 ACL:

PS: C:> $portACL = Get-SCPortACL -Name "DemoPortACL"
PS: C:> Remove-SCPortACL -PortACL $portACL

第一个 cmdlet 检索 ACL,第二个 cmdlet 删除 ACL。