Ausgehende IP-Adressen für App Engine-Dienste

Standardmäßig verwenden ausgehende Dienste in der App Engine-Standardumgebung, wie die URL Fetch API, die Sockets API und die Mail API, einen regionalen Pool dynamischer IP-Adressen, die von allen serverlosen Arbeitslasten gemeinsam genutzt werden. Die IP-Adressbereiche in diesem Pool ändern sich regelmäßig, sodass zwei aufeinanderfolgende Aufrufe derselben Anwendung von verschiedenen IP-Adressen stammen können.

Da andere serverlose Arbeitslasten diesen Standard-IP-Adresspool gemeinsam nutzen, sollten Sie sich nicht darauf verlassen, wenn Sie eine vorhersagbare Ursprungs-IP-Adresse oder eine isolierte IP-Reputation benötigen. Richten Sie stattdessen eine statische ausgehende IP-Adresse für Ihren Dienst ein, wenn:

  • Sie stellen eine Verbindung zu einer externen Datenbank oder API her, die eine Zulassungsliste für IP-Adressen oder eine Firewall verwendet.
  • Sie stellen eine Verbindung zu externen Endpunkten her, die für die Reputation sensibel sind, z. B. Zahlungsgateways, gehostete Datenbanken oder Partner-APIs, die durch Web Application Firewalls (WAFs) von Drittanbietern geschützt sind. Störender Traffic von einem anderen Mandanten im standardmäßigen freigegebenen IP-Pool kann die IP-Reputation beeinträchtigen und dazu führen, dass externe WAFs Ihre Anfragen blockieren oder drosseln.
  • Sie führen autorisierte Netzwerkscans, Portaufzählungen, Host-Fingerprinting, Sicherheitslückenprüfungen, Web-Scraping oder Lasttests für Arbeitslasten aus.

Wenn Sie nur die IP-Adressbereiche für den standardmäßigen ausgehenden Traffic von Ihrem Dienst ermitteln müssen, können Sie die aktuellen IP-Adressbereiche finden, die App Engine-IP-Adressen enthalten.

IP-Adressen für App Engine-Dienste

Sie können die aktuellen IP-Adressbereiche für App Engine-Dienste mithilfe von zwei von Google veröffentlichten JSON-Dateien ermitteln:

  • Google veröffentlicht eine Liste der Google-eigenen IP-Adressen 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.

Wenn Sie alle Bereiche in cloud.json aus denen in goog.json entfernen, erhalten Sie eine große Anzahl von IP-Adressen, die von globalen Google APIs und anderen Google-Diensten verwendet werden, einschließlich kundenorientierter Produkte außerhalb von Google Cloud. Diese Listen werden häufig aktualisiert.

Mit dem folgenden Python-Script 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

Wenn Sie eine statische IP-Adresse für Ihren App Engine-Standardumgebungsdienst einrichten möchten, leiten Sie den ausgehenden Traffic entweder mit ausgehendem Direct VPC-Traffic oder serverlosem VPC-Zugriff mit Cloud Router und Cloud NAT an ein VPC-Netzwerk (Virtual Private Cloud) weiter. Wenn Sie Ihrem VPC-Netzwerk ein Cloud NAT-Gateway hinzufügen, wird der ausgehende App Engine-Traffic über Ihre reservierte statische IP-Adresse weitergeleitet.

Wenn Ihr Dienst auf viele Instanzen skaliert wird oder viele gleichzeitige Verbindungen öffnet, z. B. während eines autorisierten Netzwerkscans, weisen Sie Cloud NAT mehrere statische IP-Adressen zu. Sie können auch die Mindestanzahl von Ports pro Instanz erhöhen oder die dynamische Portzuweisung aktivieren, um eine Port-Erschöpfung zu verhindern. Weitere Informationen dazu, wie Cloud NAT-Gateways IP-Adressen und Ports verwenden

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 Cloud 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 Folgendes:

    • SUBNET_NAME: Name für das Subnetz
    • RANGE: der IP-Bereich im CIDR-Format, den Sie diesem Subnetz zuweisen möchten (z. B. 10.124.0.0/28). Für ausgehenden Direct VPC-Traffic ist ein Bereich von /26 oder größer erforderlich. Ein Connector für Serverloser VPC-Zugriff erfordert einen /28-Bereich.
    • NETWORK_NAME: der Name des VPC-Netzwerks
    • REGION: die Region Ihres App Engine-Dienstes.
  3. Verbinden Sie Ihren App Engine-Dienst mit einer der folgenden Methoden mit dem Subnetz:

    • Ausgehender Direct VPC-Traffic: Folgen Sie der Anleitung zum Konfigurieren von ausgehendem Direct VPC-Traffic und geben Sie im Feld subnet den Namen des Subnetzes an, das Sie im vorherigen Schritt erstellt haben.
    • Connector für serverlosen VPC-Zugriff: Folgen Sie der Anleitung zum Herstellen einer Verbindung zu einem VPC-Netzwerk 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 Folgendes:

    • ROUTER_NAME: Ein Name für die Cloud Router-Ressource, die Sie erstellen möchten.
    • NETWORK_NAME: der Name des VPC-Netzwerks
    • REGION: 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 Kontingente für statische IP-Adressen in Ihrem Google Cloud -Projekt angerechnet.

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    Ersetzen Sie Folgendes:

    • ORIGIN_IP_NAME: der Name, den Sie der IP-Adressressource zuweisen möchten.
    • REGION: 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 Folgendes:

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

    Standardmäßig senden App Engine-Dienste nur internen Traffic an Ihr VPC-Netzwerk. Wenn Sie Traffic mit externen Zielen über Ihr VPC-Netzwerk senden möchten, damit die von Ihnen angegebene statische IP-Adresse verwendet wird, 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.

    Wenn Sie ausgehenden Direct VPC-Traffic verwenden, setzen Sie vpc_egress auf all-traffic:

    vpc_access:
    network_interface:
    network: NETWORK_NAME
    subnet: SUBNET_NAME
    vpc_egress: all-traffic

    Ersetzen Sie Folgendes:

    • NETWORK_NAME: der Name des VPC-Netzwerks
    • SUBNET_NAME: der Name des von Ihnen erstellten Subnetzes.

    Wenn Sie einen Connector für Serverloser VPC-Zugriff verwenden, legen Sie die Einstellung für ausgehenden Traffic auf all-traffic fest:

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Projekt-ID in Google Cloud .
    • REGION: die Region, in der sich der Connector befindet.
    • CONNECTOR_NAME: der Name des Connectors.
  8. Stellen Sie den Dienst bereit:

    gcloud app deploy