使用 Azure CLI 将多个 IP 地址分配给虚拟机

在一个 Azure 虚拟机 (VM) 上可以附加一个或多个网络接口 (NIC)。 可为任何 NIC 分配一个或多个静态或动态的公共与专用 IP 地址。 为 VM 分配多个 IP 地址可实现以下功能:

  • 在单个服务器上使用不同的 IP 地址和 SSL 证书托管多个网站或服务。
  • 用作网络虚拟设备,例如防火墙或负载均衡器。
  • 可将任何 NIC 的任何专用 IP 地址添加到 Azure 负载均衡器后端池。 以往,只能将主要 NIC 的主要 IP 地址添加到后端池。 若要详细了解如何对多个 IP 配置进行负载均衡,请阅读对多个 IP 配置进行负载均衡一文。

附加到 VM 的每个 NIC 都具有一个或多个关联的 IP 配置。 每个配置分配有一个静态或动态专用 IP 地址。 每个配置还可以具有一个关联的公共 IP 地址资源。 公共 IP 地址资源分配有动态或静态公共 IP 地址。 若要详细了解 Azure 中的 IP 地址,请阅读 Azure 中的 IP 地址一文。

分配给 NIC 的专用 IP 地址数目存在限制。 能够在 Azure 订阅中使用的公共 IP 地址数也存在限制。 有关详细信息,请参阅 Azure 限制一文。

本文介绍如何使用 Azure CLI 通过 Azure 资源管理器部署模型创建虚拟机 (VM)。 无法将多个 IP 地址分配到通过经典部署模型创建的资源。 若要详细了解 Azure 部署模型,请阅读 Understand deployment models(了解部署模型)一文。

场景

创建具有单个 NIC 的 VM 并将其连接到虚拟网络。 VM 需要三个不同的专用 IP 地址和两个公共 IP 地址。 IP 地址将分配到以下 IP 配置:

  • IPConfig-1: 分配一个静态 专用 IP 地址和一个静态 公共 IP 地址。

  • IPConfig-2: 分配一个静态 专用 IP 地址和一个静态 公共 IP 地址。

  • IPConfig-3: 分配一个静态 专用 IP 地址,不分配公共 IP 地址。

    多个 IP 地址

创建 NIC 时,IP 配置将关联到 NIC;创建 VM 时,NIC 将附加到 VM。 本方案使用的 IP 地址类型用于演示。 可以根据需要分配任何 IP 地址和指定分配类型。

备注

尽管本文是将所有 IP 配置分配到单个 NIC,但也可以将多个 IP 配置分配到具有多个 NIC 的 VM 中的任意 NIC。 若要了解如何创建具有多个 NIC 的 VM,请阅读创建具有多个 NIC 的 VM一文。

创建具有多个 IP 地址的 VM

下面的步骤说明如何根据方案中所述,创建具有多个 IP 地址的示例虚拟机。 根据实现的需要,需要更改 "" 中的变量值和 IP 地址类型。

备注

请先运行 az cloud set -n AzureChinaCloud 更改云环境,然后才能在 Azure 中国世纪互联中使用 Azure CLI。 若要切换回 Azure 公有云,请再次运行 az cloud set -n AzureCloud

  1. 安装 Azure CLI(如果尚未安装)。
  2. 通过完成为 Linux VM 创建 SSH 公钥和私钥对中的步骤创建适用于 Linux VM 的 SSH 公钥和私钥对。
  3. 从命令行界面使用命令 az login 登录,并选择要使用的订阅。
  4. 通过在 Linux 或 Mac 计算机上执行以下脚本创建 VM。 该脚本创建 1 个资源组、1 个虚拟网络 (VNet)、1 个具有 3 个 IP 配置的 NIC,以及附加 2 个 NIC 的 VM。 NIC、公共 IP 地址、虚拟网络和 VM 资源均必须位于同一位置和订阅。 虽然资源不必都存在于同一资源组中,但是在以下脚本中资源都存在于同一资源组中。

#!/bin/sh

RgName="myResourceGroup"
Location="chinaeast"
az group create --name $RgName --location $Location

# Create a public IP address resource with a static IP address using the `--allocation-method Static` option. If you
# do not specify this option, the address is allocated dynamically. The address is assigned to the resource from a pool
# of IP addresses unique to each Azure region. Download and view the file from
# https://www.microsoft.com/download/confirmation.aspx?id=57062 that lists the ranges for each region.

PipName="myPublicIP"

# This name must be unique within an Azure location.
DnsName="myDNSName"

az network public-ip create \
--name $PipName \
--resource-group $RgName \
--location $Location \
--dns-name $DnsName\
--allocation-method Static

# Create a virtual network with one subnet

VnetName="myVnet"
VnetPrefix="10.0.0.0/16"
VnetSubnetName="mySubnet"
VnetSubnetPrefix="10.0.0.0/24"

az network vnet create \
--name $VnetName \
--resource-group $RgName \
--location $Location \
--address-prefix $VnetPrefix \
--subnet-name $VnetSubnetName \
--subnet-prefix $VnetSubnetPrefix

# Create a network interface connected to the subnet and associate the public IP address to it. Azure will create the
# first IP configuration with a static private IP address and will associate the public IP address resource to it.

NicName="MyNic1"
az network nic create \
--name $NicName \
--resource-group $RgName \
--location $Location \
--subnet $VnetSubnet1Name \
--private-ip-address 10.0.0.4
--vnet-name $VnetName \
--public-ip-address $PipName

# Create a second public IP address, a second IP configuration, and associate it to the NIC. This configuration has a
# static public IP address and a static private IP address.

az network public-ip create \
--resource-group $RgName \
--location $Location \
--name myPublicIP2 \
--dns-name mypublicdns2 \
--allocation-method Static

az network nic ip-config create \
--resource-group $RgName \
--nic-name $NicName \
--name IPConfig-2 \
--private-ip-address 10.0.0.5 \
--public-ip-name myPublicIP2

# Create a third IP configuration, and associate it to the NIC. This configuration has  static private IP address and   # no public IP address.

az network nic ip-config create \
--resource-group $RgName \
--nic-name $NicName \
--private-ip-address 10.0.0.6 \
--name IPConfig-3

# Note: Though this article assigns all IP configurations to a single NIC, you can also assign multiple IP configurations
# to any NIC in a VM. To learn how to create a VM with multiple NICs, read the Create a VM with multiple NICs 
# article: https://docs.azure.cn/virtual-network/virtual-network-deploy-multinic-arm-cli.

# Create a VM and attach the NIC.

VmName="myVm"

# Replace the value for the following **VmSize** variable with a value from the
# https://docs.azure.cn/virtual-machines/sizes article. The script fails if the VM size
# is not supported in the location you select. Run the `azure vm sizes --location chinaeast` command to get a full list
# of VMs in China East, for example.

VmSize="Standard_DS1"

# Replace the value for the OsImage variable value with a value for *urn* from the output returned by entering the
# `az vm image list` command.

OsImage="credativ:Debian:8:latest"

Username="adminuser"

# Replace the following value with the path to your public key file. If you're creating a Windows VM, remove the following
# line and you'll be prompted for the password you want to configure for the VM.

SshKeyValue="~/.ssh/id_rsa.pub"

az vm create \
--name $VmName \
--resource-group $RgName \
--image $OsImage \
--location $Location \
--size $VmSize \
--nics $NicName \
--admin-username $Username \
--ssh-key-value $SshKeyValue

除了创建具有附带 3 个 IP 配置的 NIC 的 VM,该脚本还创建:

  • 单个高级托管磁盘(默认情况下),但对于可以创建的磁盘类型,可以有其他选择。 有关详细信息,请阅读使用 Azure CLI 创建 Linux VM 一文。
  • 一个包含 1 个子网和 2 个公共 IP 地址的虚拟网络。 或者,可以使用 现有 虚拟网络、子网、NIC 或公共 IP 地址资源。 若要了解如何使用现有网络资源,而不是创建其他资源,请输入 az vm create -h

公共 IP 地址会产生少许费用。 有关 IP 地址定价的详细信息,请阅读 IP 地址定价页。 可在一个订阅中使用的公共 IP 地址数有限制。 有关限制的详细信息,请阅读 Azure limits(Azure 限制)一文。

创建 VM 后,输入 az network nic show --name MyNic1 --resource-group myResourceGroup 命令查看 NIC 配置。 输入 az network nic ip-config list --nic-name MyNic1 --resource-group myResourceGroup --output table ,查看与 NIC 关联的 IP 配置的列表。

将专用 IP 地址添加到 VM 操作系统,只需完成本文将 IP 地址添加到 VM 操作系统部分针对操作系统的步骤即可。

将 IP 地址添加到 VM

完成以下步骤可将其他专用和公共 IP 地址添加到现有 Azure 网络接口。 示例根据本文所述的 方案 生成。

  1. 打开命令行界面,并在单个会话中完成本部分的剩余步骤。 如果尚未安装并配置 Azure CLI,请完成 Azure CLI 安装一文中的步骤,并使用 az-login 命令登录到 Azure 帐户。

  2. 根据要求完成以下部分之一中的步骤:

    添加专用 IP 地址

    要将专用 IP 地址添加到 NIC,必须使用以下命令创建 IP 配置。 静态 IP 地址必须是未使用的子网地址。

    az network nic ip-config create \
    --resource-group myResourceGroup \
    --nic-name myNic1 \
    --private-ip-address 10.0.0.7 \
    --name IPConfig-4
    

    使用唯一的配置名称和专用 IP 地址创建任意数目的配置(适用于具有静态 IP 地址的配置)。

    添加公共 IP 地址

    将公共 IP 地址关联到新 IP 配置或现有 IP 配置即可添加它。 根据需要,完成以下任一部分中的步骤。

    公共 IP 地址会产生少许费用。 有关 IP 地址定价的详细信息,请阅读 IP 地址定价页。 可在一个订阅中使用的公共 IP 地址数有限制。 有关限制的详细信息,请阅读 Azure limits(Azure 限制)一文。

    • 将资源关联到新 IP 配置

      每次在新 IP 配置中添加公共 IP 地址时,还必须添加专用 IP 地址,因为所有 IP 配置都必须具有专用 IP 地址。 可添加现有公共 IP 地址资源,也可创建新的公共 IP 地址资源。 若要新建此类资源,请输入以下命令:

      az network public-ip create \
      --resource-group myResourceGroup \
      --location chinaeast \
      --name myPublicIP3 \
      --dns-name mypublicdns3
      

      若要新建具有静态专用 IP 地址和关联的 myPublicIP3 公共 IP 地址资源的 IP 配置,请输入下面的命令:

      az network nic ip-config create \
      --resource-group myResourceGroup \
      --nic-name myNic1 \
      --name IPConfig-5 \
      --private-ip-address 10.0.0.8
      --public-ip-address myPublicIP3
      
    • 将资源关联到现有 IP 配置 公共 IP 地址资源仅可关联到尚未关联公共 IP 地址资源的 IP 配置。 输入以下命令即可确定某个 IP 配置是否具有关联的公共 IP 地址:

      az network nic ip-config list \
      --resource-group myResourceGroup \
      --nic-name myNic1 \
      --query "[?provisioningState=='Succeeded'].{ Name: name, PublicIpAddressId: publicIpAddress.id }" --output table
      

      返回的输出:

      Name        PublicIpAddressId
      
      ipconfig1   /subscriptions/[Id]/resourceGroups/myResourceGroup/providers/Microsoft.Network/publicIPAddresses/myPublicIP1
      IPConfig-2  /subscriptions/[Id]/resourceGroups/myResourceGroup/providers/Microsoft.Network/publicIPAddresses/myPublicIP2
      IPConfig-3
      

      由于输出中 IpConfig-3PublicIpAddressId 列空白,因此其当前未关联公共 IP 地址资源。 可将现有公共 IP 地址资源添加到 IpConfig-3,或输入以下命令进行创建:

      az network public-ip create \
      --resource-group  myResourceGroup
      --location chinaeast \
      --name myPublicIP3 \
      --dns-name mypublicdns3 \
      --allocation-method Static
      

      输入以下命令,将公共 IP 地址资源关联到名为 IPConfig-3 的现有 IP 配置:

      az network nic ip-config update \
      --resource-group myResourceGroup \
      --nic-name myNic1 \
      --name IPConfig-3 \
      --public-ip myPublicIP3
      
  3. 输入以下命令,查看分配给 NIC 的专用 IP 地址和公共 IP 地址资源 ID:

    az network nic ip-config list \
    --resource-group myResourceGroup \
    --nic-name myNic1 \
    --query "[?provisioningState=='Succeeded'].{ Name: name, PrivateIpAddress: privateIpAddress, PrivateIpAllocationMethod: privateIpAllocationMethod, PublicIpAddressId: publicIpAddress.id }" --output table
    

    返回的输出:

    Name        PrivateIpAddress    PrivateIpAllocationMethod   PublicIpAddressId
    
    ipconfig1   10.0.0.4            Static                      /subscriptions/[Id]/resourceGroups/myResourceGroup/providers/Microsoft.Network/publicIPAddresses/myPublicIP1
    IPConfig-2  10.0.0.5            Static                      /subscriptions/[Id]/resourceGroups/myResourceGroup/providers/Microsoft.Network/publicIPAddresses/myPublicIP2
    IPConfig-3  10.0.0.6            Static                      /subscriptions/[Id]/resourceGroups/myResourceGroup/providers/Microsoft.Network/publicIPAddresses/myPublicIP3
    
  4. 根据本文将 IP 地址添加到 VM 操作系统部分中的说明,将添加到 NIC 的专用 IP 地址添加到 VM 操作系统。 请勿向操作系统添加公共 IP 地址。

将 IP 地址添加到 VM 操作系统

连接并登录到使用多个专用 IP 地址创建的 VM。 必须手动添加 VM 中的所有专用 IP 地址(包括主要地址)。 根据 VM 操作系统完成后面的步骤。

Windows Server

展开
  1. 在命令提示符下,键入 ipconfig /all。 只能看到主要专用 IP 地址(通过 DHCP)。

  2. 在命令提示符下键入 ncpa.cpl,打开“网络连接”窗口。

  3. 打开相应适配器的属性:以太网

  4. 双击“Internet 协议版本 4 (IPv4)”。

  5. 单击“使用下面的 IP 地址”并输入以下值:

    • IP 地址:输入主要专用 IP 地址

    • 子网掩码:根据子网设置此值。 例如,如果子网为 /24 子网,则子网掩码为 255.255.255.0。

    • 默认网关:子网中的第一个 IP 地址。 如果子网为 10.0.0.0/24,则网关 IP 地址为 10.0.0.1。

    • 选择“使用下面的 DNS 服务器地址”并输入以下值:

      • 首选 DNS 服务器:如果不使用自己的 DNS 服务器,请输入 168.63.129.16。 如果使用自己的 DNS 服务器,请输入服务器的 IP 地址。 (对于备用 DNS 服务器,你可以选择任何免费的公共 DNS 服务器地址。)
    • 选择“高级”按钮,并添加其他 IP 地址。 将在前面的步骤中添加到 Azure 网络接口的每个辅助专用 IP 地址添加到分配有分配给 Azure 网络接口的主 IP 地址的 Windows 网络接口。

      切勿在虚拟机的操作系统中手动分配已分配给 Azure 虚拟机的公共 IP 地址。 在操作系统中手动设置该 IP 地址时,请确保它与分配给 Azure 网络接口的专用 IP 地址是同一地址,否则可能会丢失与虚拟机的连接。 详细了解专用 IP 地址设置。 绝不要在操作系统中分配 Azure 公共 IP 地址。

    • 单击“确定”关闭“TCP/IP 设置”,并再次单击“确定”关闭适配器设置。 将重新建立 RDP 连接。

  6. 在命令提示符下,键入 ipconfig /all。 验证是否已显示添加的所有 IP 地址,以及是否已关闭 DHCP。

  7. 将 Windows 配置为使用 Azure 中主 IP 配置的专用 IP 地址作为 Windows 的主 IP 地址。 有关详细信息,请参阅无法通过具有多个 IP 地址的 Azure Windows VM 访问 Internet

验证 (Windows Server)

要确保能够从辅助 IP 配置通过与之关联的公共 IP 连接到 Internet,请在通过上述步骤将其正确添加以后,使用以下命令(使用辅助专用 IP 地址替换 10.0.0.7):

ping -S 10.0.0.7 outlook.com

备注

对于辅助 IP 配置,仅当该配置存在关联的公共 IP 地址的情况下,才能 ping Internet。 对于主 IP 配置,不需公共 IP 地址也可 ping Internet。

Linux (Ubuntu 14/16)

展开 我们建议你查看 Linux 分发版的最新文档。
  1. 打开终端窗口。

  2. 请确保以 root 用户身份操作。 否则,请输入以下命令:

    sudo -i
    
  3. 更新网络接口(假设为“eth0”)的配置文件。

    • 保留 dhcp 的现有行项。 主要 IP 地址将保留以前的配置。

    • 使用以下命令添加其他静态 IP 地址的配置:

      cd /etc/network/interfaces.d/
      ls
      

      应会看到一个 .cfg 文件。

  4. 打开 文件。 该文件的末尾应会显示以下命令行:

    auto eth0
    iface eth0 inet dhcp
    
  5. 在此文件包含的命令行后面添加以下命令行:

    iface eth0 inet static
    address <your private IP address here>
    netmask <your subnet mask>
    
  6. 使用以下命令保存该文件:

    :wq
    
  7. 使用以下命令重置网络接口:

    sudo ifdown eth0 && sudo ifup eth0
    

    重要

    如果使用远程连接,请在同一行中同时运行 ifdown 和 ifup。

  8. 使用以下命令验证 IP 地址是否已添加到网络接口:

    ip addr list eth0
    

    应会在列表中看到添加的 IP 地址。

验证 (Ubuntu 14/16)

要确保能够从辅助 IP 配置通过与之关联的公共 IP 连接到 Internet,请使用以下命令:

ping -I 10.0.0.5 outlook.com

备注

对于辅助 IP 配置,仅当该配置存在关联的公共 IP 地址的情况下,才能 ping Internet。 对于主 IP 配置,不需公共 IP 地址也可 ping Internet。

对于 Linux VM,在尝试验证来自辅助 NIC 的出站连接时,可能需要添加适当的路由。 可通过多种方式来执行此操作。 请参阅针对 Linux 分发的相应文档。 下面是实现此目的的一种方法:

echo 150 custom >> /etc/iproute2/rt_tables 

ip rule add from 10.0.0.5 lookup custom
ip route add default via 10.0.0.1 dev eth2 table custom

  • 确保将
    • 10.0.0.5 替换为专用 IP 地址,该地址有一个与之关联的公共 IP 地址。
    • 10.0.0.1 替换为默认网关
    • eth2 替换为辅助 NIC 的名称

Linux (Ubuntu 18.04+)

展开 Ubuntu 18.04 及更高版本已更改为用于 OS 网络管理的 `netplan`。 我们建议你查看 Linux 分发版的最新文档。
  1. 打开终端窗口。

  2. 请确保以 root 用户身份操作。 否则,请输入以下命令:

    sudo -i
    
  3. 为第二个接口创建一个文件,并在文本编辑器打开该文件:

    vi /etc/netplan/60-static.yaml
    
  4. 将以下行添加到文件中,并将 10.0.0.6/24 替换为 IP/网络掩码:

    network:
        version: 2
        ethernets:
            eth0:
                addresses:
                    - 10.0.0.6/24
    
  5. 使用以下命令保存该文件:

    :wq
    
  6. 使用 netplan try 验证语法来测试更改:

    netplan try
    

    备注

    netplan try 将暂时应用更改,并在 120 秒后回退更改。 如果连接中断,请等待 120 秒,然后重新连接。 此时更改已回退。

  7. 假设 netplan try 没有问题,请应用配置更改:

    netplan apply
    
  8. 使用以下命令验证 IP 地址是否已添加到网络接口:

    ip addr list eth0
    

    应会在列表中看到添加的 IP 地址。 示例:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:0d:3a:8c:14:a5 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
        valid_lft forever preferred_lft forever
        inet 10.0.0.4/24 brd 10.0.0.255 scope global secondary eth0
        valid_lft forever preferred_lft forever
        inet6 fe80::20d:3aff:fe8c:14a5/64 scope link
        valid_lft forever preferred_lft forever
    

验证 (Ubuntu 18.04+)

要确保能够从辅助 IP 配置通过与之关联的公共 IP 连接到 Internet,请使用以下命令:

ping -I 10.0.0.5 outlook.com

备注

对于辅助 IP 配置,仅当该配置存在关联的公共 IP 地址的情况下,才能 ping Internet。 对于主 IP 配置,不需公共 IP 地址也可 ping Internet。

对于 Linux VM,在尝试验证来自辅助 NIC 的出站连接时,可能需要添加适当的路由。 可通过多种方式来执行此操作。 请参阅针对 Linux 分发的相应文档。 下面是实现此目的的一种方法:

echo 150 custom >> /etc/iproute2/rt_tables 

ip rule add from 10.0.0.5 lookup custom
ip route add default via 10.0.0.1 dev eth2 table custom

  • 确保将
    • 10.0.0.5 替换为专用 IP 地址,该地址有一个与之关联的公共 IP 地址。
    • 10.0.0.1 替换为默认网关
    • eth2 替换为辅助 NIC 的名称

Linux(Red Hat、CentOS 和其他操作系统)

展开
  1. 打开终端窗口。

  2. 请确保以 root 用户身份操作。 否则,请输入以下命令:

    sudo -i
    
  3. 输入密码,根据提示的说明操作。 切换为 root 用户后,使用以下命令导航到网络脚本文件夹:

    cd /etc/sysconfig/network-scripts
    
  4. 使用以下命令列出相关的 ifcfg 文件:

    ls ifcfg-*
    

    应会看到其中一个文件是 ifcfg-eth0

  5. 若要添加 IP 地址,请为其创建配置文件,如下所示。 请注意,必须为每个 IP 配置创建一个文件。

    touch ifcfg-eth0:0
    
  6. 使用以下命令打开 ifcfg-eth0:0 文件:

    vi ifcfg-eth0:0
    
  7. 使用以下命令将内容添加到该文件(此示例中为 eth0:0)。 请务必更新基于 IP 地址的信息。

    DEVICE=eth0:0
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=192.168.101.101
    NETMASK=255.255.255.0
    
  8. 使用以下命令保存该文件:

    :wq
    
  9. 运行以下命令重新启动网络服务,确保更改成功:

    /etc/init.d/network restart
    ifconfig
    

    应会在返回的列表中看到添加的 IP 地址 eth0:0

验证(Red Hat、CentOS 和其他操作系统)

要确保能够从辅助 IP 配置通过与之关联的公共 IP 连接到 Internet,请使用以下命令:

ping -I 10.0.0.5 outlook.com

备注

对于辅助 IP 配置,仅当该配置存在关联的公共 IP 地址的情况下,才能 ping Internet。 对于主 IP 配置,不需公共 IP 地址也可 ping Internet。

对于 Linux VM,在尝试验证来自辅助 NIC 的出站连接时,可能需要添加适当的路由。 可通过多种方式来执行此操作。 请参阅针对 Linux 分发的相应文档。 下面是实现此目的的一种方法:

echo 150 custom >> /etc/iproute2/rt_tables 

ip rule add from 10.0.0.5 lookup custom
ip route add default via 10.0.0.1 dev eth2 table custom

  • 确保将
    • 10.0.0.5 替换为专用 IP 地址,该地址有一个与之关联的公共 IP 地址。
    • 10.0.0.1 替换为默认网关
    • eth2 替换为辅助 NIC 的名称