管理 VMM 中的端口 ACL

在 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 设置为 falseACL 应用于网络控制器管理的对象,反之亦然。
  • 这两种类型的 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 不会为早期版本创建旧版 Hyper-V 端口 ACL(VMNetworkAdapterAcl)。
    • 这些规则作为扩展端口 ACL(VMNetworkAdapterExtendedAcl)应用于 Hyper-V 服务器上的虚拟交换机端口。 这意味着它们仅适用于运行 Windows Server 2019 或更高版本的主机,因为 VMM 不会为早期版本创建旧版 Hyper-V 端口 ACL(VMNetworkAdapterAcl)。
    • VMM 中定义的所有端口 ACL 规则都适用于 TCP。 无法创建无状态 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>]
    

参数

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

示例

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

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

为网络控制器“DemPortACL”未管理的对象创建端口 ACL:

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

为端口 ACL 定义端口 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>]
    

参数

参数 详细信息
名称、说明 规则名称和说明
类型 指定应用 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
名称/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>]
    

    参数

参数 详细信息
名称/说明 端口 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;第二个设置 ACL 的说明。

删除 ACL:

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

第一个 cmdlet 检索 ACL;第二个删除它。