預留靜態內部 IP 位址

本頁面說明如何在虛擬私有雲 (VPC) 網路中,預留及管理靜態內部 IPv4 或 IPv6 位址。

您可以透過靜態內部 IP 位址,從子網路設定的 IP 位址範圍中保留內部 IP 位址,然後視需要將這些保留的內部 IP 位址指派給資源。預約內部 IP 位址後,該位址就會從動態分配集區中移出,避免系統自動分配該位址。預留靜態內部 IP 位址需要特定的 Identity and Access Management (IAM) 權限,只有授權使用者才能預留靜態內部 IP 位址。

您可以預留靜態內部 IP 位址,這樣一來,即使必須刪除並重新建立資源,也能一律為相同資源使用相同的 IP 位址。

如要預留靜態外部 IP 位址,而非內部 IP 位址,請參閱「預留靜態外部 IP 位址」。

事前準備

  • 瞭解 IP 位址。
  • 如果尚未設定驗證,請先完成設定。「驗證」是驗證身分的程序,可讓您存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請按照下列步驟驗證。

    請根據您打算如何使用本頁範例,選取對應的分頁標籤:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,不需要設定驗證機制。

    gcloud

    安裝 Google Cloud CLI。 安裝完成後,請執行下列指令,初始化 Google Cloud CLI:

    gcloud init

    如果採用外部識別資訊提供者 (IdP),必須先 使用聯合身分登入 gcloud CLI。

    Terraform

    如要在本機開發環境中使用本頁的 Terraform 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。

    1. 安裝 Google Cloud CLI。

    2. 若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

    3. 如果您使用的是本機殼層,請為使用者帳戶建立本機驗證憑證:

      gcloud auth application-default login

      如果您使用的是 Cloud Shell,則不必執行這項操作。

      如果系統傳回驗證錯誤,且您使用的是外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「 為本機開發環境設定 ADC」。

    REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      如果採用外部識別資訊提供者 (IdP),必須先 使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」一節。

必要的角色

如要取得保留及管理靜態 IP 位址所需的權限,請要求管理員授予您專案的 Compute 網路管理員 (roles/compute.networkAdmin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這個預先定義的角色具備預留及管理靜態 IP 位址所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

必須具備下列權限,才能預留及管理靜態 IP 位址:

  • compute.addresses.create IP 位址
  • compute.addresses.createInternal IP 位址
  • compute.networks.list 網路
  • compute.subnetworks.use 子網路
  • compute.subnetworks.list 子網路

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

限制

  • 可保留的內部靜態 IP 位址數量不得超過專案配額。詳情請參閱虛擬私有雲說明文件中的各專案配額。

  • 同時間只有一個資源可以使用靜態內部 IP 位址。

  • 只有虛擬私有雲網路支援保留靜態內部 IP 位址。不支援舊版模式網路。

  • 刪除資源並不會自動釋出靜態內部 IP 位址。因此,您不再需要靜態內部 IP 位址時,請以手動方式釋出。

  • 每個 VM 都可以有多個網路介面,每個介面則可根據堆疊類型指派下列 IP 位址:

    • 僅限 IPv4 的介面:
      • 內部 IPv4 位址 (必要)
      • 外部 IPv4 位址 (選用)
    • 雙重堆疊 (IPv4 和 IPv6) 介面:
      • 內部 IPv4 位址 (必要)
      • 外部 IPv4 位址 (選用)
      • /96 IPv6 位址範圍,內部或外部皆可,但不能同時使用 (必要)
    • 僅限 IPv6 的介面:
      • /96 IPv6 位址範圍,內部或外部皆可,但不能同時使用 (必要)
  • 您無法取消指派或變更下列項目:

    • 現有資源的內部 IPv4 位址。舉例來說,您無法將新的內部靜態 IP 位址指派給執行中或已停止的 VM 執行個體。
    • VM 的內部 IPv6 位址,具有僅限 IPv6 的網路介面。

    不過,您可以將資源的臨時內部 IP 位址升級為靜態內部 IP 位址,這樣即使刪除資源,系統仍會保留該位址。

  • 靜態 IP 位址的名稱無法變更。

  • 靜態內部 IP 位址屬於區域性資源,僅限在預留的區域內使用。舉例來說,如果 Region A 中有預留的靜態內部 IP 位址,您只能在 Region A 中使用該 IP 位址。

預留新的靜態內部 IPv4 或 IPv6 位址

您必須先建立虛擬私有雲網路和子網路,才能保留新的靜態內部 IP 位址。

如要保留新的靜態內部 IPv6 專屬本機位址 (ULA),虛擬私有雲網路必須啟用 ULA 內部 IPv6 範圍。此外,網路必須有 IPv6 位址範圍和 INTERNAL IPv6 存取權類型的子網路。詳情請參閱「內部 IPv6 規格」。

如要保留獨立內部 IP 位址,請完成下列步驟。

控制台

  1. 前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面。

    前往「IP addresses」(IP 位址) 頁面

  2. 按一下「Reserve internal static IP address」(預留內部靜態 IP 位址)。您可能需要點選「更多動作」選單 ,才會看到這個按鈕。
  3. 在「Name」(名稱) 欄位中,輸入 IP 位址名稱。
  4. 在「IP version」(IP 版本) 清單中,選取所需的 IP 版本:
    • 如要預留靜態內部 IPv4 位址,請選取「IPv4」IPv4。
    • 如要預留靜態內部 IPv6 位址,請選取「IPv6」IPv6。
  5. 在「Network」(網路) 和「Subnetwork」(子網路) 清單中,分別選取虛擬私有雲網路和子網路。
  6. 指定保留 IP 位址的方式:
    • 如要指定要保留的靜態內部 IPv4 位址,請在「Static IP address」(靜態 IP 位址) 部分選取「Let me choose」(讓我選擇),然後輸入自訂 IPv4 位址。否則,系統會自動在子網路中為您指派靜態內部 IPv4 位址。
    • 如要指定要保留的靜態內部 IPv6 位址範圍,請在「Static IPv6 range」(靜態 IPv6 範圍) 選取「Let me choose」(讓我選擇),然後從子網路的 /64 內部 IPv6 位址範圍輸入自訂 /96 IPv6 位址範圍。否則,系統會自動在子網路中為您指派靜態內部 IPv6 位址範圍。
  7. 選用:如要在不同前端共用靜態內部 IPv4 位址,請在「Purpose」(用途) 清單中選擇「Shared」(共用)。預設選項為「Non-shared」(非共用)。

  8. 點選「保留」。

gcloud

  • 如要預留內部 IPv4 位址,請使用 compute addresses create 指令:

    gcloud compute addresses create ADDRESS_NAMES \
        --region REGION --subnet SUBNETWORK \
        --addresses IPV4_ADDRESS
    

    更改下列內容:

    • ADDRESS_NAMES:要建立的一或多個 [--purpose=SHARED_LOADBALANCER_VIP] 位址名稱。如有多個地址,請以清單形式指定所有地址,並以空格分隔,例如 example-address-1 example-address-2 example-address-3
    • REGION:這項要求的區域。
    • SUBNETWORK:這個內部 IP 位址的子網路。
    • IPV4_ADDRESS:要預留的 IP 位址,必須位於子網路的主要 IP 範圍內。如未指定,系統會自動從子網路分配 IP 位址。
  • 如要預留內部 IPv6 位址,請使用 compute addresses create 指令。

    • 如要從子網路自動分配內部 IPv6 位址,請為 --ip-version 旗標指定 IPV6:

      gcloud compute addresses create ADDRESS_NAMES \
          --region REGION --subnet SUBNETWORK \
          --ip-version IPV6
      
    • 如要從子網路預留特定內部 IPv6 位址,請指定 --addresses 旗標。請勿加入 --ip-version 旗標:

      gcloud compute addresses create ADDRESS_NAMES \
          --region REGION --subnet SUBNETWORK \
          --addresses IPV6_ADDRESS
      

    更改下列內容:

    • ADDRESS_NAMES:要保留的一或多個位址名稱。如有多個地址,請以清單形式指定所有地址,並以空格分隔,例如:example-address-1 example-address-2 example-address-3
    • REGION:這項要求的區域。
    • SUBNETWORK:這個內部 IPv6 位址的子網路。
    • IPV6_ADDRESS:要保留的 IP 位址,必須是子網路 /64 內部 IPv6 位址範圍中的 /96 IPv6 位址。

範例

  • 從子網路預留自動分配的內部 IPv4 位址:

    gcloud compute addresses create example-address-1 \
        --region us-central1 \
        --subnet subnet-1
    
  • 從子網路預留特定內部 IPv4 位址:

    gcloud compute addresses create example-address-1 \
        --region us-central1 \
        --subnet subnet-1 \
        --addresses 10.128.0.12
    
  • 從子網路預留靜態內部 IPv6 位址:

    gcloud compute addresses create example-address-1 \
        --region us-central1 \
        --subnet subnet-1 \
        --ip-version IPV6
    
  • 如要建立多個 IPv4 位址,請傳入多個 IPv4 位址名稱,所有位址都會保留在同一個子網路中:

    gcloud compute addresses create example-address-1 example-address-2 \
        --region us-central1 \
        --subnet subnet-1 \
        --addresses 10.128.0.12,10.128.0.13
    

Terraform

您可以使用 Terraform 模組建立內部 IP 位址。

在以下範例中,Terraform 引數包含可變更的範例值。這個範例會建立兩個特定的內部 IP 位址:

module "address" {
  source     = "terraform-google-modules/address/google"
  version    = "~> 4.0"
  project_id = var.project_id # Replace this with your project ID in quotes
  region     = "asia-east1"
  subnetwork = "my-subnet"
  names      = ["internal-address1", "internal-address2"]
  addresses  = ["10.0.0.3", "10.0.0.4"]
}

以下範例會建立兩個動態分配的內部 IP 位址:

module "address" {
  source     = "terraform-google-modules/address/google"
  version    = "~> 4.0"
  project_id = var.project_id # Replace this with your project ID in quotes
  region     = "asia-east1"
  subnetwork = "my-subnet"
  names      = ["internal-address1", "internal-address2"]
}

API

請使用 addresses.insert 方法:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

無論是 IPv4 還是 IPv6 位址,要求主體都必須包含 addressType 欄位 (應為 INTERNAL)、位址的 name,以及 IP 位址所屬的 subnetwork。要求主體可以視需要包含內部 IP 位址的 purpose。

您可以讓系統自動分配 IP 位址,或使用 address 指定內部 IP 位址。您預留的 IPv4 位址必須屬於子網路的主要 IPv4 位址範圍。您保留的 IPv6 位址必須屬於子網路的內部 IPv6 位址範圍。

{
  "addressType": "INTERNAL",
  "name": "IPV4_ADDRESS_NAME",
  "subnetwork": "regions/REGION/subnetworks/SUBNETWORK",
  "address": "IPV4_ADDRESS",
  "purpose": "GCE_ENDPOINT"
}

例如:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
{
  "addressType": "INTERNAL",
  "name": "example-ipv4-address-1",
  "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet",
  "address": "10.128.0.12",
  "purpose": "GCE_ENDPOINT"
}

如果是內部 IPv6 位址,您也必須將 ipVersion 指定為 IPV6。

{
  "addressType": "INTERNAL",
  "name": "IPV6_ADDRESS_NAME",
  "ipVersion": "IPV6",
  "subnetwork": "regions/REGION/subnetworks/SUBNETWORK",
  "address": "IPV6_ADDRESS",
  "purpose": "GCE_ENDPOINT"
}

例如:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
{
  "addressType": "INTERNAL",
  "name": "example-ipv6-address-1",
  "ipVersion": "IPV6",
  "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet",
  "address": "2001:db8:a0b:c0d:e0f:f0e::",
  "purpose": "GCE_ENDPOINT"
}

為採用 Cloud Interconnect 的高可用性 VPN 保留靜態內部 IP 位址範圍

您可以預留靜態內部 IP 位址範圍,用於透過 Cloud Interconnect 部署的高可用性 VPN。

建立靜態內部 IP 位址時,必須指定 --purpose=IPSEC_INTERCONNECT 旗標和介於 26 到 29 之間的前置長度 (--prefix-length)。

您預留的區域性內部 IPv4 位址會套用至 Cloud Interconnect 使用的高可用性 VPN 閘道。

詳情請參閱「將內部 IP 位址範圍指派給高可用性 VPN 閘道」。

判斷內部 IPv4 或 IPv6 位址是臨時還是靜態

在大多數情況下,靜態和臨時內部 IP 位址的行為和顯示方式都相同。不過,如果使用靜態內部 IP 位址,即使刪除並重新建立資源,仍可為相同資源使用相同的 IP 位址。

一般來說,如果您停止或刪除資源,系統會釋出臨時 IP 位址。

如要判斷位址是靜態還是臨時,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面。

    前往「IP addresses」(IP 位址) 頁面

  2. 在清單中找出位址,然後查看「Type」(類型) 欄,瞭解 IP 位址的類型。

將使用中的臨時內部 IPv4 或 IPv6 位址升級為靜態位址

如果您有使用中的臨時內部 IP 位址,可以將這些位址升級為靜態內部 IP 位址,這樣一來,這些位址就會保留在專案中,直到您主動移除為止。

如要將臨時內部 IP 位址升級為靜態內部 IP 位址,請完成下列步驟。

控制台

  1. 前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面。

    前往「IP addresses」(IP 位址) 頁面

  2. 按一下「內部 IP 位址」。
  3. 選用:在「Filter」(篩選器) 欄位中,輸入 ephemeral 搜尋臨時 IP 位址,然後從下拉式清單中選取「Ephermal : Type」(臨時:類型)。
  4. 選取要升級的內部 IP 位址。
  5. 在所選 IP 位址顯示列結尾的「More actions」(更多動作) 選單 () 中,選取「Promote to static IP address」(升級為靜態 IP 位址)。
  6. 輸入新的靜態 IP 位址名稱,然後按一下「Reserve」(預留)。

gcloud

  1. 將現有的臨時內部 IPv6 位址升級前,您必須先知道該 IP 位址的值。使用 Google Cloud CLI 向資源發出 describe 要求,取得 IP 位址值。

    • 如為具有 IPv4 位址的執行個體,請使用下列指令:

      gcloud compute instances describe INSTANCE_NAME --zone ZONE | grep "networkIP"
      
    • 如為具有 IPv6 位址的執行個體,請使用下列指令:

      gcloud compute instances describe INSTANCE_NAME --zone ZONE | grep "ipv6Address"
      
    • 如為區域轉送規則,請使用下列指令:

      gcloud compute forwarding-rules describe FORWARDING_RULE_NAME --region REGION | grep "IPAddress"
      

      如果是全域轉送規則,請使用 --global 旗標,而非 --region 旗標。

  2. 升級位址:

    • 如要升級一或多個現有的內部 IPv4 位址,請使用 compute addresses create 指令,並提供 --addresses 旗標,以及要升級的明確內部 IP 位址:

      gcloud compute addresses create IPV4_ADDRESS_NAMES \
        --addresses IPV4_ADDRESSES \
        --region REGION \
        --prefix-length PREFIX_LENGTH \
        --subnet SUBNETWORK
      

      更改下列內容:

      • IPV4_ADDRESS_NAMES:IPv4 位址的名稱。如有多個地址,請以清單形式指定所有地址名稱,並以空格分隔,例如 example-address-name-1 example-address-name-2 example-address-name-3。宣告名稱的順序應與宣告 IP 位址的順序相同。舉例來說,假設您將位址名稱指定為 example-address-name-1 example-address-name-2 example-address-name-3,並將 IPv4 位址指定為 192.0.2.0 192.0.2.1 192.0.2.2。在這種情況下,Compute Engine 會以下列方式對應名稱和位址:

        • example-address-name-1:192.0.2.0
        • example-address-name-2:192.0.2.1
        • example-address-name-3:192.0.2.2
      • IPV4_ADDRESSES:要升級的 IPv4 位址。如有多個位址,請以清單形式指定所有位址,並以空格分隔,例如 192.0.2.0 192.0.2.1 192.0.2.2。

      • REGION:要保留這個位址的區域。

      • PREFIX_LENGTH:選用。IPv4 位址範圍的前置碼長度。值必須是介於 7 至 31 之間的整數。只有在指定位址範圍時,才需要加入這個欄位。如果指定的 IPv4 位址是單一 IP 位址,請排除該欄位。

      • SUBNETWORK:這項要求的子網路。

    • 如要推送一或多個現有內部 IPv6 位址,請使用 compute addresses create 指令,並提供 --addresses 旗標和明確的內部 IPv6 位址:

      gcloud compute addresses create IPV6_ADDRESS_NAMES \
       --addresses IPV6_ADDRESSES \
       --region REGION \
       --prefix-length PREFIX_LENGTH \
       --subnet SUBNETWORK
      

      更改下列內容:

      • IPV6_ADDRESS_NAMES:地址名稱。宣告名稱的順序應與宣告 IPv6 位址的順序相同。在本例中,IPV6_ADDRESS_NAME_1 對應 IPV6_ADDRESS_1,IPV6_ADDRESS_NAME_2 則對應 IPV6_ADDRESS_2。
      • IPV6_ADDRESS_1,[IPV6_ADDRESS_2,...]:要升級的 IPv6 位址,採用 CIDR 格式。
      • PREFIX_LENGTH_1,[PREFIX_LENGTH_2,...]:IPv6 位址的前置碼長度。
      • REGION:要保留這個位址的區域。
      • SUBNETWORK:這項要求的子網路。

      內部 IPv6 位址升級為靜態內部 IPv6 位址後,仍會連結至現有執行個體。如要將新升級的靜態內部 IPv6 位址指派給其他資源,請先從現有執行個體取消指派靜態內部 IPv6 位址。

API

請使用 addresses.insert 方法:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

無論是 IPv4 還是 IPv6 位址,要求主體都必須包含 addressType (應為 INTERNAL)、位址的 name、要升級的 address,以及 IP 位址所屬的 subnetwork。如果是 IPv6 位址,要求主體還必須包含 prefixLength,並以 96 做為值。

  • 用於推送內部 IPv4 位址的要求主體:

    {
    "name": "ADDRESS_NAME",
    "addressType": "INTERNAL",
    "address": "IP_ADDRESS",
    "subnetwork": "regions/REGION/subnetworks/SUBNETWORK"
    }
    

    例如:

    POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
    {
    "name": "example-IPv4-address-1",
    "addressType": "INTERNAL",
    "address": "10.128.0.2",
    "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet"
    }
    
  • 用於推送內部 IPv6 位址的要求主體:

    {
    "name": "ADDRESS_NAME",
    "addressType": "INTERNAL",
    "address": "IP_ADDRESS",
    "subnetwork": "regions/REGION/subnetworks/SUBNETWORK"
    "prefixLength": 96
    }
    

    例如:

    POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
    {
    "name": "example-IPv6-address-1",
    "addressType": "INTERNAL",
    "address": "fd20:0:0::",
    "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet"
    "prefixLength": 96
    }
    

在 Shared VPC 使用靜態內部 IPv4 或 IPv6 位址

您可以在共用虛擬私有雲網路的共用子網路中,建立預留的靜態內部 IP 位址。IP 位址物件本身是在使用該物件的資源所在的服務專案中建立,即使其值來自 Shared VPC 虛擬私有雲網路所選共用子網路中的可用 IP 位址範圍。如要進一步瞭解這個用途,請參閱下列資源:

列出靜態內部 IPv4 或 IPv6 位址

如要查看所有現有的靜態內部 IP 位址,請完成下列步驟。

控制台

  1. 前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面。

    前往「IP addresses」(IP 位址) 頁面

  2. 按一下「內部 IP 位址」。

gcloud

使用 gcloud compute addresses list 指令:

gcloud compute addresses list

API

使用 addresses.list 方法:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

更改下列內容:

  • PROJECT_ID:這項要求的專案 ID
  • REGION:這項要求的區域名稱

如要列出所有區域中的所有位址,請使用 addresses.aggregatedList 方法:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/addresses

釋出靜態內部 IPv4 或 IPv6 位址

如果不再需要靜態內部 IP 位址,可以刪除 IP 位址資源,釋出 IP 位址。

如果使用 Google Cloud 控制台,只有在其他資源未使用靜態 IP 位址時,才能釋出該位址。

如果使用 gcloud CLI 或 API,無論 IP 位址是否由其他資源使用,您都可以釋出該位址。

  • 如果資源未使用該 IP 位址,系統會將 IP 位址傳回可用內部 IP 位址集區。

  • 如果 IP 位址正由資源使用,則會保持附加至資源,直到資源刪除為止。

如要釋出靜態內部 IPv4 或 IPv6 位址,請完成下列步驟。

控制台

  1. 前往 Google Cloud 控制台的「IP addresses」(IP 位址) 頁面。

    前往「IP addresses」(IP 位址) 頁面

  2. 選取「內部 IP 位址」分頁標籤。
  3. 選用:在「Filter」(篩選器) 欄位中輸入 static,然後從下拉式選單中選取「Static : Type」(靜態:類型)。
  4. 選取要釋出的靜態內部 IP 位址。
  5. 按一下「Release static address」(釋出靜態位址),然後在對話方塊中點選「Release」(釋出),確認這項操作。

    如果沒有看到這個選項,請按一下頂端選單列中的「More actions」(更多動作) 選單 (),然後從清單中選取「Release static address」(釋出靜態位址)。

gcloud

使用 compute addresses delete 指令:

gcloud compute addresses delete ADDRESS_NAME \
    --region REGION

更改下列內容:

  • ADDRESS_NAME:要刪除的位址名稱。
  • REGION:位址所屬的區域。

例如:

gcloud compute addresses delete example-address-to-delete \
    --region us-west1

API

請使用 addresses.delete 方法:

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME

以下範例會刪除 us-west1 區域中的位址:

DELETE https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-west1/addresses/example-address-to-delete

後續步驟