创建并管理具有多个 NIC 的 Windows 虚拟机

适用于:✔️ Windows VM ✔️ 灵活规模集

Azure 中的虚拟机 (VM) 可附有多个虚拟网络接口卡 (NIC)。 一种常见方案是为前端和后端连接设置不同的子网。 可以将 VM 上的多个 NIC 关联到多个子网,但这些子网必须全都位于同一个虚拟网络 (vNet) 中。 本文详述了如何创建附有多个 NIC 的 VM。 还可以了解如何从现有 VM 中添加或删除 NIC。 不同的 VM 大小支持不同数目的 NIC,因此请相应地调整 VM 的大小。

注意

如果方案不需要多个子网,那么在单个 NIC 上使用多个 IP 配置可能会更简单。 可在此处找到有关此设置的说明。

先决条件

在以下示例中,请将示例参数名称替换成自己的值。 示例参数名称包括 myResourceGroupmyVnetmyVM

创建具有多个 NIC 的 VM

首先创建一个资源组。 以下示例在“chinaeast”位置创建名为“myResourceGroup”的资源组:

New-AzResourceGroup -Name "myResourceGroup" -Location "ChinaEast"

创建虚拟网络和子网

虚拟网络的一种常见方案是具有两个或多个子网。 一个子网可能用于前端流量,另一个用于后端流量。 若要连接两个子网,可在 VM 上使用多个 NIC。

  1. 通过 New-AzVirtualNetworkSubnetConfig 定义两个虚拟网络子网。 以下示例分别定义 mySubnetFrontEndmySubnetBackEnd 的子网:

    $mySubnetFrontEnd = New-AzVirtualNetworkSubnetConfig -Name "mySubnetFrontEnd" `
        -AddressPrefix "192.168.1.0/24"
    $mySubnetBackEnd = New-AzVirtualNetworkSubnetConfig -Name "mySubnetBackEnd" `
        -AddressPrefix "192.168.2.0/24"
    
  2. 通过 New-AzVirtualNetwork 创建虚拟网络和子网。 以下示例创建一个名为 myVnet 的虚拟网络:

    $myVnet = New-AzVirtualNetwork -ResourceGroupName "myResourceGroup" `
        -Location "chinaeast" `
        -Name "myVnet" `
        -AddressPrefix "192.168.0.0/16" `
        -Subnet $mySubnetFrontEnd,$mySubnetBackEnd
    

创建多个 NIC

通过 New-AzNetworkInterface 创建两个 NIC。 将其中一个 NIC 附加到前端子网,将另一个 NIC 附加到后端子网。 以下示例创建名为 myNic1myNic2 的 NIC:

$frontEnd = $myVnet.Subnets|?{$_.Name -eq 'mySubnetFrontEnd'}
$myNic1 = New-AzNetworkInterface -ResourceGroupName "myResourceGroup" `
    -Name "myNic1" `
    -Location "chinaeast" `
    -SubnetId $frontEnd.Id

$backEnd = $myVnet.Subnets|?{$_.Name -eq 'mySubnetBackEnd'}
$myNic2 = New-AzNetworkInterface -ResourceGroupName "myResourceGroup" `
    -Name "myNic2" `
    -Location "chinaeast" `
    -SubnetId $backEnd.Id

通常还会创建用于筛选流向 VM 的网络流量的网络安全组和用于在多个 VM 间分配流量的负载均衡器

创建虚拟机

立即开始构建 VM 配置。 每种 VM 大小限制了可添加到 VM 的 NIC 数目。 有关详细信息,请参阅 Windows VM 大小

  1. 将 VM 凭据设置为 $cred 变量,如下所示:

    $cred = Get-Credential
    
  2. 通过 New-AzVMConfig 定义你的 VM。 以下示例定义名为 myVM 的 VM,并使用支持两个以上 NIC 的 VM 大小(Standard_DS3_v2):

    $vmConfig = New-AzVMConfig -VMName "myVM" -VMSize "Standard_DS3_v2"
    
  3. 通过 Set-AzVMOperatingSystemSet-AzVMSourceImage 创建 VM 配置的其余部分。 以下示例创建一个 Windows Server 2016 VM:

    $vmConfig = Set-AzVMOperatingSystem -VM $vmConfig `
        -Windows `
        -ComputerName "myVM" `
        -Credential $cred `
        -ProvisionVMAgent `
        -EnableAutoUpdate
    $vmConfig = Set-AzVMSourceImage -VM $vmConfig `
        -PublisherName "MicrosoftWindowsServer" `
        -Offer "WindowsServer" `
        -Skus "2016-Datacenter" `
        -Version "latest"
    
  4. 通过 Add-AzVMNetworkInterface 附加之前创建的两个 NIC:

    $vmConfig = Add-AzVMNetworkInterface -VM $vmConfig -Id $myNic1.Id -Primary
    $vmConfig = Add-AzVMNetworkInterface -VM $vmConfig -Id $myNic2.Id
    
  5. 使用 New-AzVM 创建 VM:

    New-AzVM -VM $vmConfig -ResourceGroupName "myResourceGroup" -Location "chinaeast"
    
  6. 通过完成为多个 NIC 配置操作系统中的步骤,将辅助 NIC 的路由添加到 OS。

向现有 VM 添加 NIC

若要向现有 VM 添加虚拟 NIC,解除分配 VM,添加虚拟 NIC,并启动 VM。 不同的 VM 大小支持不同数目的 NIC,因此请相应地调整 VM 的大小。 如果需要,可调整 VM 的大小

  1. 通过 Stop-AzVM 解除分配 VM。 以下示例解除分配 myResourceGroup 中名为 myVM 的 VM:

    Stop-AzVM -Name "myVM" -ResourceGroupName "myResourceGroup"
    
  2. 通过 Get-AzVm 获取 VM 的现有配置。 以下示例从 myResourceGroup 中获取名为 myVM 的 VM 的信息:

    $vm = Get-AzVm -Name "myVM" -ResourceGroupName "myResourceGroup"
    
  3. 以下示例通过 New-AzNetworkInterface 创建附加到 mySubnetBackEnd 的名为 myNic3 的虚拟 NIC。 然后,通过 Add-AzVMNetworkInterface 将该虚拟 NIC 附加到 myResourceGroup 中名为 myVM 的 VM:

    # Get info for the back end subnet
    $myVnet = Get-AzVirtualNetwork -Name "myVnet" -ResourceGroupName "myResourceGroup"
    $backEnd = $myVnet.Subnets|?{$_.Name -eq 'mySubnetBackEnd'}
    
    # Create a virtual NIC
    $myNic3 = New-AzNetworkInterface -ResourceGroupName "myResourceGroup" `
        -Name "myNic3" `
        -Location "chinaeast" `
        -SubnetId $backEnd.Id
    
    # Get the ID of the new virtual NIC and add to VM
    $nicId = (Get-AzNetworkInterface -ResourceGroupName "myResourceGroup" -Name "MyNic3").Id
    Add-AzVMNetworkInterface -VM $vm -Id $nicId | Update-AzVm -ResourceGroupName "myResourceGroup"
    

    主虚拟 NIC

    具有多个 NIC 的 VM 上其中一个需为主 NIC。 如果 VM 上现有虚拟 NIC 之一已设置为主 NIC,则可跳过此步骤。 以下示例假设 VM 上现在存在两个虚拟NIC,并且想要将第一个 NIC ([0]) 添加为主 NIC:

    # List existing NICs on the VM and find which one is primary
    $vm.NetworkProfile.NetworkInterfaces
    
    # Set NIC 0 to be primary
    $vm.NetworkProfile.NetworkInterfaces[0].Primary = $true
    $vm.NetworkProfile.NetworkInterfaces[1].Primary = $false
    
    # Update the VM state in Azure
    Update-AzVM -VM $vm -ResourceGroupName "myResourceGroup"
    
  4. 通过 Start-AzVm 启动 VM:

    Start-AzVM -ResourceGroupName "myResourceGroup" -Name "myVM"
    
  5. 通过完成为多个 NIC 配置操作系统中的步骤,将辅助 NIC 的路由添加到 OS。

从现有 VM 中删除 NIC

若要从现有 VM 中删除虚拟 NIC,解除分配 VM,删除虚拟 NIC,并启动 VM。

  1. 通过 Stop-AzVM 解除分配 VM。 以下示例解除分配 myResourceGroup 中名为 myVM 的 VM:

    Stop-AzVM -Name "myVM" -ResourceGroupName "myResourceGroup"
    
  2. 通过 Get-AzVm 获取 VM 的现有配置。 以下示例从 myResourceGroup 中获取名为 myVM 的 VM 的信息:

    $vm = Get-AzVm -Name "myVM" -ResourceGroupName "myResourceGroup"
    
  3. 通过 Get-AzNetworkInterface 获取有关删除 NIC 的信息。 以下示例获取有关“myNic3”的信息:

    # List existing NICs on the VM if you need to determine NIC name
    $vm.NetworkProfile.NetworkInterfaces
    
    $nicId = (Get-AzNetworkInterface -ResourceGroupName "myResourceGroup" -Name "myNic3").Id   
    
  4. 通过 Remove-AzVMNetworkInterface 删除 NIC,然后通过 Update-AzVm 更新 VM。 以下示例删除上一步中由 $nicId 获得的“myNic3”:

    Remove-AzVMNetworkInterface -VM $vm -NetworkInterfaceIDs $nicId | `
        Update-AzVm -ResourceGroupName "myResourceGroup"
    
  5. 通过 Start-AzVm 启动 VM:

    Start-AzVM -Name "myVM" -ResourceGroupName "myResourceGroup"
    

使用模板创建多个 NIC

使用 Azure 资源管理器模板可在部署期间创建资源的多个实例,例如,创建多个 NIC。 资源管理器模板使用声明性 JSON 文件来定义环境。 有关详细信息,请参阅 Azure 资源管理器概述。 使用“copy”指定要创建的实例数:

"copy": {
    "name": "multiplenics",
    "count": "[parameters('count')]"
}

有关详细信息,请参阅使用“copy”创建多个实例

还可以使用 copyIndex() 在资源名称后面追加一个数字。 然后可创建“myNic1”、“MyNic2”等 。 以下代码演示了追加索引值的示例:

"name": "[concat('myNic', copyIndex())]", 

可以阅读有关使用 Resource Manager 模板创建多个 NIC 的完整示例。

通过完成为多个 NIC 配置操作系统中的步骤,将辅助 NIC 的路由添加到 OS。

为多个 NIC 配置来宾 OS

Azure 会将默认网关分配给附加到虚拟机的第一个(主)网络接口。 Azure 不会将默认网关分配给附加到虚拟机的其他(辅助)网络接口。 因此,默认情况下无法与辅助网络接口所在子网的外部资源进行通信。 但是,辅助网络接口可以与子网外部的资源进行通信,尽管对不同操作系统而言,启用通信的步骤有所不同。

  1. 从 Windows 命令提示符下,运行 route print 命令,这将返回类似于以下虚拟机输出的输出,该虚拟机包含两个附加的网络接口:

    ===========================================================================
    Interface List
    3...00 0d 3a 10 92 ce ......Microsoft Hyper-V Network Adapter #3
    7...00 0d 3a 10 9b 2a ......Microsoft Hyper-V Network Adapter #4
    ===========================================================================
    

    在本例中,Microsoft Hyper-V 网络适配器 #4(接口 7)是辅助网络接口,系统不会向其分配默认网关。

  2. 从命令提示符处,运行 ipconfig 命令查看分配给辅助网络接口的 IP 地址。 在本例中,192.168.2.4 被分配到接口 7。 辅助网络接口没有返回任何默认网关地址。

  3. 若要将发往辅助网络接口子网外部地址的所有流量路由到子网网关,请运行以下命令:

    route add -p 0.0.0.0 MASK 0.0.0.0 192.168.2.1 METRIC 5015 IF 7
    

    子网的网关地址是为该子网定义的地址范围中的第一个 IP 地址(以 .1 结尾)。 如果不想路由子网外部的所有流量,可改为向特定目标添加单独的路由。 例如,如果只想将流量从辅助网络接口路由到 192.168.3.0 网络,请输入以下命令:

    route add -p 192.168.3.0 MASK 255.255.255.0 192.168.2.1 METRIC 5015 IF 7
    
  4. 例如,若要确认与 192.168.3.0 网络中资源的通信是否成功,请输入以下命令使用接口 7 (192.168.2.4) 对 192.168.3.4 执行 ping 操作:

    ping 192.168.3.4 -S 192.168.2.4
    

    可能需要使用以下命令通过正在 ping 的设备的 Windows 防火墙打开 ICMP:

    netsh advfirewall firewall add rule name=Allow-ping protocol=icmpv4 dir=in action=allow
    
  5. 若要确认已添加的路由是否在路由表中,请输入 route print 命令,它将返回一个类似于以下文本的输出:

    ===========================================================================
    Active Routes:
    Network Destination        Netmask          Gateway       Interface  Metric
              0.0.0.0          0.0.0.0      192.168.1.1      192.168.1.4     15
              0.0.0.0          0.0.0.0      192.168.2.1      192.168.2.4   5015
    

    “网关”下列出的路由 192.168.1.1 是主网络接口的默认路由。 “网关”下列出的路由 192.168.2.1 是你所添加的路由。

后续步骤

尝试创建具有多个 NIC 的 VM 时,请查看 Windows VM 大小。 注意每个 VM 大小支持的 NIC 数目上限。