Ausgehende IP-Adressen für App Engine-Dienste

Ausgehende Dienste wie die URL Fetch API, die Sockets API und die Mail API verwenden einen großen Pool von IP-Adressen. Die IP-Adressbereiche in diesem Pool unterliegen regelmäßigen Änderungen. Bei zwei aufeinanderfolgenden API-Aufrufen derselben Anwendung kann beispielsweise der Eindruck entstehen, sie stammten von zwei verschiedenen IP-Adressen.

Wenn Sie die IP-Adressen kennen müssen, die mit dem ausgehenden Traffic von Ihrem Dienst verknüpft sind, können Sie entweder die aktuellen IP-Adressbereiche für Ihren Dienst ermitteln oder eine statische IP-Adresse für Ihren Dienst einrichten.

IP-Adressen für App Engine-Dienste

Sie können die aktuellen IP-Adressbereiche für Ihre App Engine-Dienste anhand der von Google veröffentlichten IP-Bereichsinformationen ermitteln:

  • Google veröffentlicht die vollständige Liste der IP-Bereiche, die Nutzern im Internet zur Verfügung stehen, in goog.json.

  • Außerdem veröffentlicht Google in der Datei cloud.json eine Liste globaler und regionaler externer IP-Adressbereiche, die für die Google Cloud-Ressourcen des Kunden verfügbar sind.

Die von Google APIs und Diensten verwendeten IP-Adressen liegen innerhalb der Bereiche, die verbleiben, nachdem die Bereiche aus cloud.json aus denen in goog.json entfernt wurden. Das folgende Beispiel zeigt, wie Sie diesen Bereich mit Python abrufen.

Mit dem folgenden Python-Skript können Sie eine Liste der IP-Adressbereiche erstellen, die die von Google APIs und Diensten verwendeten enthalten.

Weitere Informationen zum Ausführen dieses Skripts finden Sie unter Ausführung.

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

Statische ausgehende IP-Adresse einrichten

Verwenden Sie zum Einrichten einer statischen IP-Adresse für den Dienst der App Engine-Standardumgebung den serverlosen VPC-Zugriff mit Cloud Router und Cloud NAT. Mit dem serverlosen VPC-Zugriff können Sie ausgehenden Traffic an Ihr VPC-Netzwerk (Virtual Private Cloud) senden. Wenn Sie ein NAT-Gateway (Network Address Translation) in Ihrer VPC verwenden, können Sie den App Engine-Traffic über eine dedizierte IP-Adresse weiterleiten.

Wenn Sie den Traffic über Cloud NAT weiterleiten, wird kein zusätzlicher Hop im Netzwerk-Stack verursacht, da das Cloud NAT-Gateway und der Cloud Router nur eine Steuerungsebene bieten und die Pakete nicht durch das NAT-Gateway oder den Cloud Router weitergeleitet werden.

In den folgenden Schritten wird gezeigt, wie Sie eine statische ausgehende IP-Adresse für Ihren Dienst der App Engine-Standardumgebung einrichten.

  1. Prüfen Sie, ob Sie die Rolle roles/compute.networkAdmin oder eine benutzerdefinierte Rolle mit denselben Berechtigungen haben.

  2. Erstellen Sie ein Subnetzwerk (Subnetz) in Ihrem VPC-Netzwerk für App Engine-Traffic. Dadurch wird vermieden, dass andere Ressourcen in Ihrem VPC-Netzwerk die statische IP-Adresse verwenden können.

    gcloud compute networks subnets create SUBNET_NAME \
        --range=RANGE \
        --network=NETWORK_NAME \
        --region=REGION

    Ersetzen Sie im obigen Befehl Folgendes:

    • SUBNET_NAME durch einen Namen, den Sie dem Subnetz geben möchten
    • RANGE durch den IP-Bereich im CIDR-Format, den Sie diesem Subnetz zuweisen möchten (z. B. 10.124.0.0/28).
    • NETWORK_NAME durch den Namen Ihres VPC-Netzwerks.
    • REGION durch die Region Ihres App Engine-Dienstes.
  3. Verbinden Sie den App Engine-Dienst mit dem Subnetz.

    Folgen Sie der Anleitung Verbindung zu einem VPC-Netzwerk herstellen und geben Sie den Namen des Subnetzes an, das Sie im vorherigen Schritt für das Connector-Subnetz erstellt haben.

  4. Erstellen Sie einen neuen Cloud Router. Cloud Router ist eine erforderliche Komponente der Steuerungsebene für Cloud NAT.

    gcloud compute routers create ROUTER_NAME \
        --network=NETWORK_NAME \
        --region=REGION

    Ersetzen Sie im obigen Befehl Folgendes:

    • ROUTER_NAME durch einen Namen für die Cloud Router-Ressource, die Sie erstellen möchten.
    • NETWORK_NAME durch den Namen Ihres VPC-Netzwerks.
    • REGION durch die Region, in der Sie ein NAT-Gateway erstellen möchten.
  5. Reservieren Sie eine statische IP-Adresse.

    Dies ist die Adresse, mit der Ihr Dienst ausgehenden Traffic sendet. Eine reservierte IP-Adressressource behält die zugrunde liegende IP-Adresse bei, wenn die ihr zugeordnete Ressource gelöscht und neu erstellt wird. Diese IP-Adresse wird auf die statischen IP-Adresskontingente in Ihrem Google Cloud-Projekt angerechnet.

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    Ersetzen Sie im obigen Befehl Folgendes:

    • ORIGIN_IP_NAME durch den Namen, den Sie der IP-Adressressource zuweisen möchten.
    • REGION durch die Region, in der der Cloud NAT-Router ausgeführt wird. Idealerweise sollten Sie dieselbe Region wie der App Engine-Dienst verwenden, um Latenz und Netzwerkkosten zu minimieren.

    Verwenden Sie den Befehl compute addresses describe, um das Ergebnis anzeigen zu lassen:

    gcloud compute addresses describe ORIGIN_IP_NAME
  6. Erstellen Sie ein Cloud NAT-Gateway und geben Sie Ihre IP-Adresse an.

    Traffic aus Ihrem Subnetz wird über dieses Gateway geleitet und verwendet die statische IP-Adresse, die Sie im vorherigen Schritt reserviert haben.

    gcloud compute routers nats create NAT_NAME \
        --router=ROUTER_NAME \
        --region=REGION \
        --nat-custom-subnet-ip-ranges=SUBNET_NAME \
        --nat-external-ip-pool=ORIGIN_IP_NAME
      

    Ersetzen Sie im obigen Befehl Folgendes:

    • NAT_NAME durch einen Namen für die Cloud NAT-Gateway-Ressource, die Sie erstellen möchten.
    • ROUTER_NAME durch den Namen Ihres Cloud Routers.
    • REGION durch die Region, in der Sie ein NAT-Gateway erstellen möchten.
    • ORIGIN_IP_NAME durch den Namen der reservierten IP-Adressressource, die Sie im vorherigen Schritt erstellt haben.
  7. Legen Sie die Einstellung für ausgehenden Traffic für den serverlosen VPC-Zugriff auf all-traffic fest.

    Standardmäßig senden App Engine-Dienste, die den serverlosen VPC-Zugriff verwenden, nur internen Traffic an Ihr VPC-Netzwerk. Wenn Sie Traffic mit externen Zielen an Ihr VPC-Netzwerk senden möchten, damit es die von Ihnen angegebene statische IP-Adresse hat, müssen Sie die Einstellung für ausgehenden Traffic ändern.

    Geben Sie die Einstellung für ausgehenden Traffic in der app.yaml-Datei für Ihren Dienst an:

    vpc_access_connector:
      name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
      egress_setting: all-traffic

    Ersetzen Sie:

    • PROJECT_ID durch Ihre Cloud-Projekt-ID.
    • REGION durch die Region, in der sich der Connector befindet.
    • CONNECTOR_NAME durch den Namen des Connectors.

    Stellen Sie den Dienst bereit:

     gcloud app deploy