設定別名 IP 範圍

本文件說明如何使用 Google Cloud 控制台和 Google Cloud CLI,設定別名 IP 位址和別名 IP 範圍。執行這些指令前,請先參閱別名 IP 範圍

限制

子網路

  • 每個網路的限制會說明您為每個子網路定義的次要範圍數量上限。
  • 您無法同時新增「及」移除次要範圍,新增及移除作業必須以個別的步驟完成。
  • 次要範圍不支援 CIDR 擴展。

VM 執行個體

  • 所有虛擬機器 (VM) 網路介面皆支援別名 IP 範圍。系統是針對主要網路介面上的別名 IP 範圍自動設定轉送方式,而非次要介面。如果您有多個網路介面,則必須針對額外的介面設定政策路由。如需相關範例,請參閱以下教學課程:為額外網路介面設定路由
  • 您可以新增或刪除別名 IP 範圍,但無法更新。
  • 如果您從一個 VM 中移除別名 IP 範圍,並將其指派給另一個 VM,轉移作業可能最多需要一分鐘才能完成。
  • 別名 IP 位址不支援防火牆來源標記。這代表在防火牆規則中設定來源標記時,來源標記會比對 VM 主要 IP 位址,而不是別名 IP 位址。使用來源範圍允許或拒絕來自別名 IP 位址的輸入流量。
  • 內部 DNS 會將 VM 名稱解析為其主要 IP。系統不會自動設定別名 IP 的其他名稱,但您可以透過手動方式新增名稱。

虛擬私有雲網路

  • 同時新增或移除大量的別名 IP 範圍可能會花費很長的時間。舉例來說,新增或刪除 7,000 個別名 IP 範圍可能最多需要 10 分鐘。
  • 自動模式虛擬私有雲 (VPC) 網路無法在具有次要子網路範圍的情況下刪除。
  • 在靜態路徑中,下一個躍點的 IP 位址必須是 VM 的主要 IP 位址。系統不支援使用別名 IP 位址做為下一個躍點 IP 位址。
  • 系統不支援 IPv6 位址。
  • 僅限虛擬私有雲網路支援別名 IP 範圍,舊版網路則不支援。如要確定您的網路類型,請列出您的網路。VPC 網路具有 customauto 模式,舊版網路的模式為 legacy

子網路指令

您必須從子網路擁有的範圍中指派 VM 別名 IP 範圍,且該子網路必須為 VM 所在的位置。所有子網路都有主要範圍,這是定義子網路的內部 IP 位址標準範圍。子網路也可能有一或多個內部 IP 位址的次要 IP 範圍。您可以從子網路的主要或次要範圍指派別名 IP 範圍。

您必須為每個次要範圍命名,且這些名稱在子網路中不得重複。將別名 IP 範圍指派給 VM 時,次要範圍名稱會告知Google Cloud 從哪個子網路範圍指派別名 IP。

在 VPC 網路的所有子網路中,以及透過 VPC 網路對等互連、Cloud VPN 或 Cloud Interconnect 連結的任何網路中,所有主要及次要範圍皆不得重複。

本節說明如何建立具有次要範圍的子網路、將次要範圍新增到現有子網路,或是從子網路中移除次要範圍。子網路具有您要使用的範圍後,請參閱「使用 VM 執行個體」一節,瞭解如何將範圍指派給 VM。

建立具有一或多個次要 CIDR 範圍的子網路

這個指令假設您已經擁有 VPC 網路。如果沒有,請建立

無論您是針對 VM 的主要介面或是其中一個次要介面建立子網路,使用的指令都是相同的。

使用次要範圍分配別名 IP 可讓您區隔 VM 中託管服務的 IP 空間,並可協助您建立防火牆規則,僅允許 VM 上所執行服務的存取權及封鎖 VM 主要 IP 位址的存取權。

主控台

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  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 說明文件

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"
  },
  ...]
}

更改下列內容:

  • PROJECT_ID:包含要建立子網路的 VPC 網路的專案 ID。
  • REGION:子網路所在的地區。
  • PRIMARY_IP_RANGE:子網路的主要 IP 位址範圍。
  • NETWORK_URL:要建立子網路的網址或虛擬私有雲端網路。
  • SUBNET_NAME:子網路名稱。
  • SECONDARY_RANGE_NAME_1SECONDARY_RANGE_NAME_2:用於次要範圍的名稱。
  • SECONDARY_IP_RANGE_1SECONDARY_IP_RANGE_2:用於次要範圍的 IP 位址範圍。

詳情請參閱 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,以便建立防火牆規則,允許存取 VM 上執行的服務,但不允許存取 VM 的主要 IP 位址。

主控台

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下要修改的子網路名稱,查看詳細資料頁面。

  3. 按一下 [編輯]

  4. 在「Secondary IP ranges」部分,按一下「Add IP range」

  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 說明文件

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": "SUBNET_FINGERPRINT"
}

更改下列內容:

  • PROJECT_ID:包含要修改的子網路的專案 ID。
  • REGION:子網路所在的地區。
  • SUBNET_NAME:要修改的子網路名稱。
  • SECONDARY_RANGE_NAME_1SECONDARY_RANGE_NAME_2:用於次要範圍的名稱。
  • SECONDARY_IP_RANGE_1SECONDARY_IP_RANGE_2:用於次要範圍的 IP 位址範圍。
  • SUBNET_FINGERPRINT:現有子網路的指紋 ID,會在描述子網路時提供。

詳情請參閱 subnetworks.patch 方法

從子網路中移除次要 CIDR 範圍

您可以從子網路中移除現有的次要範圍。如要查看與子網路相關聯的範圍,請參閱「說明子網路」。

主控台

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  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 說明文件

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_NAME:要修改的子網路名稱。
  • SUBNET_FINGERPRINT:現有子網路的指紋 ID,會在描述子網路時提供。

詳情請參閱 subnetworks.patch 方法

使用 VM 執行個體

這些指令說明如何建立具有別名 IP 範圍的執行個體、將一或多個別名 IP 範圍新增至現有的 VM 執行個體,或是從現有 VM 執行個體中移除一或多個範圍。

在主要 CIDR 範圍中建立具有別名 IP 範圍的 VM

如要從子網路的主要範圍中指派別名 IP 範圍,請使用本程序。您選擇的範圍必須尚未由 VPC 網路上的其他任何資源使用,即便是一部分也不行。

如要讓執行個體的主要介面和別名 IP 位址位於相同的範圍,請使用本程序。

主控台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 按一下「建立執行個體」

  3. 輸入新執行個體的名稱。

  4. 指定區域。

  5. 點選「網路」

  6. 在「Network interfaces」(網路介面) 專區中,展開預設網路介面。

  7. 在「別名 IP 範圍」中,按一下 「新增 IP 範圍」

  8. 將「子網路範圍 1」的設定保留為「主要」

  9. 在「別名 IP 範圍」中,輸入 IP 範圍的 CIDR 標記法。這個範圍必須是主要範圍的未使用子範圍。

  10. 按一下 [建立]。

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 說明文件

API

使用執行個體子網路的主要 IP 位址範圍,建立別名 IP 位址的執行個體。

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

更改下列內容:

  • PROJECT_ID:您建立執行個體的專案 ID。
  • ZONE:要建立執行個體的 Google Cloud 區域。
  • CIDR_RANGE:從主要子網路指派給介面的 IP 範圍。範圍可以是特定範圍 (192.168.100.0/24)、單一 IP 位址 (192.168.100.1) 或 CIDR 格式 (/24) 的網路遮罩。如果您只透過網路遮罩指定 IP 範圍,IP 位址分配器會選擇具有指定網路遮罩的可用範圍,並將該範圍指派給網路介面。

詳情請參閱 instances.insert 方法

在次要 CIDR 範圍中建立具有別名 IP 範圍的 VM

如要指派從子網路的次要範圍取得的別名 IP 範圍,請使用本程序。建議您將別名 IP 範圍與子網路的主要範圍隔開,以便建立防火牆規則,允許在 VM 上執行的服務存取權,但不允許 VM 主要 IP 位址的存取權。

主控台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 按一下「建立執行個體」

  3. 輸入新執行個體的名稱。

  4. 指定區域。

  5. 點選「網路」

  6. 在「Network interfaces」(網路介面) 專區中,展開預設網路介面。

  7. 在「別名 IP 範圍」中,按一下 「新增 IP 範圍」

  8. 在「子網路範圍」中,選取要使用的次要 IP 範圍。

  9. 如要輸入「別名 IP 範圍」,請使用 CIDR 標記法輸入 IP 範圍,此範圍必須是次要 IP 範圍的未使用範圍。

  10. 按一下 [建立]。

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。
  • ZONE:建立執行個體的 Google Cloud 區域。
  • SECONDARY_CIDR_RANGE: the IP range to assign to the interface. The range can be a specific range (192.168.100.0/24), a single IP address (192.168.100.1), or a netmask in CIDR format (/24`)。如果您只透過網路遮罩指定 IP 範圍,IP 位址分配器會選擇具有指定網路遮罩的可用範圍,並將該範圍指派給網路介面。
  • SECONDARY_RANGE_NAME:您要擷取別名 IP 範圍的子網路次要範圍名稱。

詳情請參閱 instances.insert 方法

建立具有多個介面和別名 IP 位址的 VM

本範例會建立兩個網路且分別各有一個子網路,以及在兩個網路中都具有介面的 VM。如果您已經擁有兩個 VPC 網路,可以直接跳至「建立在兩個網路中都具有介面的 VM」步驟。

主控台

建立第一個網路和子網路:

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下「建立虛擬私有雲網路」

  3. 在「Name」(名稱) 中輸入 my-network1

  4. 將「子網路建立模式」設為 Custom,然後指定 my-subnet1 的子網路名稱。

  5. 指定區域。

  6. 將「IP address range」(IP 位址範圍) 設為 172.16.1.0/24

  7. 按一下 [建立次要 IP 範圍]

  8. 將「子網路範圍名稱」設為 range1

  9. 將「Secondary IP range」(次要 IP 範圍) 設為 10.1.0.0/16

  10. 按一下 [完成]

  11. 按一下 [Create] (建立)。

建立第二個網路和子網路:

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下「建立虛擬私有雲網路」

  3. 在「Name」(名稱) 中輸入 my-network2

  4. 將「子網路建立模式」設為 Custom,然後指定 my-subnet2 的子網路名稱。

  5. 在「區域」中,指定與第一個網路和子網路相同的區域。

  6. 將「IP address range」(IP 位址範圍) 設為 172.16.2.0/24

  7. 按一下 [建立次要 IP 範圍]

  8. 將「子網路範圍名稱」設為 range2

  9. 將「Secondary IP range」(次要 IP 範圍) 設為 10.2.0.0/16

  10. 按一下 [完成]

  11. 按一下 [Create] (建立)。

建立在兩個網路中都具有介面的 VM:

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 按一下「建立執行個體」

  3. 將區域設為您建立子網路的地區。

  4. 點選「網路」

  5. 按一下第一個網路介面。

    1. 將「Network」(網路) 設為 my-network1
    2. 將「Subnetwork」(子網路) 設為 my-subnet1
    3. 按一下「別名 IP 範圍」
    4. 按一下 [新增 IP 範圍]
    5. 將「子網路範圍」設為 Primary
    6. 將「Alias IP range」(別名 IP 範圍) 設為 /32
    7. 按一下 [新增 IP 範圍]
    8. 將「子網路範圍」設為 range1
    9. 將「Alias IP range」(別名 IP 範圍) 設為 /24
    10. 按一下 [完成]
  6. 按一下「新增網路介面」

    1. 選取「my-network2」。
    2. 將「Subnetwork」(子網路) 設為 my-subnet2
    3. 按一下「別名 IP 範圍」
    4. 按一下 [新增 IP 範圍]
    5. 將「子網路範圍」設為 Primary
    6. 將「Alias IP range」(別名 IP 範圍) 設為 /32
    7. 按一下 [新增 IP 範圍]
    8. 將「子網路範圍」設為 range2
    9. 將「Alias IP range」(別名 IP 範圍) 設為 /24
    10. 按一下 [完成]
  7. 按一下 [建立]。

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. 建立在兩個網路中都具有介面的 VM。在 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. 使用顯示指令查看介面及其位址:

    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. 建立兩個自訂模式 VPC 網路,分別命名為 my-network1my-network2。詳情請參閱「建立僅含 IPv4 子網路的自訂模式 VPC 網路」。

  2. 將子網路新增至虛擬私有雲網路。詳情請參閱「新增僅限 IPv4 的子網路」。

    1. my-network1 中新增名為 my-subnet1 的子網路。請為主要範圍指定 172.16.1.0/24,並為次要範圍指定 10.1.0.0/16,名稱為 range1

    2. my-network2 中新增名為 my-subnet2 的子網路。請為主要範圍指定 172.16.2.0/24,並為次要範圍指定 10.2.0.0/16,名稱為 range2

  3. 建立在兩個網路中都具有介面的 VM 執行個體。

    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。
    • ZONE:要建立執行個體的 Google Cloud 區域。
    • REGION: Google Cloud 子網路所在的區域。子網路必須與執行個體位於相同的地區。

    詳情請參閱 instances.insert 方法

將別名 IP 範圍新增至現有執行個體

您可以將別名 IP 範圍新增至執行中的執行個體。

即使 API 呼叫已完成,新位址可能仍無法立即使用。只有在來賓作業系統新增地址和路由後,才能使用新地址。

主控台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 按一下現有執行個體的名稱。

  3. 按一下 [編輯]

  4. 在「網路介面」中,按一下要新增別名 IP 範圍的網路介面 (本例為 nic0)。

  5. 按一下「別名 IP 範圍」

  6. 按一下 [新增 IP 範圍]

  7. 選取「子網路範圍」

  8. 輸入別名 IP 範圍。

  9. 按一下 [Done] (完成)

  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;..."

更改下列內容:

  • INSTANCE_NAME:要修改的執行個體名稱。
  • 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/INSTANCE_NAME/updateNetworkInterface?networkInterface=NETWORK_INTERFACE_NAME
{
  "aliasIpRanges": [
    {
      "ipCidrRange": "SECONDARY_IP_RANGE",
      "subnetworkRangeName": "SECONDARY_RANGE_NAME"
    },
    existing ranges...
  ],
  "fingerprint": "INTERFACE_FINGERPRINT"
}

更改下列內容:

  • PROJECT_ID:包含要修改的執行個體的專案 ID。
  • ZONE:建立執行個體的 Google Cloud 區域。
  • INSTANCE_NAME:要修改的執行個體名稱。
  • NETWORK_INTERFACE_NAME:要修改的執行個體網路介面名稱。
  • SECONDARY_IP_RANGE:要指派給介面的 IP 範圍。範圍可以是特定範圍 (192.168.100.0/24)、單一 IP 位址 (192.168.100.1) 或 CIDR 格式的網路遮罩 (/24)。如果您只透過網路遮罩指定 IP 範圍,IP 位址分配器會選擇具有指定網路遮罩的可用範圍,並將該範圍指派給網路介面。
  • SECONDARY_RANGE_NAME:您要擷取別名 IP 範圍的子網路次要範圍名稱。如要從子網路的主要範圍指派範圍,請省略這個欄位。
  • INTERFACE_FINGERPRINT:現有網路介面的指紋 ID,會在您描述執行個體時提供。

詳情請參閱 instances.updateNetworkInterface 方法

修改現有執行個體的別名 IP 範圍

您可以將更多的別名 IP 範圍新增至現有執行個體,或移除一或多個範圍。

地址變更可能不會立即顯示。API 呼叫必須完成,而且客體作業系統必須修改地址和路徑。

主控台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 按一下現有執行個體的名稱。

  3. 按一下 [編輯]

  4. 在「網路介面」中,按一下要新增別名 IP 範圍的網路介面 (本例為 nic0)。

  5. 按一下「別名 IP 範圍」

  6. 如要新增別名 IP 範圍,請按一下 [Add Alias IP range] (新增別名 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;..."

更改下列內容:

  • INSTANCE_NAME:要修改的執行個體名稱。
  • ZONE:包含執行個體的區域。
  • NETWORK_INTERFACE:要修改的網路介面名稱。
  • RANGES_TO_RETAIN:您要保留的現有範圍,格式為 CURRENT_RANGE_NAME:CURRENT_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:CURRENT_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 指令中新增及移除範圍。如要移除某些範圍並使用 gcloud CLI 新增其他範圍,請先執行指令來移除不需要的範圍,然後再次執行指令來新增需要的範圍。

如需完整語法,請參閱 gcloud 說明文件

API

針對現有執行個體的網路介面,新增或移除別名 IP 位址範圍。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/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。
  • ZONE:包含執行個體的區域。
  • INSTANCE_NAME:要修改的執行個體名稱。
  • NETWORK_INTERFACE_NAME:要修改的執行個體網路介面名稱。
  • INTERFACE_FINGERPRINT:現有網路介面的指紋 ID,會在您描述執行個體時提供。

詳情請參閱 instances.updateNetworkInterface 方法

疑難排解

本節列出設定別名 IP 範圍時可能會遇到的各種問題。

無法建立具有別名 IP 的 VM 執行個體

  1. 確認網路是否為虛擬私人雲端網路,舊版網路並不支援別名 IP。

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

    網路 MODE 必須為 autocustom

  2. 如果已指定子網路範圍名稱,請確認下列事項:

    gcloud compute networks subnets describe SUBNET_NAME --region=REGION
    
    • 子網路具有包含對應名稱的次要範圍。
    • 要求的別名 IP 範圍位在這個次要範圍內。如果是使用網路遮罩,則要求的別名 IP 範圍應小於主要範圍。
  3. 如果尚未指定子網路範圍名稱,請確認要求的別名 IP 範圍位在主要子網路範圍內。如果是使用網路遮罩,則要求的別名 IP 範圍應小於主要範圍。

無法連線至別名 IP

  1. 確認防火牆規則。

    1. 列出所有防火牆規則:

      gcloud compute firewall-rules list --format=json
      
    2. 確認系統允許進出別名 IP 範圍的流量。

    3. 視情況需要,新增防火牆規則來允許對別名 IP 範圍進行連線偵測 (ping):

      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. 確保 VM 將 IP 別名範圍辨認為本機。在 Debian 等 Linux 發行版上,這通常可以按照下列做法完成。

    1. 連線至執行個體並執行這個指令:

      ip route show table local
      

      輸出結果會與下列內容相似:

      local ALIAS_IP_RANGE dev eth0  proto 66  scope host
      
    2. /etc/default/instance_configs.cfg 中,確認 ip_aliases 設定已設為 true。如果需要變更這項設定,您也必須重新啟動訪客代理程式:

      systemctl restart google-guest-agent
      
    3. 如果沒有本機路徑,請使用這個指令進行設定:

      ip route add to local ALIAS_IP_RANGE dev eth0 proto 66
      

自動啟動服務未繫結至別名 IP 位址

在支援的 Linux 發行版本中,系統會由預先安裝的訪客代理程式,自動將別名 IP 位址設為本機位址。也就是說,您不需要進行 OS 層級設定。

不過,這也表示在執行訪客代理程式之前,作業系統不會將別名 IP 位址視為本機位址。如果 VM 上有自動啟動服務,且這些服務會在訪客代理程式啟動前啟動,就無法繫結至別名 IP 位址。

舉例來說,Apache HTTP 伺服器可能會在退出時顯示以下錯誤:

could not bind to address ALIAS_IP:80

如要解決這個問題,請將服務設為在訪客代理程式啟動後啟動。在使用 systemctl 的分發版本中,請按照下列步驟操作。

  1. 以權限使用者身分執行下列指令,為無法正常運作的服務新增即時加入程式碼片段,例如 Debian 上的 Apache HTTP 伺服器會是 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
    ...
    

指定的子網路次要範圍並不存在。

在建立 VM 時,如果您收到指出次要範圍並不存在的錯誤訊息,請確認下列事項:

  • 子網路具有包含指定名稱的次要範圍。
  • 您在具有次要範圍的子網路中建立 VM。

如要查看這個錯誤訊息,請執行下列指令:

  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 CLI 指令會保留未經修改的現有範圍。

如要新增及移除範圍,請個別執行兩個指令。

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 範圍

系統不支援在同一個要求中新增及移除 VM 別名 IP 範圍。您必須先明確移除現有的範圍,才能新增新的範圍。

更新別名 IP 範圍的 gcloud CLI 指令「不會」保留現有範圍,因此省略範圍會視為刪除該範圍的要求。

舉例來說,如果目前的 VM 具有 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. 將 VM 更新為不具有別名 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 範圍的 VM 相關問題

請參閱「排解具有多個網路介面的 VM」。

在 Google Cloud 映像檔上啟用 IP 別名會在自管理的 Kubernetes 叢集中停用 cbr0 橋接器

在 Google 提供的映像檔中,Google 訪客代理程式會為別名 IP 位址範圍建立本機路徑。如果是自行管理的 Kubernetes 叢集,您必須設定 Google 訪客代理程式,以便為別名 IP 範圍建立本機路徑。對於 GKE 叢集,您不需要執行這個步驟,因為 GKE 會停用在節點映像檔上為別名 IP 範圍建立本機路徑的功能。

症狀

  • 如果 Guest 代理程式建立的本機路徑從 cbr0 介面移除別名 IP 範圍,Kubernetes Pod 就會失去網路存取權。

  • 在 Linux 橋接裝置 (tcpdump -ni cbr arp) 上擷取封包後,會發現即使 cbr0 介面已啟用,仍缺少來自該介面的 ARP 回應。

  • 檢查本機路由表 (ip route show table local) 後,您會發現別名 IP 位址範圍已指派給主要網路介面 (例如 eth0ens4),而非容器橋接介面 (cbr0)。

修正方法

  1. 執行「已安裝的訪客環境套件」一節中列出的適當指令,判斷節點 VM 是否執行 Google 訪客代理程式舊版 Compute Engine 套件

  2. 如果節點 VM 未執行 Google 訪客代理程式,請安裝訪客代理程式,或使用 Google 提供的較新映像檔。

  3. 設定 Google 訪客代理程式,略過為別名 IP 範圍和轉送規則建立本機路徑。

    1. 編輯 /etc/default/instance_configs.cfg,在 [NetworkInterfaces] 區段中設定 ip_forwarding=false。如果 instance_configs.cfg 檔案中沒有 [NetworkInterfaces] 區段,您可以建立這個區段。

    2. 執行下列任一作業:

      • 重新啟動節點 VM。

      • 重新啟動 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:網路介面的 ID,例如 ens4eth0

    詳情請參閱 Google 訪客代理程式說明文件中的「設定」一節。

後續步驟