外部 IP アドレスを持つ VM から API にアクセスする

このページに記載されているネットワーク要件が満たされている場合、ネットワーク インターフェースに割り振られた外部 IP アドレスを持つ仮想マシン(VM)インスタンスは Google API とサービスに接続できます。接続は VM の外部 IP アドレスから行われますが、トラフィックは Google Cloud 内にとどまり、公共のインターネットを介して送信されません。

ネットワーク要件

外部 IP アドレスを持つ VM から Google API とサービスにアクセスするには、次の要件を満たす必要があります。

  • IPv6 を使用して Google API とサービスに接続する場合は、次の両方の要件を満たす必要があります。

    • VM に外部 /96 IPv6 アドレス範囲を構成します。

    • VM で実行されているソフトウェアは、送信元がこれらの IPv6 アドレスのいずれかに一致するパケットを送信する必要があります。

  • 選択した構成によっては、DNS エントリ、ルート、ファイアウォール ルールの更新が必要になる場合があります。詳細については、構成オプションの概要をご覧ください。

構成オプションの概要

次の表は、限定公開の Google アクセスのさまざまな構成方法をまとめたものです。詳細な構成情報については、ネットワークの構成をご覧ください。

ドメイン オプション DNS 構成 ルーティング構成 ファイアウォール構成
デフォルト ドメイン 特別な DNS 構成は必要ありません。

VPC ネットワークが、Google API とサービスで使用する IP アドレス範囲へのトラフィックをルーティングできるようにしてください。

  • 基本構成: ネクストホップが default-internet-gateway、宛先の範囲が 0.0.0.0/0(IPv4 トラフィックの場合)と ::/0(IPv6 トラフィック、必要な場合)のデフォルト ルートがあることを確認してください。このようなルートがない場合は作成してください。
  • カスタム構成: Google API とサービスで使用する IP アドレス範囲のルートを作成してください。

Google API とサービスで使用する IP アドレス範囲への下り(外向き)がファイアウォール ルールで許可されるようにしてください。

デフォルトの下り(外向き)許可のファイアウォール ルールでは、このトラフィックをブロックする優先度の高いルールがない限り、このトラフィックが許可されます。

private.googleapis.com

次の IP アドレスにリクエストを送信するように、限定公開 DNS ゾーン内に DNS レコードを構成してください。

IPv4 トラフィックの場合:

  • 199.36.153.8/30

IPv6 トラフィックの場合:

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

VPC ネットワークに次の 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

次の IP アドレスにリクエストを送信するように DNS レコードを構成してください。

IPv4 トラフィックの場合:

  • 199.36.153.4/30

IPv6 トラフィックの場合:

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

VPC ネットワークに次の 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

ネットワークの構成

このセクションでは、VPC ネットワーク内の VM が Google API とサービスにアクセスするために必要な基本的なネットワーク要件について説明します。

ドメイン オプション

Google API とサービスへのアクセスに使用するドメインを選択します。

private.googleapis.comrestricted.googleapis.com の仮想 IP アドレス(VIP)は、TCP を使用する HTTP ベースのプロトコル(HTTP、HTTPS、HTTP/2)のみをサポートします。MQTT や ICMP などの他のプロトコルはサポートされていません。

ドメインと IP アドレス範囲 サポート対象のサービス 使用例

デフォルト ドメイン。

private.googleapis.comrestricted.googleapis.com を除く Google API とサービスのすべてのドメイン名。

さまざまな IP アドレス範囲 - デフォルト ドメインの IP アドレスを参照することにより、デフォルト ドメインで使用される可能性のあるアドレスを含む IP 範囲のセットを決定できます。

VPC Service Controls でサポートされているかどうかにかかわらず、ほとんどの Google API とサービスへの API アクセスを有効にします。これには、Google マップ、Google 広告、Google Cloud への API アクセスが含まれます。また、Google Workspace のウェブ アプリケーション(Gmail や Google ドキュメントなど)とその他のウェブ アプリケーションも含まれます。

デフォルト ドメインは、private.googleapis.comrestricted.googleapis.com の DNS レコードを構成していない場合に使用されます。

private.googleapis.com

199.36.153.8/30

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

VPC Service Controls でサポートされているかどうかにかかわらず、ほとんどの Google API とサービスへの API アクセスを有効にします。Google マップ、Google 広告、Google Cloud、さらに以下のリストを含む他のほとんどの Google API への API アクセスが含まれます。Gmail や Google ドキュメントなどの Google Workspace ウェブ アプリケーションはサポートされていません。インタラクティブなウェブサイトはサポートされていません。

一致するドメイン名:

  • 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 およびサービスへの API アクセスを有効にします。

VPC Service Controls をサポートしない Google API とサービスへのアクセスをブロックします。Google Workspace API、または Gmail や Google ドキュメントなどの Google Workspace ウェブ アプリケーションはサポートされていません。

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.com: 2600:2d00:0002:2000::/64
  • restricted.googleapis.com: 2600:2d00:0002:1000::/64

private.googleapis.com または restricted.googleapis.com ドメインを使用していて、IPv6 アドレスを使用するクライアントがある場合は、IPv6 アドレスの構成を検討してください。IPv4 アドレスも構成されている IPv6 クライアントは、IPv4 アドレスを使用して Google API とサービスにアクセスできます。すべてのサービスが IPv6 クライアントからのトラフィックを受信するわけではありません。

DNS 構成

Google API とサービスへの接続では、private.googleapis.com VIP または restricted.googleapis.com VIP に関連付けられた IP アドレスにパケットを送信できます。VIP を使用するには、VPC ネットワーク内の VM がパブリック IP アドレスではなく VIP アドレスを使用してサービスにアクセスできるように DNS を構成する必要があります。

以降のセクションでは、DNS ゾーンを使用して、選択した VIP に関連付けられている IP アドレスにパケットを送信する方法について説明します。該当するすべてのシナリオの指示に従ってください。

VIP の DNS レコードを構成する場合は、次の手順で説明する IP アドレスのみを使用してください。private.googleapis.com VIP と restricted.googleapis.com VIP のアドレスを混在させないでください。パケットの宛先によって提供するサービスが異なるため、断続的な障害が発生する可能性があります。

googleapis.com の DNS を構成する

googleapis.com の DNS ゾーンとレコードを作成します。

  1. googleapis.com の限定公開 DNS ゾーンを作成します。その場合は、Cloud DNS 限定公開ゾーンの作成を検討してください。
  2. googleapis.com ゾーンで、使用するドメインに応じて private.googleapis.com または restricted.googleapis.com に以下のプライベート DNS レコードを作成します。

    • private.googleapis.com:

      1. IP アドレス 199.36.153.8199.36.153.9199.36.153.10199.36.153.11 を指す private.googleapis.comA レコードを作成します。

      2. IPv6 アドレスを使用して API に接続するには、2600:2d00:0002:2000:: を指す private.googleapis.comAAAA レコードも構成します。

    • restricted.googleapis.com:

      1. IP アドレス 199.36.153.4199.36.153.5199.36.153.6199.36.153.7 を指す restricted.googleapis.comA レコードを作成します。

      2. IPv6 アドレスを使用して API に接続するには、2600:2d00:0002:1000:: を指す restricted.googleapis.comAAAA レコードも作成します。

    Cloud DNS でプライベート DNS レコードを作成するには、レコードを追加するをご覧ください。

  3. googleapis.com ゾーンで、構成したドメイン(private.googleapis.com または restricted.googleapis.com)を指す *.googleapis.comCNAME レコードを作成します。

他のドメインの DNS を構成する

一部の Google API とサービスは、*.gcr.io*.gstatic.com*.pkg.devpki.goog*.run.app などの追加ドメイン名を使用して提供されます。追加のドメインのサービスに private.googleapis.com または restricted.googleapis.com を使用してアクセスできるかどうかを判断するため、ドメイン オプションのドメインと IP アドレス範囲の表を参照します。それぞれの追加ドメインについて、次の作業を行います。

  1. DOMAIN の DNS ゾーンを作成します(例: gcr.io)。Cloud DNS を使用している場合は、このゾーンが googleapis.com 限定公開ゾーンと同じプロジェクトにあることを確認してください。

  2. この DNS ゾーンで、使用するドメインに応じて private.googleapis.com または restricted.googleapis.com に以下のプライベート DNS レコードを作成します。

    • private.googleapis.com:

      1. IP アドレス 199.36.153.8199.36.153.9199.36.153.10199.36.153.11 を指す DOMAINA レコードを作成します。

      2. IPv6 アドレスを使用して API に接続するには、2600:2d00:0002:2000:: を指す DOMAINAAAA レコードも作成します。

    • restricted.googleapis.com:

      1. IP アドレス 199.36.153.4199.36.153.5199.36.153.6199.36.153.7 を指す DOMAINA レコードを作成します。

      2. IPv6 アドレスを使用して API に接続するには、2600:2d00:0002:1000:: を指す restricted.googleapis.comAAAA レコードも作成します。

  3. DOMAIN ゾーンで、DOMAIN を指す *.DOMAINCNAME レコードを作成します。たとえば、gcr.io を指す *.gcr.ioCNAME レコードを作成します。

Cloud Storage カスタム ドメイン名の DNS を構成する

Cloud Storage バケットを使用していて、リクエストを Cloud Storage のカスタム ドメイン名に送信する場合、Cloud Storage バケットへのアクセスを許可するには、カスタム Cloud Storage ドメイン名の DNS レコードが private.googleapis.com または restricted.googleapis.com の IP アドレスを指し示すように構成するだけでは不十分です。

Cloud Storage のカスタム ドメイン名にリクエストを送信する場合は、HTTP リクエストの Host ヘッダーと TLS SNI を storage.googleapis.com に明示的に設定する必要もあります。private.googleapis.comrestricted.googleapis.com の IP アドレスは、HTTP リクエストの Host ヘッダーと TLS SNI のカスタム Cloud Storage ホスト名をサポートしていません。

ルーティング オプション

VPC ネットワークには、ネクストホップがデフォルトのインターネット ゲートウェイである適切なルートが必要です。Google Cloud は、他の VM インスタンスまたはカスタム ネクストホップを介した Google API とサービスへのトラフィックのルーティングをサポートしていません。デフォルトのインターネット ゲートウェイと呼ばれてはいますが、VPC ネットワーク内の VM から Google API とサービスに送信されるパケットは、Google のネットワーク内に残ります。

  • デフォルト ドメインを選択した場合、VM インスタンスは Google の外部 IP アドレスのサブセットを使用して Google API とサービスに接続します。この IP アドレスは一般公開され、ルーティング可能ですが、VPC ネットワーク内の VM からこれらのアドレスへのパスが Google のネットワーク内に残ります。

  • Google は、private.googleapis.com ドメインまたは restricted.googleapis.com ドメインで使用されているいずれの IP アドレス範囲のインターネット上のルートも公開していません。したがって、こうしたドメインにアクセスできるのは、VPC ネットワーク内の VM または VPC ネットワークに接続されているオンプレミス システムの場合のみです。

ネクストホップがデフォルトのインターネット ゲートウェイであるデフォルト ルートが VPC ネットワークに含まれている場合、そのルートを使用すると、カスタムルートを作成しなくても、Google API とサービスにアクセスできます。詳細については、デフォルト ルートでのルーティングをご覧ください。

デフォルト ルート(宛先 0.0.0.0/0 または ::0/0)を、ネクストホップがデフォルトのインターネット ゲートウェイではないカスタムルートに置き換えた場合は、代わりにカスタム ルーティングを使用して、Google API とサービスのルーティング要件を満たすことができます。

VPC ネットワークに IPv6 のデフォルト ルートがない場合、Google API とサービスへの IPv6 接続は確立されません。IPv6 接続を許可するには、IPv6 デフォルト ルートを追加します。

デフォルト ルートでのルーティング

各 VPC ネットワークには、作成時に IPv4 のデフォルト ルート(0.0.0.0/0)が含まれます。サブネットで外部 IPv6 アドレスを有効にすると、システムによって生成された IPv6 デフォルト ルート(::/0)がその VPC ネットワークに追加されます。

デフォルトのルートは、次の宛先の IP アドレスへのパスを提供します。

  • デフォルト ドメイン。

  • private.googleapis.com: 199.36.153.8/302600:2d00:0002:2000::/64

  • restricted.googleapis.com: 199.36.153.4/302600:2d00:0002:1000::/64

特定のネットワークのデフォルト ルートの構成を確認する方法は次のとおりです。

コンソール

  1. Google Cloud Console で、[ルート] ページに移動します。

    [ルート] に移動

  2. ルートのリストをフィルタして、検査する必要があるネットワークのルートのみを表示します。

  3. 宛先が 0.0.0.0/0(IPv4 トラフィックの場合)か、::/0(IPv6 トラフィックの場合)で、ネクストホップがデフォルトのインターネット ゲートウェイであるルートを探します。

gcloud

次の gcloud コマンドを使用して、NETWORK_NAME を調べるネットワークの名前に置き換えます。

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

置換用のデフォルト IPv4 ルートを作成する必要がある場合は、静的ルートの追加をご覧ください。

置換用のデフォルトの IPv6 ルートを作成する必要がある場合は、IPv6 のデフォルト ルートの追加をご覧ください。

カスタム ルーティング

デフォルト ルートの代わりに、宛先がより狭く、デフォルトのインターネット ゲートウェイ ネクストホップを使用するカスタム静的ルートを使用することもできます。必要なルートの数と宛先 IP アドレスは、選択したドメインによって異なります。

また、34.126.0.0/182001:4860:8040::/42 のルートを追加することもおすすめします。詳細については、構成オプションの概要をご覧ください。

特定のネットワークで Google API とサービスのカスタムルートの構成を確認する方法は次のとおりです。

コンソール

  1. Google Cloud Console で、[ルート] ページに移動します。

    [ルート] に移動

  2. [表をフィルタリング] テキスト フィールドで、次の条件を指定してルートのリストをフィルタリングします。NETWORK_NAME は実際の VPC ネットワークの名前に置き換えてください。

    • ネットワーク: NETWORK_NAME
    • ネクストホップのタイプ: default internet gateway
  3. 各ルートの [宛先 IP の範囲] 列を確認します。デフォルト ドメインを選択した場合は、複数のカスタム静的ルート(デフォルト ドメインで使用される各 IP アドレス範囲ごとに 1 つ)がないか確認します。private.googleapis.com または restricted.googleapis.com を選択した場合は、そのドメインの IP 範囲を探します。

gcloud

次の gcloud コマンドを使用して、NETWORK_NAME を調べるネットワークの名前に置き換えます。

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

--format フラグでコマンドをカスタマイズしない限り、ルートはテーブル形式で一覧表示されます。DEST_RANGE 列で各ルートの宛先を探します。デフォルト ドメインを選択した場合は、複数のカスタム静的ルート(デフォルト ドメインで使用される各 IP アドレス範囲ごとに 1 つ)がないか確認します。private.googleapis.com または restricted.googleapis.com を選択した場合は、そのドメインの IP 範囲を探します。

ルートを作成する必要がある場合は、静的ルートの追加をご覧ください。

ファイアウォール構成

VPC ネットワークのファイアウォール構成では、VM から Google API とサービスによって使用される IP アドレスへのアクセスを許可する必要があります。暗黙の allow egress ルールは、この要件を満たしています。

一部のファイアウォール構成では、特定の下り(外向き)許可ルールを作成する必要があります。たとえば、すべての宛先(IPv4 の場合は 0.0.0.0、IPv6 の場合は ::/0)をブロックする下り(外向き)拒否ルールを作成したとします。この場合、Google API とサービス用に、選択したドメインが使用する各 IP アドレス範囲の下り(外向き)拒否ルールよりも優先順位が高い下り(外向き)許可のファイアウォール ルールを 1 つ作成する必要があります。

また、下り(外向き)許可のファイアウォール ルールに 34.126.0.0/182001:4860:8040::/42 を含めることもおすすめします。詳細については、構成オプションの概要をご覧ください。

ファイアウォール ルールを作成するには、ファイアウォール ルールの作成をご覧ください。各下り(外向き)許可ルールのターゲットを定義するときに、ファイアウォール ルールが適用される VM を制限できます。

デフォルト ドメインの IP アドレス

このセクションでは、Google API とサービスで使用されるデフォルト ドメインの IP 範囲(*.googleapis.com*.gcr.io など)のリストを作成する方法について説明します。これらの範囲は動的に割り振られ、頻繁に変更されます。このため、個々のサービスまたは API に特定の IP 範囲を定義することはできません。正確なリストを保持するには、スクリプトを毎日実行するように自動化を設定します。IP アドレス範囲のリストを維持する別の方法として、private.googleapis.com VIP または Private Service Connect の使用も検討してください。

  • Google では、インターネット上でユーザーが使用できる IP 範囲の完全なリストを goog.json で公開しています。

  • また、お客様の Google Cloud リソースで使用可能なグローバルとリージョンの外部 IP アドレス範囲のリストを cloud.json に公開しています。

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()