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, der von allen serverlosen Arbeitslasten gemeinsam genutzt wird. 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 reputationssensitiven externen Endpunkten her, z. B. Zahlungs-Gateways, gehosteten 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 aus.

Wenn Sie nur die IP-Adressbereiche nachschlagen müssen, die mit dem standardmäßigen ausgehenden Traffic von Ihrem Dienst verknüpft sind, können Sie die aktuellen IP-Adressbereiche ermitteln, 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 anhand von zwei JSON-Dateien ermitteln, die von Google veröffentlicht werden:

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

Wenn Sie eine statische IP-Adresse für Ihren App Engine-Standardumgebungsdienst einrichten möchten, leiten Sie den ausgehenden Traffic entweder über ausgehenden Direct VPC-Traffic (Vorschau) oder über serverlosen 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 zur Verwendung von IP-Adressen und Ports durch Cloud NAT-Gateways

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 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 Kontingente für statische IP-Adressen 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 ist der Name des Connectors.

Stellen Sie den Dienst bereit:

 gcloud app deploy