在虚拟网络上使用网络虚拟设备

适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016,Azure Stack HCI 版本 21H2 和 20H2

本主题介绍如何在租户虚拟网络上部署网络虚拟设备。 你可以项网络中添加网络虚拟设备以执行用户定义的路由和端口镜像功能。

网络虚拟设备类型

可以使用两种类型的虚拟设备之一:

  1. 用户定义的路由 - 将虚拟网络上的分布式路由器替换为虚拟设备的路由功能。 使用用户定义的路由时,虚拟设备将用作虚拟网络上虚拟子网之间的路由器。

  2. 端口镜像 - 进入或离开受监视端口的所有网络流量都会被复制并发送到虚拟设备进行分析。

部署网络虚拟设备

若要部署网络虚拟设备,必须先创建包含该设备的 VM,然后将 VM 连接到相应的虚拟网络子网。 有关详细信息,请参阅创建租户 VM 并连接到租户虚拟网络或 VLAN

某些设备需要多个虚拟网络适配器。 通常,一个专用于设备管理的网络适配器,而其他适配器则处理流量。 如果设备需要多个网络适配器,则必须在网络控制器中分别为每个网络适配器创建一个网络接口。 你还必须在每个主机上为不同虚拟子网上的每个附加适配器分配一个接口 ID。

部署网络虚拟设备后,可以使用该设备进行定义的路由和/或移植镜像。

示例:用户定义的路由

对于大多数环境,你只需要虚拟网络的分布式路由器已经定义的系统路由。 但是,在某些特定情况下,你可能需要创建路由表并添加一条或多条路由,例如:

  • 强制通过本地网络以隧道方式连接到 Internet。
  • 在你的环境中使用虚拟设备。

对于这些情况,必须创建一个路由表,并将用户定义的路由添加到该表。 你可以拥有多个路由表,并且可以将同一个路由表与一个或多个子网相关联。 只能将每个子网关联到单个路由表。 子网中的所有虚拟机都使用与子网关联的路由表。

在路由表与子网关联之前,子网依赖于系统路由。 建立关联以后,将根据最长前缀匹配 (LPM) 在用户定义的路由和系统路由之间进行路由。 如果有多个路由具有相同的 LPM 匹配,则首先选择用户定义的路由,然后选择系统路由。

过程:

  1. 创建路由表属性,其中包含所有用户定义的路由。

    根据上面定义的规则,系统路由仍然适用。

     $routetableproperties = new-object Microsoft.Windows.NetworkController.RouteTableProperties
    
  2. 将路由添加到路由表属性中。

    任何目的地为 12.0.0.0/8 子网的路由都会被路由到位于 192.168.1.10 的虚拟设备。 设备必须具有连接到虚拟网络的虚拟网络适配器,并将该 IP 分配给网络接口。

     $route = new-object Microsoft.Windows.NetworkController.Route
     $route.ResourceID = "0_0_0_0_0"
     $route.properties = new-object Microsoft.Windows.NetworkController.RouteProperties
     $route.properties.AddressPrefix = "0.0.0.0/0"
     $route.properties.nextHopType = "VirtualAppliance"
     $route.properties.nextHopIpAddress = "192.168.1.10"
     $routetableproperties.routes += $route
    

    提示

    如果要添加更多路由,请对要定义的每个路由重复此步骤。

  3. 将路由表添加到网络控制器。

     $routetable = New-NetworkControllerRouteTable -ConnectionUri $uri -ResourceId "Route1" -Properties $routetableproperties
    
  4. 将路由表应用到虚拟子网。

    将路由表应用于虚拟子网时,Tenant1_Vnet1 网络中的第一个虚拟子网将使用该路由表。 可以根据需要将路由表分配给虚拟网络中的任意多个子网。

     $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "Tenant1_VNet1"
     $vnet.properties.subnets[0].properties.RouteTable = $routetable
     new-networkcontrollervirtualnetwork -connectionuri $uri -properties $vnet.properties -resourceId $vnet.resourceid
    

一旦将路由表应用于虚拟网络,流量就会转发到虚拟设备。 你必须在虚拟设备中配置路由表,以适合你环境的方式转发流量。

示例:端口镜像

在本示例中,你将 MyVM_Ethernet1 的流量配置为镜像 Appliance_Ethernet1。 我们假设你已部署了两个 VM,一个作为设备,另一个部署为 VM,以便通过镜像进行监视。

设备必须具有第二个网络接口以便进行管理。 在 Appliciance_Ethernet1 上启用镜像作为目标后,它不再接收以此处配置的 IP 接口为目标的流量。

过程:

  1. 获取 VM 所在的虚拟网络。

    $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "Tenant1_VNet1"
    
  2. 获取镜像源和目标的网络控制器网络接口。

    $dstNic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "Appliance_Ethernet1"
    $srcNic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  3. 创建 serviceinsertionproperties 对象以包含端口镜像规则和表示目标接口的元素。

    $portmirror = [Microsoft.Windows.NetworkController.ServiceInsertionProperties]::new()
    $portMirror.Priority = 1
    
  4. 创建 serviceinsertionrules 对象以包含必须匹配的规则,以便将流量发送到设备。

    下面定义的规则匹配所有流量(包括入站和出站流量),这表示传统镜像。 如果想要镜像特定端口或特定源/目标,可以调整这些规则。

    $portmirror.ServiceInsertionRules = [Microsoft.Windows.NetworkController.ServiceInsertionRule[]]::new(1)
    
    $portmirror.ServiceInsertionRules[0] = [Microsoft.Windows.NetworkController.ServiceInsertionRule]::new()
    $portmirror.ServiceInsertionRules[0].ResourceId = "Rule1"
    $portmirror.ServiceInsertionRules[0].Properties = [Microsoft.Windows.NetworkController.ServiceInsertionRuleProperties]::new()
    
    $portmirror.ServiceInsertionRules[0].Properties.Description = "Port Mirror Rule"
    $portmirror.ServiceInsertionRules[0].Properties.Protocol = "All"
    $portmirror.ServiceInsertionRules[0].Properties.SourcePortRangeStart = "0"
    $portmirror.ServiceInsertionRules[0].Properties.SourcePortRangeEnd = "65535"
    $portmirror.ServiceInsertionRules[0].Properties.DestinationPortRangeStart = "0"
    $portmirror.ServiceInsertionRules[0].Properties.DestinationPortRangeEnd = "65535"
    $portmirror.ServiceInsertionRules[0].Properties.SourceSubnets = "*"
    $portmirror.ServiceInsertionRules[0].Properties.DestinationSubnets = "*"
    
  5. 创建 serviceinsertionelements 对象以包含镜像设备的网络接口。

    $portmirror.ServiceInsertionElements = [Microsoft.Windows.NetworkController.ServiceInsertionElement[]]::new(1)
    
    $portmirror.ServiceInsertionElements[0] = [Microsoft.Windows.NetworkController.ServiceInsertionElement]::new()
    $portmirror.ServiceInsertionElements[0].ResourceId = "Element1"
    $portmirror.ServiceInsertionElements[0].Properties = [Microsoft.Windows.NetworkController.ServiceInsertionElementProperties]::new()
    
    $portmirror.ServiceInsertionElements[0].Properties.Description = "Port Mirror Element"
    $portmirror.ServiceInsertionElements[0].Properties.NetworkInterface = $dstNic
    $portmirror.ServiceInsertionElements[0].Properties.Order = 1
    
  6. 在网络控制器中添加服务插入对象。

    发出此命令时,以上一步中指定的设备网络接口为目标的所有流量都会停止。

    $portMirror = New-NetworkControllerServiceInsertion -ConnectionUri $uri -Properties $portmirror -ResourceId "MirrorAll"
    
  7. 更新要镜像的源的网络接口。

    $srcNic.Properties.IpConfigurations[0].Properties.ServiceInsertion = $portMirror
    $srcNic = New-NetworkControllerNetworkInterface -ConnectionUri $uri  -Properties $srcNic.Properties -ResourceId $srcNic.ResourceId
    

完成这些步骤后,Appliance_Ethernet1 接口会镜像来自 MyVM_Ethernet1 接口的流量。