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. Diese Listen werden häufig aktualisiert.

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.

Statische ausgehende IP-Adressen können nicht für Traffic konfiguriert werden, der über den URL-Abrufdienst gesendet wird. Traffic, der über den URL-Abrufdienst gesendet wird, verwendet weiterhin den öffentlichen IP-Adresspool. Wenn der gesamte ausgehende Traffic eine statische IP-Adresse verwenden soll, deaktivieren Sie die URL-Abrufeinstellung standardmäßig und beenden Sie die explizite Verwendung der Bibliothek urlfetch.

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 Google 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