從具有外部 IP 位址的 VM 存取 API

如果網路介面已指派外部 IP 位址,且符合本頁面所述的網路需求,虛擬機器 (VM) 執行個體即可連線至 Google API 和服務。雖然連線是透過 VM 的外部 IP 位址建立,但流量會留在 Google Cloud 內,不會透過公開網際網路傳送。

網路需求

如要從具有外部 IP 位址的 VM 存取 Google API 和服務,必須符合下列條件:

  • 如有需要,請為要存取的服務啟用 API:

    • 如要存取 Google API 服務端點,請務必啟用該服務的 API

      舉例來說,如要透過 storage.googleapis.com API 服務端點或用戶端程式庫建立 Cloud Storage bucket,您必須啟用 Cloud Storage API。

    • 如果您存取其他類型的資源,可能不需要啟用任何 API。

      舉例來說,如要透過儲存空間googleapis.com URL 存取其他專案中的 Cloud Storage bucket,您不需要啟用 Cloud Storage API。

  • 如要使用 IPv6 連線至 Google API 和服務,必須符合下列兩項規定:

  • 視所選設定而定,您可能需要更新 DNS 項目、路徑和防火牆規則。詳情請參閱「設定選項摘要」。

設定選項摘要

下表摘要說明設定 Private Google Access 的不同方式。如需更詳細的設定資訊,請參閱「網路設定」。

網域選項 DNS 設定 轉送設定 防火牆設定
預設網域 您是透過公開 IP 位址存取 Google API 和服務,因此不需要進行特殊的 DNS 設定。

確認虛擬私有雲網路可將流量轉送至 Google API 和服務使用的 IP 位址範圍。

  • 基本設定:確認您有下一個躍點為 default-internet-gateway 的預設路徑,以及目的地範圍為 0.0.0.0/0 (適用於 IPv4 流量) 和 ::/0 (適用於 IPv6 流量,如有需要) 的預設路徑。如果缺少這些路徑,請加以建立。
  • 自訂設定:為 Google API 和服務使用的 IP 位址範圍建立路徑。

確認防火牆規則允許輸出至 Google API 和服務使用的 IP 位址範圍。

如果沒有優先順序更高的規則封鎖這類流量,預設允許輸出防火牆規則就會允許這類流量。

private.googleapis.com

在私人 DNS 區域中設定 DNS 記錄,將要求傳送至下列 IP 位址:

IPv4 流量:

  • 199.36.153.8/30

IPv6 流量:

  • 2600:2d00:0002:2000::/64

請確認您的虛擬私有雲網路有前往下列 IP 範圍的路徑

IPv4 流量:

  • 199.36.153.8/30
  • 34.126.0.0/18

IPv6 流量:

  • 2600:2d00:0002:2000::/64
  • 2001:4860:8040::/42

確認防火牆規則允許連出至下列 IP 範圍:

IPv4 流量:

  • 199.36.153.8/30
  • 34.126.0.0/18

IPv6 流量:

  • 2600:2d00:0002:2000::/64
  • 2001:4860:8040::/42
restricted.googleapis.com

設定 DNS 記錄,將要求傳送至下列 IP 位址:

IPv4 流量:

  • 199.36.153.4/30

IPv6 流量:

  • 2600:2d00:0002:1000::/64

請確認您的虛擬私有雲網路有前往下列 IP 範圍的路徑

IPv4 流量:

  • 199.36.153.4/30
  • 34.126.0.0/18

IPv6 流量:

  • 2600:2d00:0002:1000::/64
  • 2001:4860:8040::/42

確認防火牆規則允許連出至下列 IP 範圍:

IPv4 流量:

  • 199.36.153.4/30
  • 34.126.0.0/18

IPv6 流量:

  • 2600:2d00:0002:1000::/64
  • 2001:4860:8040::/42

網路設定

本節說明基本網路需求,您必須符合這些需求,虛擬私有雲網路中的 VM 才能存取 Google API 和服務。

網域選項

選擇要用來存取 Google API 和服務的網域。

private.googleapis.comrestricted.googleapis.com 虛擬 IP 位址 (VIP) 僅支援透過 TCP 的 HTTP 型通訊協定 (HTTP、HTTPS 和 HTTP/2)。系統不支援所有其他通訊協定,包括 MQTT 和 ICMP。不支援使用網際網路的互動式網站和功能,例如重新導向或擷取內容。

網域和 IP 位址範圍 支援的服務 應用實例

預設網域。

Google API 和服務的所有網域名稱, private.googleapis.comrestricted.googleapis.com 除外。

各種 IP 位址範圍:您可以參照「預設網域的 IP 位址」,判斷一組包含預設網域可能使用位址的 IP 範圍。

無論是否支援 VPC Service Controls,都能存取大多數 Google API 和服務。包括 Google 地圖、Google Ads 和 Google Cloud的 API 存取權。包括 Gmail 和 Google 文件等 Google Workspace 網頁應用程式,以及其他網頁應用程式。

如果您未設定 private.googleapis.comrestricted.googleapis.com 的 DNS 記錄,系統就會使用預設網域。

private.googleapis.com

199.36.153.8/30

2600:2d00:0002:2000::/64

無論是否支援 VPC Service Controls,都能存取大多數 Google API 和服務。包括 Google 地圖、Google Ads、 Google Cloud和大多數其他 Google API 的 API 存取權,包括下列清單。不支援 Google Workspace 網頁應用程式,例如 Gmail 和 Google 文件。

相符的網域名稱:

  • accounts.google.com (僅支援服務帳戶 OAuth 驗證所需的路徑;使用者帳戶驗證為互動式,因此不支援)
  • *.aiplatform-notebook.cloud.google.com
  • *.aiplatform-notebook.googleusercontent.com
  • appengine.google.com
  • *.appspot.com
  • *.backupdr.cloud.google.com
  • backupdr.cloud.google.com
  • *.backupdr.googleusercontent.com
  • backupdr.googleusercontent.com
  • *.cloudfunctions.net
  • *.cloudproxy.app
  • *.composer.cloud.google.com
  • *.composer.googleusercontent.com
  • *.datafusion.cloud.google.com
  • *.datafusion.googleusercontent.com
  • *.dataproc.cloud.google.com
  • dataproc.cloud.google.com
  • *.dataproc.googleusercontent.com
  • dataproc.googleusercontent.com
  • dl.google.com
  • gcr.io*.gcr.io
  • *.googleapis.com
  • *.gke.goog
  • *.gstatic.com
  • *.kernels.googleusercontent.com
  • *.ltsapis.goog
  • *.notebooks.cloud.google.com
  • *.notebooks.googleusercontent.com
  • packages.cloud.google.com
  • pkg.dev*.pkg.dev
  • pki.goog*.pki.goog
  • *.run.app
  • source.developers.google.com
  • storage.cloud.google.com

使用 private.googleapis.com,透過只能從 Google Cloud內部路由傳送的一組 IP 位址存取 Google API 和服務。

在下列情況下選擇 private.googleapis.com

  • 您未使用 VPC Service Controls。
  • 您使用 VPC Service Controls,但需要存取 VPC Service Controls 不支援的 Google API 和服務。1

restricted.googleapis.com

199.36.153.4/30

2600:2d00:0002:1000::/64

啟用 VPC Service Controls 支援的 Google API 和服務存取權。

禁止存取不支援 VPC Service Controls 的 Google API 和服務。 不支援 Google Workspace API 或 Google Workspace 網頁應用程式,例如 Gmail 和 Google 文件。

使用 restricted.googleapis.com,透過只能從 Google Cloud內部路由傳送的一組 IP 位址存取 Google API 和服務。

如果需要存取 VPC Service Controls 支援的 Google API 和服務,請選擇 restricted.googleapis.com

restricted.googleapis.com 網域不允許存取不支援 VPC Service Controls 的 Google API 和服務。1

1 如要限制使用者只能存取支援 VPC Service Controls 的 Google API 和服務,請使用 restricted.googleapis.com,因為這項功能可進一步降低資料外洩風險。使用 restricted.googleapis.com 會拒絕存取 VPC Service Controls 不支援的 Google API 和服務。詳情請參閱 VPC Service Controls 說明文件中的設定私人連線

支援 private.googleapis.comrestricted.googleapis.com 的 IPv6

下列 IPv6 位址範圍可用於將 IPv6 用戶端的流量導向 Google API 和服務:

  • private.googleapis.com2600:2d00:0002:2000::/64
  • restricted.googleapis.com2600:2d00:0002:1000::/64

如要使用 private.googleapis.comrestricted.googleapis.com 網域,且用戶端使用 IPv6 位址,請考慮設定 IPv6 位址。如果 IPv6 用戶端也設定了 IPv4 位址,則可使用 IPv4 位址連線至 Google API 和服務。並非所有服務都接受來自 IPv6 用戶端的流量。

DNS 設定

如要連線至 Google API 和服務,您可以選擇將封包傳送至與 private.googleapis.comrestricted.googleapis.com VIP 相關聯的 IP 位址。如要使用 VIP,您必須設定 DNS,讓虛擬私有雲網路中的 VM 使用 VIP 位址 (而非公開 IP 位址) 連線至服務。

以下章節說明如何使用 DNS 區域,將封包傳送至與所選 VIP 相關聯的 IP 位址。請按照適用於您的所有情境操作:

設定 VIP 的 DNS 記錄時,請只使用下列步驟所述的 IP 位址。請勿混用 private.googleapis.comrestricted.googleapis.com VIP 的位址。這可能會導致間歇性故障,因為提供的服務會因封包目的地而異。

設定 googleapis.com 的 DNS

googleapis.com 建立 DNS 區域和記錄:

  1. googleapis.com 建立私人 DNS 區域。建議您為此目的建立 Cloud DNS 私人區域
  2. googleapis.com 區域中,為其中一個建立下列私人 DNS 記錄:private.googleapis.comrestricted.googleapis.com,視您選擇使用的網域而定。

    • 針對 private.googleapis.com

      1. private.googleapis.com 建立 A 記錄,指向下列 IP 位址:199.36.153.8199.36.153.9199.36.153.10199.36.153.11

      2. 如要使用 IPv6 位址連線至 API,請一併設定指向 2600:2d00:0002:2000::AAAA 記錄。private.googleapis.com

    • 針對 restricted.googleapis.com

      1. restricted.googleapis.com 建立 A 記錄,指向下列 IP 位址:199.36.153.4199.36.153.5199.36.153.6199.36.153.7

      2. 如要使用 IPv6 位址連線至 API,請一併建立指向 2600:2d00:0002:1000::AAAA 記錄。restricted.googleapis.com

    如要在 Cloud DNS 中建立私人 DNS 記錄,請參閱新增記錄

  3. googleapis.com 區域中,為 *.googleapis.com 建立 CNAME 記錄,指向您設定的網域:private.googleapis.comrestricted.googleapis.com

設定其他網域的 DNS

部分 Google API 和服務會使用其他網域名稱提供,包括 *.gcr.io*.gstatic.com*.pkg.devpki.goog*.run.app*.gke.goog。請參閱「網域選項」一文中的網域和 IP 位址範圍表格,判斷是否可使用 private.googleapis.comrestricted.googleapis.com 存取其他網域的服務。接著,針對每個額外網域執行下列操作:

  1. DOMAIN 建立 DNS 區域 (例如 gcr.io)。如果您使用 Cloud DNS,請確認這個區域與 googleapis.com 私人區域位於同一個專案。

  2. 在這個 DNS 區域中,為其中一個建立下列私人 DNS 記錄:private.googleapis.comrestricted.googleapis.com,視您選擇使用的網域而定。

    • 針對 private.googleapis.com

      1. DOMAIN 建立 A 記錄,指向下列 IP 位址:199.36.153.8199.36.153.9199.36.153.10199.36.153.11

      2. 如要使用 IPv6 位址連線至 API,請為 DOMAIN 建立指向 2600:2d00:0002:2000::AAAA 記錄。

    • 針對 restricted.googleapis.com

      1. DOMAIN 建立 A 記錄,指向下列 IP 位址:199.36.153.4199.36.153.5199.36.153.6199.36.153.7

      2. 如要使用 IPv6 位址連線至 API,請一併建立指向 2600:2d00:0002:1000::AAAA 記錄。restricted.googleapis.com

  3. DOMAIN 區域中,為 *.DOMAIN 建立指向 DOMAINCNAME 記錄。舉例來說,為 *.gcr.io 建立指向 gcr.ioCNAME 記錄。

設定 Cloud Storage 自訂網域名稱的 DNS

如果您使用 Cloud Storage 值區,並向Cloud Storage 自訂網域名稱傳送要求,則設定自訂 Cloud Storage 網域名稱的 DNS 記錄,指向 private.googleapis.comrestricted.googleapis.com 的 IP 位址,不足以允許存取 Cloud Storage 值區。

如要將要求傳送至 Cloud Storage 自訂網域名稱,您也必須將 HTTP 要求的 Host 標頭和 TLS SNI 明確設為 storage.googleapis.comprivate.googleapis.comrestricted.googleapis.com 的 IP 位址不支援 HTTP 要求 Host 標頭和 TLS SNI 中的自訂 Cloud Storage 主機名稱。

路由選項

虛擬私有雲網路必須具備適當路徑,且下一個躍點為預設網際網路閘道。 Google Cloud 不支援透過其他 VM 執行個體或自訂下一個躍點,將流量轉送至 Google API 和服務。雖然稱為「預設網際網路閘道」,但從虛擬私有雲網路中的 VM 傳送至 Google API 和服務的封包,仍會保留在 Google 網路中。

  • 如果選取預設網域,VM 執行個體會使用部分 Google 外部 IP 位址連線至 Google API 和服務。這些 IP 位址可公開轉送,但從虛擬私有雲網路中的 VM 到這些位址的路徑,仍會留在 Google 網路中。

  • Google 不會在網際網路上發布任何路徑,指向 private.googleapis.comrestricted.googleapis.com 網域使用的 IP 位址。因此,只有虛擬私有雲網路中的 VM,或連線至虛擬私有雲網路的內部部署系統,才能存取這些網域。

如果虛擬私有雲網路包含下一個躍點為預設網際網路閘道的預設路徑,您可以使用該路徑存取 Google API 和服務,不必建立自訂路徑。詳情請參閱「使用預設路徑進行路徑設定」。

如果您已將預設路徑 (目的地 0.0.0.0/0::0/0) 替換為下一個躍點「不是」預設網際網路閘道的自訂路徑,則可以使用自訂路徑,滿足 Google API 和服務的路由需求。

如果虛擬私有雲網路沒有 IPv6 預設路徑,您就無法透過 IPv6 連線至 Google API 和服務。新增 IPv6 預設路徑,允許 IPv6 連線。

使用預設路徑進行轉送

每個虛擬私有雲網路在建立時,都會包含 IPv4 預設路徑 (0.0.0.0/0)。如果您在子網路上啟用外部 IPv6 位址,系統會將產生的 IPv6 預設路徑 (::/0) 新增至該虛擬私有雲網路。

預設路徑會提供前往下列目的地 IP 位址的路徑:

  • 預設網域。

  • private.googleapis.com199.36.153.8/302600:2d00:0002:2000::/64

  • restricted.googleapis.com199.36.153.4/302600:2d00:0002:1000::/64

如要檢查特定網路中的預設路徑設定,請按照下列指示操作。

主控台

  1. 前往 Google Cloud 控制台的「Routes」(路徑) 頁面。

    前往「Routes」(路徑)

  2. 篩選路徑清單,讓畫面只顯示您需要檢查的網路路徑。

  3. 找出目的地為 IPv4 流量的 0.0.0.0/0 或 IPv6 流量的 ::/0,且下一個躍點為「預設網際網路閘道」的路徑。

gcloud

使用下列 gcloud 指令,並將 NETWORK_NAME 替換為要檢查的網路名稱:

gcloud compute routes list \
    --filter="default-internet-gateway NETWORK_NAME"

如需建立替代的預設 IPv4 路徑,請參閱「新增靜態路徑」。

如需建立替代的預設 IPv6 路徑,請參閱「新增 IPv6 預設路徑」。

自訂路徑

除了預設路徑,您也可以使用自訂靜態路徑,每個路徑都有更明確的目的地,且都使用預設網際網路閘道下一個躍點。您需要的路由數量和目的地 IP 位址取決於您選擇的網域

  • 預設網域:您必須擁有 Google API 和服務的 IP 位址範圍路徑。
  • private.googleapis.com199.36.153.8/302600:2d00:0002:2000::/64
  • restricted.googleapis.com199.36.153.4/302600:2d00:0002:1000::/64

此外,建議您為 34.126.0.0/182001:4860:8040::/42 新增路徑。詳情請參閱「設定選項摘要」。

如要檢查特定網路中 Google API 和服務的自訂路徑設定,請按照下列指示操作。

主控台

  1. 前往 Google Cloud 控制台的「Routes」(路徑) 頁面。

    前往「Routes」(路徑)

  2. 使用「篩選資料表」文字欄位,依下列條件篩選路徑清單,並將 NETWORK_NAME 替換為虛擬私有雲網路的名稱。

    • 網路:NETWORK_NAME
    • 下一個躍點類型:default internet gateway
  3. 查看每條路徑的「目的地 IP 範圍」欄。如果您選擇預設網域,請檢查多個自訂靜態路徑,預設網域使用的每個 IP 位址範圍各有一個路徑。如果您選擇 private.googleapis.comrestricted.googleapis.com,請尋找該網域的 IP 範圍

gcloud

使用下列 gcloud 指令,並將 NETWORK_NAME 替換為要檢查的網路名稱:

gcloud compute routes list \
    --filter="default-internet-gateway NETWORK_NAME"

除非使用 --format 標記自訂指令,否則路徑會以表格格式列出。在「DEST_RANGE」欄中,查看每條路線的目的地。如果您選擇預設網域,請檢查是否有數個自訂靜態路徑,預設網域使用的每個 IP 位址範圍各有一個路徑。如果您選擇 private.googleapis.comrestricted.googleapis.com,請尋找該網域的 IP 範圍

如需建立路徑,請參閱「新增靜態路徑」。

防火牆設定

虛擬私有雲網路的防火牆設定必須允許從 VM 存取 Google API 和服務使用的 IP 位址。隱含的 allow egress 規則可滿足這項要求。

在某些防火牆設定中,您需要建立特定的輸出允許規則。舉例來說,假設您已建立輸出拒絕規則,封鎖所有目的地的流量 (IPv4 為 0.0.0.0,IPv6 為 ::/0)。在這種情況下,您必須為 Google API 和服務使用的每個 IP 位址範圍,建立一項優先順序高於輸出拒絕規則的輸出允許防火牆規則,這些 IP 位址範圍屬於您選擇的網域

  • 預設網域:所有 Google API 和服務的 IP 位址範圍
  • private.googleapis.com199.36.153.8/302600:2d00:0002:2000::/64
  • restricted.googleapis.com199.36.153.4/302600:2d00:0002:1000::/64

此外,建議您在輸出允許防火牆規則中加入 34.126.0.0/182001:4860:8040::/42。詳情請參閱「設定選項摘要」。

如要建立防火牆規則,請參閱「建立防火牆規則」。定義每項輸出允許規則的目標時,您可以限制防火牆規則適用的 VM。

預設網域的 IP 位址

本節說明如何建立 Google API 和服務 (例如 *.googleapis.com*.gcr.io) 使用的預設網域 IP 範圍清單。這些範圍是動態分配,且經常變更,因此無法為個別服務或 API 定義特定 IP 範圍。如要維持名單的準確度,請設定自動化功能,每天執行指令碼。如要避免維護 IP 位址範圍清單,請考慮使用 private.googleapis.com VIPPrivate Service Connect

  • Google 在網際網路中公布了一份 IP 範圍完整清單,並以 goog.json 的格式發布。

  • 此外,Google 也以 cloud.json 的格式發布了另一份清單,當中列出了客戶可在全球和特定區域內使用的外部 IP 位址範圍。 Google Cloud

Google API 和服務預設網域使用的 IP 位址,符合從 goog.json 中移除所有 cloud.json 範圍後計算出的範圍清單。這些清單會經常更新。

您可以使用下列 Python 指令碼,建立包含 Google API 和服務預設網域所用 IP 位址的範圍清單。

如要瞭解如何執行這項指令碼,請參閱「如何執行」。

from __future__ import print_function

import json

try:
    from urllib import urlopen
except ImportError:
    from urllib.request import urlopen
    from urllib.error import HTTPError

import netaddr

IPRANGE_URLS = {
    "goog": "https://www.gstatic.com/ipranges/goog.json",
    "cloud": "https://www.gstatic.com/ipranges/cloud.json",
}


def read_url(url):
    try:
        return json.loads(urlopen(url).read())
    except (IOError, HTTPError):
        print("ERROR: Invalid HTTP response from %s" % url)
    except json.decoder.JSONDecodeError:
        print("ERROR: Could not parse HTTP response from %s" % url)


def get_data(link):
    data = read_url(link)
    if data:
        print("{} published: {}".format(link, data.get("creationTime")))
        cidrs = netaddr.IPSet()
        for e in data["prefixes"]:
            if "ipv4Prefix" in e:
                cidrs.add(e.get("ipv4Prefix"))
            if "ipv6Prefix" in e:
                cidrs.add(e.get("ipv6Prefix"))
        return cidrs


def main():
    cidrs = {group: get_data(link) for group, link in IPRANGE_URLS.items()}
    if len(cidrs) != 2:
        raise ValueError("ERROR: Could process data from Google")
    print("IP ranges for Google APIs and services default domains:")
    for ip in (cidrs["goog"] - cidrs["cloud"]).iter_cidrs():
        print(ip)


if __name__ == "__main__":
    main()