配置别名 IP 范围

本文档介绍如何使用 Google Cloud 控制台和 Google Cloud CLI 来配置别名 IP 地址和别名 IP 地址范围。在执行这些命令之前,请查看别名 IP 地址范围

限制

子网

  • 每个网络的限制说明了您可以为每个子网定义的次要范围的数量上限。
  • 您不能同时添加和移除次要范围。添加和移除步骤必须分开执行。
  • 次要范围不支持 CIDR 扩展。

虚拟机实例

  • 所有虚拟机网络接口都支持别名 IP 范围。对于主要网络接口上的别名 IP 范围,系统会自动配置路由,但不会为次要接口自动配置。如果您具有多个网络接口,则必须为其他接口配置政策路由
  • 可以添加或删除别名 IP 范围,但不能进行更新。
  • 如果从一台虚拟机中移除一个别名 IP 范围并将其分配给另一台虚拟机,该转变可能需要一分钟时间才能完成。
  • 别名 IP 地址不支持防火墙来源标记。也就是说,在防火墙规则中配置来源标记时,来源标记与虚拟机主要 IP 地址匹配,但与别名 IP 地址不匹配。 可使用来源范围来允许或拒绝来自别名 IP 地址的入站流量。
  • 内部 DNS 将虚拟机名称解析为其主要 IP。别名 IP 的其他名称不会自动配置,但可以手动添加。

VPC 网络

  • 同时添加或移除大量别名 IP 范围可能需要很长时间。例如,添加或删除 7000 个别名 IP 范围可能需要长达 10 分钟时间。
  • 如果存在次要子网范围,则无法删除自动模式 VPC 网络。
  • 在静态路由中,下一个跃点 IP 地址必须是虚拟机的主要 IP 地址。系统不支持将别名 IP 地址用作下一个跃点 IP 地址。
  • 系统不支持 IPv6 地址。
  • 只有 VPC 网络中支持别名 IP 范围,旧版网络不提供该支持。如需确定您的网络类型,请列出您的网络。VPC 网络具有 customauto 模式。旧版网络具有 legacy 模式。

子网命令

虚拟机别名 IP 范围必须分配自虚拟机所在子网所拥有的范围。所有子网都有一个主要范围,这是定义子网的内部 IP 地址的标准范围。子网也可能具有内部 IP 地址的一个或多个次要 IP 范围。您可以从子网的主要或次要范围分配别名 IP 范围。

您必须为每个次要范围指定一个对子网唯一的名称。为虚拟机分配别名 IP 范围时,次要范围名称会告知 Google Cloud 从哪个子网范围分配别名 IP。

所有主要和次要范围在 VPC 网络中的所有子网间都必须唯一,并且在通过 VPC 网络对等互连、VPN 或互连连接的任何网络中也必须唯一。

本部分介绍如何创建具有次要范围的子网、如何向现有子网添加次要范围,以及如何从子网中移除次要范围。在子网具有您想要使用的范围之后,请参阅虚拟机实例命令,了解有关将一个范围分配给虚拟机的说明。

创建具有一个或多个次要 CIDR 范围的子网

该命令假定您已经有 VPC 网络。如果还没有,请先创建一个 VPC 网络。

无论您是为虚拟机的主要接口还是某个次要接口创建子网,此命令都是相同的。

如果为别名 IP 分配使用次要范围,您就可以将用于虚拟机中托管的服务的 IP 空间分离出来,从而更轻松地创建防火墙规则,仅允许访问虚拟机上运行的服务,禁止访问虚拟机的主要 IP 地址。

控制台

  1. 转到 Google Cloud 控制台中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击现有网络的名称。
  3. 点击添加子网
  4. 为新子网输入一个名称
  5. 指定区域
  6. 以 CIDR 表示法输入 IP 地址范围。(示例:10.65.61.0/24)
  7. 点击创建次要 IP 范围
  8. 输入一个子网范围名称
  9. 以 CIDR 表示法输入次要 IP 范围。(示例:10.9.0.0/24)
  10. 要添加额外的次要 IP 范围,请针对每个范围点击添加 IP 范围,然后提供名称和范围。
  11. 点击添加

gcloud

gcloud compute networks subnets create s1 \
    --network NETWORK_NAME \
    --region REGION \
    --range 10.65.61.0/24 \
    --secondary-range RANGE_NAME_1=RANGE_CIDR_1,RANGE_NAME_2=RANGE_CIDR_2,...

请替换以下内容:

  • NETWORK_NAME:网络名称,您将在其中创建子网。
  • REGION:您要在该区域创建子网。
  • RANGE_NAME_1=RANGE_CIDR_1RANGE_NAME_2=RANGE_CIDR_2:次要范围名称(您从中获取别名 IP 范围)和别名 IP 范围本身,例如 range1=10.9.0.0/24

如需了解完整的语法,请参阅 gcloud CLI 文档

API

创建具有一个或多个次要范围的子网。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
{
  "ipCidrRange": "PRIMARY_IP_RANGE",
  "network": "NETWORK_URL",
  "name": "SUBNET_NAME",
  "secondaryIpRanges": [
  {
    "rangeName": "SECONDARY_RANGE_NAME_1",
    "ipCidrRange": "SECONDARY_IP_RANGE_1"
  },
  {
    "rangeName": "SECONDARY_RANGE_NAME_2",
    "ipCidrRange": "SECONDARY_IP_RANGE_2"
  },
  ...]
}

请替换以下内容:

  • NETWORK_URL:网址或 VPC 网络,您将在其中创建子网。
  • PRIMARY_IP_RANGE:子网的主要 IP 地址范围。
  • PROJECT_ID:项目 ID,包含将创建子网的 VPC 网络。
  • REGION:子网所在的区域。
  • SECONDARY_IP_RANGE_1SECONDARY_IP_RANGE_2:要用于次要范围的 IP 地址范围。
  • SECONDARY_RANGE_NAME_1SECONDARY_RANGE_NAME_2:要用于次要范围的名称。
  • SUBNET_NAME:子网的名称。

如需了解详情,请参阅 subnetworks.insert 方法。

Terraform

您可以使用 Terraform 资源创建具有一个或多个次要范围的子网。

Terraform 参数具有可以更改的示例值。

resource "google_compute_subnetwork" "network-with-private-secondary-ip-ranges" {
  project       = var.project_id # Replace this with your project ID in quotes
  name          = "test-subnetwork"
  ip_cidr_range = "10.2.0.0/16"
  region        = "us-central1"
  network       = "test-vpc-network"
  secondary_ip_range {
    range_name    = "tf-test-secondary-range-update1"
    ip_cidr_range = "192.168.10.0/24"
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

向现有子网添加次要 CIDR 范围

此过程假定您有一个要使用的子网,但您需要添加一个或多个次要范围。

如果为别名 IP 分配使用次要范围,那么就可以更轻松地创建防火墙规则来允许访问虚拟机上运行的服务,并禁止访问虚拟机的主要 IP 地址。

控制台

  1. 转到 Google Cloud 控制台中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击要修改的子网的名称以查看其详情页面。
  3. 点击修改
  4. 次要 IP 范围部分中,点击添加 IP 范围
  5. 输入一个名称作为子网范围名称
  6. 以 CIDR 表示法输入一个范围作为次要 IP 范围。(示例:10.9.0.0/24
  7. 如需添加额外的次要 IP 范围,请针对每个范围点击添加 IP 范围,然后提供名称和范围。
  8. 点击保存

gcloud

gcloud compute networks subnets update SUBNET_NAME \
    --region REGION \
    --add-secondary-ranges RANGE_NAME_1=RANGE_CIDR_1,RANGE_NAME_2=RANGE_CIDR_2,...

请替换以下内容:

  • SUBNET_NAME:您要添加次要范围的子网的名称。
  • REGION:您要在该区域创建子网。
  • RANGE_NAME_1=RANGE_CIDR_1RANGE_NAME_2=RANGE_CIDR_2:次要范围名称(您从中获取别名 IP 范围)和别名 IP 范围本身,例如 range1=10.9.0.0/24

如需了解完整的语法,请参阅 gcloud CLI 文档

API

向现有子网添加次要范围。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
{
  "secondaryIpRanges": [
  {
    "rangeName": "SECONDARY_RANGE_NAME_1",
    "ipCidrRange": "SECONDARY_IP_RANGE_1"
  },
  {
    "rangeName": "SECONDARY_RANGE_NAME_2",
    "ipCidrRange": "SECONDARY_IP_RANGE_2"
  },
  ...],
  "fingerprint": "SUBNETWORK_FINGERPRINT"
}

请将占位符替换为有效值:

  • PROJECT_ID 是包含所要修改子网的项目的 ID。
  • REGION 是子网所在的地区。
  • SECONDARY_IP_RANGE_1SECONDARY_IP_RANGE_2 是要用于次要范围的 IP 地址范围。
  • SECONDARY_RANGE_NAME_1SECONDARY_RANGE_NAME_2 是要用于次要范围的名称
  • SUBNET_FINGERPRINT 是现有子网的指纹 ID,由您在描述子网时提供。
  • SUBNET_NAME 是要修改的子网的名称。

如需了解详情,请参阅 subnetworks.patch 方法。

从子网中移除次要 CIDR 范围

您可以从子网中移除现有次要范围。如需查看与子网关联的范围,请参阅描述子网

控制台

  1. 转到 Google Cloud 控制台中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击要修改的子网的名称以查看其详情页面。
  3. 点击修改
  4. 次要 IP 范围部分中,点击要移除的次要范围旁边的 X
  5. 点击保存

gcloud

gcloud compute networks subnets update SUBNET_NAME \
    --region REGION \
    --remove-secondary-ranges RANGE_NAME_1,RANGE_NAME_2,...

其中

  • SUBNET_NAME 是您要从中移除次要范围的子网的名称。
  • REGION 是您正在其中创建子网的地区。
  • RANGE_NAME_1RANGE_NAME_2 是将从目标子网 SUBNET_NAME 中移除的次要范围的名称,例如 range1=10.9.0.0/24

如需了解完整的语法,请参阅 gcloud CLI 文档

API

排除次要范围以将其移除。以下示例将从一个现有子网中移除所有次要范围:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
{
  "fingerprint": "SUBNET_FINGERPRINT",
  "secondaryIpRanges": [
  ]
}

请将占位符替换为有效值:

  • PROJECT_ID 是包含所要修改子网的项目的 ID。
  • REGION 是子网所在的区域。
  • SUBNET_FINGERPRINT 是现有子网的指纹 ID,由您在描述子网时提供。
  • SUBNET_NAME 是要修改的子网的名称。

如需了解详情,请参阅 subnetworks.patch 方法。

使用虚拟机实例

这些命令展示了如何创建具有别名 IP 范围的实例,向现有虚拟机实例添加一个或多个别名 IP 范围,或从现有虚拟机实例中移除一个或多个范围。

在主要 CIDR 范围内创建具有别名 IP 范围的虚拟机

如果要从子网的主要范围分配别名 IP 范围,请按此过程操作。您不能选择已被 VPC 网络上的其他资源使用的范围,即便是部分使用也不行。

如果您希望实例的主要接口和别名 IP 地址在相同范围内,请按以下过程操作。

控制台

  1. 转到 Google Cloud 控制台中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 为新实例输入名称
  4. 指定地区
  5. 点击管理、安全、磁盘、网络、单独租用
  6. 点击网络标签页。
  7. 点击网络接口部分主要接口旁边的“修改”(铅笔图标)按钮。
  8. 点击显示别名 IP 范围
  9. 子网范围设置保留为主要
  10. 以 CIDR 表示法输入别名 IP 范围。此范围必须是主要范围中未使用的子范围。
  11. 点击创建

gcloud

gcloud compute instances create vm1 \
    --zone ZONE \
    --network-interface "subnet=SUBNET_NAME,aliases=RANGE_CIDR_1;RANGE_CIDR_2,..."

其中

  • ZONE 是包含实例的区域。
  • SUBNET_NAME 是包含该实例的子网的名称。
  • RANGE_CIDR_1RANGE_CIDR_2 是主要子网中要分配给接口的 IP 范围。这些范围可以是特定范围 (192.168.100.0/24)、单个 IP 地址 (192.168.100.1) 或采用 CIDR 格式 (/24) 的网络掩码。如果 IP 范围仅由网络掩码指定,则 IP 分配器会选择具有指定网络掩码的可用范围,并将其分配给相应网络接口。如需指定多个范围,请用英文分号 (;) 分隔各个范围。

如需了解完整的语法,请参阅 gcloud CLI 文档

API

使用实例子网的主要 IP 地址范围内的别名 IP 地址创建实例。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "networkInterfaces": [
    {
      "aliasIpRanges": [
        {
          "ipCidrRange": "CIDR_RANGE"
        }
      ]
    },
    ...
  ],
  ...
}

请将占位符替换为有效值:

  • PROJECT_ID 是您在其中创建实例的项目的 ID。
  • CIDR_RANGE 是主要子网中要分配给接口的 IP 范围。此范围可以是特定范围 (192.168.100.0/24)、单个 IP 地址 (192.168.100.1) 或采用 CIDR 格式 (/24) 的网络掩码。如果 IP 范围仅由网络掩码指定,则 IP 地址分配器会选择具有指定网络掩码的可用范围并将其分配给相应网络接口。
  • ZONE 是将在其中创建实例的 Google Cloud 区域。

如需了解详情,请参阅 instance.insert 方法。

在次要 CIDR 范围内创建具有别名 IP 范围的虚拟机

如果要分配取自子网次要范围的别名 IP 范围,请按以下过程操作。将别名 IP 范围与子网的主要范围分开,可以更轻松地创建防火墙规则来允许访问虚拟机上运行的服务,但不允许访问虚拟机的主要 IP 地址。

控制台

  1. 转到 Google Cloud 控制台中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 为新实例输入名称
  4. 指定地区
  5. 点击管理、安全、磁盘、网络、单独租用
  6. 点击网络标签页。
  7. 点击网络接口部分主要接口旁边的“修改”(铅笔图标)按钮。
  8. 点击显示别名 IP 范围
  9. 选择具有次要范围的子网
  10. 子网范围下,选择您要使用的次要 IP 范围
  11. 以 CIDR 表示法输入别名 IP 范围。此范围必须是次要 IP 范围中未使用的子范围。
  12. 点击创建

gcloud

gcloud compute instances create vm3 \
    --zone ZONE \
    --network-interface subnet=SUBNET_NAME,aliases=RANGE_NAME:RANGE_CIDR
 

其中

  • ZONE 是包含该实例的区域。
  • SUBNET_NAME 是包含该实例的子网的名称。
  • RANGE_NAME 是要从中获取别名 IP 范围的子网次要范围的名称。
  • RANGE_CIDR 是分配给接口的 IP 范围。此范围可以是特定范围 (192.168.100.0/24)、单个 IP 地址 (192.168.100.1) 或采用 CIDR 格式 (/24) 的网络掩码。如果 IP 范围仅由网络掩码指定,则 IP 分配器会选择具有指定网络掩码的可用范围,并将其分配给相应网络接口。

如需了解完整的语法,请参阅 gcloud 文档

API

使用实例子网的次要 IP 地址范围内的别名 IP 地址创建实例。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "networkInterfaces": [
    {
      "aliasIpRanges": [
        {
          "ipCidrRange": "SECONDARY_CIDR_RANGE",
          "subnetworkRangeName": "SECONDARY_RANGE_NAME"
        }
      ]
    },
    ...
  ],
  ...
}

请将占位符替换为有效值:

  • PROJECT_ID 是您在其中创建实例的项目的 ID。
  • SECONDARY_CIDR_RANGE 是分配给接口的 IP 范围。此范围可以是特定范围 (192.168.100.0/24)、单个 IP 地址 (192.168.100.1) 或采用 CIDR 格式 (/24) 的网络掩码。如果 IP 范围仅由网络掩码指定,则 IP 地址分配器会选择具有指定网络掩码的可用范围并将其分配给相应网络接口。
  • SECONDARY_RANGE_NAME 是要从中获取别名 IP 范围的子网次要范围的名称。
  • ZONE 是将在其中创建实例的 Google Cloud 区域。

如需了解详情,请参阅 instance.insert 方法。

创建具有多个接口和别名 IP 地址的虚拟机

本示例创建两个网络,每个网络都有一个子网,以及一台在两个网络中都有接口的虚拟机。如果您已经有两个 VPC 网络,则可以跳到“创建虚拟机实例”步骤。

控制台

创建第一个网络和子网:

  1. 转到 Google Cloud 控制台中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 输入 my-network1 作为名称
  4. 子网创建模式设置为 Custom,指定 my-subnet1 作为子网名称
  5. 指定一个区域
  6. IP 地址范围设置为 172.16.1.0/24
  7. 点击创建次要 IP 范围
  8. 子网范围名称设置为 range1
  9. 次要 IP 范围设置为 10.1.0.0/16
  10. 点击完成
  11. 点击创建

创建第二个网络和子网:

  1. 转到 Google Cloud 控制台中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 输入 my-network2 作为名称
  4. 子网创建模式设置为 Custom,指定 my-subnet2 作为子网名称
  5. 指定与第一个网络和子网相同的区域
  6. IP 地址范围设置为 172.16.2.0/24
  7. 点击创建次要 IP 范围
  8. 子网范围名称设置为 range2
  9. 次要 IP 范围设置为 10.2.0.0/16
  10. 点击完成
  11. 点击创建

创建一台在两个网络中都有接口的虚拟机:

  1. 转到 Google Cloud 控制台中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 将地区设置为您创建子网的区域。
  4. 点击管理、安全、磁盘、网络、单独租用
  5. 点击网络
  6. 点击第一个网络接口。
  7. 网络设置为 my-network1
  8. 子网设置为 my-subnet1
  9. 点击显示别名 IP 范围
  10. 点击添加别名 IP 范围
  11. 子网范围设置为 Primary
  12. 别名 IP 范围设置为 /32
  13. 点击添加 IP 范围
  14. 子网范围设置为 range1
  15. 别名 IP 范围设置为 /24
  16. 点击完成
  17. 点击添加网络接口
  18. 选择 my-network2
  19. 子网设置为 my-subnet2
  20. 点击显示别名 IP 范围
  21. 点击添加别名 IP 范围
  22. 子网范围设置为 Primary
  23. 别名 IP 范围设置为 /32
  24. 点击添加 IP 范围
  25. 子网范围设置为 range2
  26. 输入 /24 作为别名 IP 范围
  27. 点击完成
  28. 点击创建

gcloud

  1. 创建第一个网络:

    gcloud compute networks create my-network1 --subnet-mode CUSTOM
    
  2. 添加子网:

    gcloud compute networks subnets create my-subnet1 \
        --network my-network1 \
        --range 172.16.1.0/24 \
        --secondary-range range1=10.1.0.0/16
    
  3. 创建第二个网络:

    gcloud compute networks create my-network2 --subnet-mode CUSTOM
    
  4. 添加子网:

    gcloud compute networks subnets create my-subnet2 \
        --network my-network2 \
        --range 172.16.2.0/24 \
        --secondary-range range2=10.2.0.0/16
    
  5. 创建一台在两个网络中都有接口的虚拟机。列出的第一个网络接口(my-subnet1 中的接口)是主要接口:

    gcloud compute instances create multi-nic-alias-vm \
        --machine-type f1-micro \
        --network-interface "subnet=my-subnet1,aliases=/32;range1:/24" \
        --network-interface "subnet=my-subnet2,aliases=/32;range2:/24"
    
  6. 使用 display 命令查看接口及其地址:

    gcloud compute instances describe multi-nic-alias-vm
    
    ...
    networkInterfaces:
    - ...
      aliasIpRanges:
      - ipCidrRange: 172.16.1.2/32
      - ipCidrRange: 10.1.0.0/24
        subnetworkRangeName: range1
      name: nic0
      network: .../networks/my-network1
      networkIP: 172.16.1.3
      subnetwork: .../subnetworks/my-subnet1
      ...
    - ...
      aliasIpRanges:
      - ipCidrRange: 172.16.2.2/32
      - ipCidrRange: 10.2.0.0/24
        subnetworkRangeName: range2
      name: nic1
      network: .../networks/my-network2
      networkIP: 172.16.2.3
      subnetwork: .../subnetworks/my-subnet2
      

API

  1. 创建名为 my-network1my-network2 的两个自定义模式 VPC 网络。如需了解详情,请参阅创建自定义模式网络

  2. 将子网添加到 VPC 网络。如需了解详情,请参阅添加子网

    1. 将名为 my-subnet1 的子网添加到 my-network1。为主要范围指定 172.16.1.0/24,为名为 range1 的次要范围指定 10.1.0.0/16

    2. 将名为 my-subnet2 的子网添加到 my-network2。为主要范围指定 172.16.2.0/24,为名为 range2 的次要范围指定 10.2.0.0/16

  3. 创建一个虚拟机实例,该实例在两个网络中都有接口。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
      "networkInterfaces": [
        {
          "subnetwork": "projects/PROJECT_ID/regions/REGION/subnetworks/my-subnet1",
          "aliasIpRanges": [
            {
              "ipCidrRange": "/32",
            },
            {
              "subnetworkRangeName": "range1",
              "ipCidrRange": "/24"
            }
          ]
        },
        {
          "subnetwork": "projects/PROJECT_ID/regions/REGION/subnetworks/my-subnet2",
          "aliasIpRanges": [
            {
              "ipCidrRange": "/32",
            },
            {
              "subnetworkRangeName": "range2",
              "ipCidrRange": "/24"
            }
          ]
        }
      ],
      ...
    }
    

    请将占位符替换为有效值:

    • PROJECT_ID 是您在其中创建实例的项目的 ID。
    • REGION 是子网所在的 Google Cloud 地区。子网必须与实例位于同一地区。
    • ZONE 是将在其中创建实例的 Google Cloud 区域。

    如需了解详情,请参阅 instance.insert 方法。

向现有实例添加别名 IP 范围

您可以向正在运行的实例添加别名 IP 范围。

即使在 API 调用完成后,新地址可能也无法立即可用,只有在客机操作系统添加地址和路由后才可用。

控制台

  1. 转到 Google Cloud 控制台中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击现有实例的名称。
  3. 点击修改
  4. 点击网络接口 nic0(或您要向其添加别名 IP 范围的网络接口)。
  5. 点击显示别名 IP 范围
  6. 点击添加 IP 范围
  7. 选择一个子网范围
  8. 输入一个别名 IP 范围。
  9. 点击完成
  10. 点击保存

gcloud

gcloud compute instances network-interfaces update INSTANCE_NAME \
    --zone ZONE \
    [--network-interface NETWORK_INTERFACE; default="nic0"]
    --aliases "RANGE_NAME_1:RANGE_CIDR_1;RANGE_NAME_2:RANGE_CIDR_2;..."

请替换以下内容:

  • ZONE 是包含实例的可用区。
  • NETWORK_INTERFACE 是您要向其中添加别名 IP 地址范围的网络接口的名称。
  • RANGE_NAME_1RANGE_NAME_2 是子网次要范围的名称,您从中获取别名 IP 范围。如果您要从子网的主要范围中分配范围,请省略此值。
  • RANGE_CIDR_1RANGE_CIDR_2 是分配给接口的 IP 范围。这些范围可以是特定范围 (192.168.100.0/24)、单个 IP 地址 (192.168.100.1) 或采用 CIDR 格式 (/24) 的网络掩码。如果 IP 范围仅由网络掩码指定,则 IP 分配器会选择具有指定网络掩码的可用范围,并将其分配给相应网络接口。

如需了解完整的语法,请参阅 gcloud 文档

API

向现有实例添加别名 IP 范围。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/multinic/updateNetworkInterface?networkInterface=NETWORK_INTERFACE_NAME
{
  "aliasIpRanges": [
    {
      "ipCidrRange": "SECONDARY_IP_RANGE",
      "subnetworkRangeName": "SECONDARY_RANGE_NAME"
    },
    existing ranges...
  ],
  "fingerprint": "INTERFACE_FINGERPRINT"
}

请将占位符替换为有效值:

  • PROJECT_ID 是包含要修改实例的项目的 ID。
  • NETWORK_INTERFACE_NAME 是要修改的实例网络接口名称。
  • INTERFACE_FINGERPRINT 是现有网络接口的指纹 ID,由您在描述实例时提供。
  • SECONDARY_CIDR_RANGE 是分配给接口的 IP 范围。此范围可以是特定范围 (192.168.100.0/24)、单个 IP 地址 (192.168.100.1) 或采用 CIDR 格式 (/24) 的网络掩码。如果 IP 范围仅由网络掩码指定,则 IP 地址分配器会选择具有指定网络掩码的可用范围并将其分配给相应网络接口。
  • SECONDARY_RANGE_NAME 是从中获取别名 IP 范围的子网次要范围的名称。如果您要从子网的主要范围中分配范围,请省略此字段。
  • ZONE 是将在其中创建实例的 Google Cloud 区域。

如需了解详情,请参阅 instance.updateNetworkInterface 方法。

修改现有实例的别名 IP 范围

您可以向现有实例添加更多别名 IP 范围,也可以移除一个或多个范围。

地址更改可能不会立即显示。API 调用必须完成,并且客机操作系统必须修改地址和路由。

控制台

  1. 转到 Google Cloud 控制台中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击现有实例的名称。
  3. 点击修改
  4. 点击网络接口 nic0(或您要修改的网络接口)。
  5. 点击显示别名 IP 范围
  6. 要添加别名 IP 范围,请点击添加别名 IP 范围
  7. 如需移除别名 IP 范围,请点击别名 IP 范围旁边的 X
  8. 点击完成
  9. 点击保存

gcloud

gcloud compute instances network-interfaces update INSTANCE_NAME \
    --zone ZONE \
    [--network-interface NETWORK_INTERFACE; default="nic0"]
    --aliases "RANGES_TO_RETAIN;NEW_RANGE_NAME:NEW_RANGE_CIDR;..."
  • ZONE 是包含实例的区域。
  • NETWORK_INTERFACE 是您要修改的网络接口的名称。
  • RANGES_TO_RETAIN 是您要保留的现有范围(CURRENT_RANGE_NAMECURRRENT_RANGE_CIDR格式)。如果您为没有范围的实例添加范围,这些值将为空。如果您要从实例中移除所有范围,则整个 --aliases 字段将为空。
  • NEW_RANGE_NAME 是要从中获取新别名 IP 范围的子网次要范围的名称。如果您要从子网的主要范围中分配范围,请省略此值。
  • NEW_RANGE_CIDR 是分配给接口的 IP 范围。此范围可以是特定范围 (192.168.100.0/24)、单个 IP 地址 (192.168.100.1) 或采用 CIDR 格式 (/24) 的网络掩码。如果 IP 范围仅由网络掩码指定,则 IP 分配器会选择具有指定网络掩码的可用范围,并将其分配给相应网络接口。

如需添加范围,请运行如下命令并指定全部现有和新的别名 IP 范围。用英文分号分隔各对。示例:--aliases "CURRENT_RANGE_NAME:CURRRENT_RANGE_CIDR;NEW_RANGE_NAME:NEW_RANGE_CIDR"

如需移除范围,请运行该命令,仅需指定要保留的别名 IP 范围。如果将范围与次要范围分隔开来,则必须指定次要范围的名称。CIDR 范围可以是特定范围 (192.168.100.0/24) 或单个 IP 地址 (192.168.100.1)。示例:--aliases "RANGE_NAME:RANGE_CIDR;RANGE_CIDR"

如需移除所有范围,请运行该命令并指定 --aliases 标志,但使用英文引号提供空白输入。示例:--aliases ""

您无法在同一个 gcloud 命令中添加和移除范围。如需使用 Google Cloud CLI 移除一些范围并添加另一些范围,请先运行该命令移除不需要的范围,然后再次运行该命令添加所需的范围。

如需了解完整的语法,请参阅 gcloud 文档

API

对于现有实例的网络接口,添加或移除别名 IP 地址范围。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/multinic/updateNetworkInterface?networkInterface=NETWORK_INTERFACE_NAME
{
  "aliasIpRanges": [
    include new and existing ranges to add them...
    exclude existing ranges to remove them...
  ],
  "fingerprint": "INTERFACE_FINGERPRINT"
}

请将占位符替换为有效值:

  • PROJECT_ID 是包含要修改实例的项目的 ID。
  • NETWORK_INTERFACE_NAME 是要修改的实例网络接口名称。
  • INTERFACE_FINGERPRINT 是现有网络接口的指纹 ID,由您在描述实例时提供。

如需了解详情,请参阅 instance.updateNetworkInterface 方法。

问题排查

无法创建具有别名 IP 的虚拟机实例

  1. 验证网络是否属于 VPC 网络。旧版网络不支持别名 IP。

    gcloud compute networks list --filter="name=NETWORK_NAME"
    

    网络 MODE 应该是“auto”或“custom”。

  2. 如果指定了子网范围名称,请验证以下内容:

    gcloud compute networks subnets describe SUBNET_NAME --region=REGION
    
    • 该子网拥有使用相应名称的次要范围
    • 所请求的别名 IP 范围在该次要范围内;或者如果使用网络掩码,则验证其是否小于主要范围。
  3. 如果未指定子网范围名称,验证所请求的别名 IP 范围是否在主要子网范围内;或者如果使用网络掩码,则验证其是否小于主要范围。

无法连接到别名 IP

  1. 验证防火墙规则。

    1. 列出所有防火墙规则:

      gcloud compute firewall-rules list --format=json
      
    2. 验证是否允许向别名 IP 传入或从中传出流量。

    3. 如有必要,添加防火墙规则以允许 ping 别名 IP:

      gcloud compute firewall-rules create FIREWALL_NAME1 \
        --network NETWORK_NAME --priority 0 --source-ranges ALIAS_IP \
        --allow icmp
      
      gcloud compute firewall-rules create FIREWALL_NAME2 \
        --network NETWORK_NAME --priority 0 --direction out \
        --destination-ranges ALIAS_IP --allow icmp
      
  2. 确保虚拟机将 IP 别名范围识别为本地。在 Debian 等 Linux 发行版上,通常可以按如下方式执行此操作。

    1. 连接到实例并运行以下命令:

      ip route show table local
      

      输出应该包含以下内容:

      local ALIAS_IP_RANGE dev eth0  proto 66  scope host
      
    2. 确保在 /etc/default/instance_configs.cfgip_aliases = true。 如果您需要对此进行更改,则还必须重启客机代理:

      systemctl restart google-guest-agent
      
    3. 如果本地路由不存在,则使用以下命令进行配置:

      ip route add to local ALIAS_IP_RANGE dev eth0 proto 66
      

自动启动服务未绑定到别名 IP 地址

在支持的 Linux 发行版上,预安装的访客代理会自动将别名 IP 地址设置为本地地址。这样可以简化设置,因为不需要操作系统级配置。

但是,这也意味着在客机代理运行之前,操作系统不会将别名 IP 地址识别为本地地址。如果虚拟机具有自动启动服务,并且这些服务在客机代理之前启动,则它们无法绑定到别名 IP 地址。

例如,Apache HTTP 服务器可能会退出,并出现以下错误:

could not bind to address ALIAS_IP:80

如需解决此问题,请将服务配置为在客机代理之后启动。在使用 systemctl 的发行版上,请按以下步骤操作。

  1. 以特权用户运行以下命令,为无法正常运行的服务添加普适性代码段,例如,Debian 上的 Apache HTTP Server 为 apache2

    systemctl edit YOUR_SERVICE
    
  2. 在文本编辑器中,添加以下行。请务必将行添加到读取 Lines below this comment will be discarded 的行上方。

    [Unit]
    After=google-guest-agent.service
    

未列出我的次要 IP 范围

次要 IP 范围未作为常规子网列出。如需显示子网次要 IP 范围已创建,请使用 gcloud compute networks subnets describe 命令。

  1. 创建子网。

    gcloud compute networks subnets create my-subnet \
        --region us-central1 \
        --network my-network \
        --range 10.9.0.0/16 \
        --secondary-range secondaryrange1=172.16.0.0/12
    
    Created [https://www.googleapis.com/compute/v1/projects/google.com:my-project/regions/us-central1/subnetworks/my-subnet].
    NAME       REGION       NETWORK     RANGE
    my-subnet  us-central1  my-network  10.9.0.0/16
    
  2. 列出子网。

    gcloud compute networks subnets list
    
    NAME       REGION       NETWORK     RANGE
    my-subnet  us-central1  my-network  10.9.0.0/16
    
  3. 获取子网的详细信息以查看次要范围。

    gcloud compute networks subnets describe my-subnet --region us-central1
    
    ...
    ipCidrRange: 10.9.0.0/16
    ...
    secondaryIpRanges:
    - ipCidrRange: 172.16.0.0/12
      rangeName: secondaryrange1
    ...
    

指定的子网次要范围不存在

创建虚拟机时,如果出现次要范围不存在的错误,请确保以下几点:

  • 该子网拥有使用指定名称的次要范围。
  • 您是在具有次要范围的子网内创建虚拟机。

通过运行以下命令可以看到此错误:

  1. 创建一个具有次要范围的子网。

    gcloud compute networks subnets create my-subnet \
        --region us-central1 \
        --network my-network \
        --range 10.9.0.0/16 \
        --secondary-range secondaryrange1=172.16.0.0/12
    
    Created [https://www.googleapis.com/compute/v1/projects/google.com:my-project/regions/us-central1/subnetworks/my-subnet].
    NAME       REGION       NETWORK     RANGE
    my-subnet  us-central1  my-network  10.9.0.0/16
    
  2. 在另一个网络(如默认网络)中创建一个实例,而不是在新创建的子网中创建实例。

    gcloud compute instances create instance-1 \
        --zone us-central1-a \
        --network default
    
    Created [https://www.googleapis.com/compute/v1/projects/google.com:my-project/zones/us-central1-a/instances/instance-1].
    NAME        ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
    instance-1  us-central1-a  n1-standard-1               10.128.0.2     47.82.96.9  RUNNING
    
  3. 尝试从第 1 步创建的子网中分配一个别名 IP 范围。该命令将失败,因为次要范围与该实例位于不同的子网中。

    gcloud compute instances network-interfaces update instance-1 \
        --zone us-central1-a \
        --aliases secondaryrange1:172.16.0.10/32
    
    ERROR: (gcloud.compute.instances.network-interfaces.update) HTTPError 400: Invalid value for field 'resource.aliasIpRanges[0].subnetworkRangeName': 'secondaryrange'. The specified subnetwork secondary range does not exist.
    
  4. 创建另一个实例,该实例的接口位于第 1 步创建的子网中。

    gcloud compute instances create instance-2 \
        --zone us-central1-a \
        --network-interface subnet=my-subnet
    
    Created [https://www.googleapis.com/compute/v1/projects/google.com:my-project/zones/us-central1-a/instances/instance-2].
    NAME        ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
    instance-2  us-central1-a  n1-standard-1               10.9.0.2     38.74.204.89  RUNNING
    
  5. 为该接口添加一个别名 IP 范围。这次该命令可以成功执行,因为该接口与次要范围位于同一个子网中。

    gcloud compute instances network-interfaces update instance-2 \
        --zone us-central1-a \
        --aliases secondaryrange1:172.16.0.10/32
    
    Updating network interface [nic0] of instance [instance-2]...done.
    

无法在同一个请求中添加和移除次要 IP 范围

目前不支持在同一条命令中添加和移除子网次要 IP 范围。如果在同一条 gcloud 命令中既添加又移除次要范围,该命令将保留现有范围,不对其进行任何修改。

如需添加和移除范围,请分别运行以下两条命令。

gcloud compute networks subnets update SUBNET_NAME \
    --add-secondary-ranges RANGE_NAME_1=RANGE_CIDR_1,RANGE_NAME_2=RANGE_CIDR_2,...
gcloud compute networks subnets update  SUBNET_NAME \
    --remove-secondary-ranges RANGE_NAME_1,RANGE_NAME_2,...

如需查看此命令的更多详细信息,请使用 gcloud compute networks subnets update --help

无法同时添加和移除别名 IP 范围

目前不支持在同一请求中添加和移除虚拟机别名 IP 范围。

用于更新别名 IP 范围的 gcloud 命令不会保留现有范围,因此系统会将省略范围解释为请求删除该范围。

例如,如果当前虚拟机的别名范围为 10.9.27.0/24,并且新请求的范围为 /24,则运行请求 /24 的命令时会被系统拒绝,因为此命令将解释为移除 10.9.27.0/24 并添加 /24。在添加新范围之前,必须明确移除现有范围。

示例:

  1. 创建别名 IP 范围。

    gcloud compute instances create vm --network-interface "subnet=s1,aliases=10.9.27.0/24"
    
  2. 尝试添加 /24 而不指定现有范围。以下为错误结果。

    gcloud compute instances network-interfaces update vm --aliases "/24"
    ERROR: (gcloud.compute.instances.network-interfaces.update) HTTPError 400: Invalid value for field 'resource.aliasIpRanges': ''. Cannot simultaneously add and remove alias IP ranges.
    
  3. 更新虚拟机,使其没有别名 IP 范围。

    gcloud compute instances network-interfaces update vm --aliases ""
    Updating network interface [nic0] of instance [vm]...done.
    
  4. 添加新的别名 IP 范围。

    gcloud compute instances network-interfaces update vm --aliases "/24"
    Updating network interface [nic0] of instance [vm]...done.
    

如需查看此命令的更多详细信息,请使用 gcloud compute instances network-interfaces update --help

防火墙规则来源标记和来源服务账号

防火墙来源服务账号和来源标记仅会扩展到匹配实例的主要网络 IP,不适用于匹配实例的别名 IP。因此,基于来源标记的防火墙规则不会影响来自实例别名 IP 地址的流量。别名 IP 地址可以作为来源或目的地范围添加到防火墙规则中。

具有多个接口和别名 IP 范围的虚拟机的问题

请参阅多个接口的问题排查

在 Google Cloud 映像上启用 IP 别名会在自行管理的 Kubernetes 集群上停用 cbr0 网桥

在 Google 提供的映像上,Google 客机代理会为别名 IP 地址范围创建本地路由。对于自行管理的 Kubernetes 集群,您必须配置 Google 客机代理,使其不会为别名 IP 范围创建本地路由。GKE 集群不需要执行此步骤,因为 GKE 会禁止在其节点映像上为别名 IP 范围创建本地路由。

症状

  • 如果客机代理创建的本地路由从 cbr0 接口中移除别名 IP 地址范围,Kubernetes Pod 将失去网络访问权限。

  • Linux 网桥设备 (tcpdump -ni cbr arp) 上的数据包捕获会显示缺少来自 cbr0 接口的 ARP 响应(即使该接口已启动)。

  • 检查本地路由表 (ip route show table local) 显示别名 IP 地址范围已分配给主要网络接口(例如 eth0ens4),而不是容器网桥接口 (cbr0)。

修复

  1. 运行为客机环境安装的软件包中列出的相应命令,以确定节点虚拟机是否正在运行 Google 客机代理旧版 Compute Engine 软件包

  2. 如果您的节点虚拟机未运行 Google 客机代理,请安装客机代理或使用 Google 提供的较新映像。

  3. 配置 Google 客机代理,跳过为别名 IP 地址范围和转发规则创建本地路由。

    1. 修改 /etc/default/instance_configs.cfg,在 [NetworkInterfaces] 部分中设置 ip_forwarding=false。如果 [NetworkInterfaces] 部分在 instance_configs.cfg 文件中尚不存在,则予以创建。

    2. 执行以下任务之一:

      • 重启节点虚拟机

      • 重启 google-guest-agent.service 服务并修改本地路由表。

        如需重启 google-guest-agent.service 服务,请运行 sudo systemctl restart google-guest-agent.service。然后修改本地路由表以移除别名 IP 地址范围的所有条目。例如:

        sudo ip route del local ALIAS_IP_RANGE dev DEVICE_IDENTIFIER
        

        替换以下内容:

        • ALIAS_IP_RANGE:别名 IP 地址范围。
        • DEVICE_IDENTIFIER:网络接口的标识符。例如 ens4eth0

    如需了解详情,请参阅 Google 客机代理文档中的“配置”部分

后续步骤