Indirizzi IP in uscita per i servizi App Engine

Per impostazione predefinita, i servizi in uscita nell'ambiente standard App Engine, come le API URL Fetch, Sockets e Mail, utilizzano un pool regionale di indirizzi IP dinamici condivisi tra tutti i workload serverless. Gli intervalli di indirizzi IP in questo pool cambiano regolarmente, quindi due chiamate sequenziali dalla stessa applicazione possono provenire da indirizzi IP diversi.

Poiché altri workload serverless condividono questo pool di indirizzi IP predefinito, non fare affidamento su di esso quando hai bisogno di un indirizzo IP di origine prevedibile o di una reputazione IP isolata. In alternativa, configura un indirizzo IP in uscita statico per il tuo servizio nelle seguenti situazioni:

  • Ti connetti a un database o a un'API esterni che utilizzano una lista consentita di indirizzi IP o un firewall.
  • Ti connetti a endpoint esterni sensibili alla reputazione, come gateway di pagamento, database ospitati o API partner protette da web application firewall (WAF) di terze parti. Il traffico rumoroso di un altro tenant nel pool di IP condivisi predefinito può peggiorare la reputazione degli IP e causare il blocco o la limitazione delle richieste da parte dei WAF esterni.
  • Esegui workload di scansione di rete autorizzata, enumerazione delle porte, fingerprinting degli host, probing delle vulnerabilità, web scraping o test di carico.

Se devi solo cercare gli intervalli di indirizzi IP associati al traffico in uscita predefinito dal tuo servizio, puoi trovare gli intervalli di indirizzi IP attuali che includono gli indirizzi IP di App Engine.

Indirizzi IP per i servizi App Engine

Puoi trovare gli intervalli di indirizzi IP attuali per i servizi App Engine utilizzando due file JSON pubblicati da Google:

  • Google pubblica un elenco di indirizzi IP di proprietà di Google in goog.json.

  • Google pubblica inoltre un elenco degli intervalli di indirizzi IP esterni globali e regionali disponibili per le risorse Google Cloud dei clienti in cloud.json.

Sottraendo tutti gli intervalli in cloud.json da quelli in goog.json si ottiene un ampio insieme di indirizzi IP utilizzati dalle API di Google globali e da altri servizi Google, inclusi i prodotti rivolti ai clienti esterni a Google Cloud. Questi elenchi vengono aggiornati di frequente.

Puoi utilizzare il seguente script Python per creare un elenco di intervalli di indirizzi IP che includono quelli utilizzati dalle API di Google e dai servizi Google.

Per informazioni sull'esecuzione di questo script, consulta Come eseguire lo script.

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

Configura un indirizzo IP in uscita statico

Per configurare un indirizzo IP statico per il servizio dell'ambiente standard App Engine, instrada il traffico in uscita a una rete Virtual Private Cloud (VPC) utilizzando il traffico VPC diretto in uscita o l'accesso VPC serverless con router Cloud e Cloud NAT. L'aggiunta di un gateway Cloud NAT alla rete VPC instrada il traffico in uscita di App Engine tramite l'indirizzo IP statico riservato.

Se il tuo servizio scala fino a molte istanze o apre molte connessioni contemporanee, ad esempio durante la scansione di reti autorizzate, assegna più indirizzi IP statici a Cloud NAT. Puoi anche aumentare il numero minimo di porte per istanza o abilitare l'allocazione dinamica delle porte per evitare l'esaurimento delle porte. Scopri di più su come i gateway Cloud NAT utilizzano indirizzi IP e porte.

Il routing del traffico tramite Cloud NAT non aggiunge un hop aggiuntivo allo stack di networking perché il gateway Cloud NAT e il router Cloud forniscono solo un control plane e i pacchetti non passano attraverso il gateway Cloud NAT o il router Cloud.

I passaggi seguenti mostrano come configurare un indirizzo IP in uscita statico per il servizio dell'ambiente standard App Engine.

  1. Assicurati di disporre del ruolo roles/compute.networkAdmin o di un ruolo personalizzato con le stesse autorizzazioni.

  2. Crea una subnet all'interno della tua rete VPC per il traffico di App Engine. In questo modo, le altre risorse della rete VPC non possono utilizzare l'indirizzo IP statico.

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

    Sostituisci quanto segue:

    • SUBNET_NAME: un nome per la subnet.
    • RANGE: l'intervallo IP in formato CIDR che vuoi assegnare a questa subnet (ad esempio, 10.124.0.0/28). Il VPC diretto in uscita richiede un intervallo di /26 o superiore. Un connettore di accesso VPC serverless richiede un intervallo /28.
    • NETWORK_NAME: il nome della tua rete VPC.
    • REGION: la regione del servizio App Engine.
  3. Connetti il servizio App Engine alla subnet utilizzando uno dei seguenti metodi:

    • VPC diretto in uscita: segui i passaggi per configurare il VPC diretto in uscita e specifica il nome della subnet creata nel passaggio precedente nel campo subnet.
    • Connettore di accesso VPC serverless: segui i passaggi per connetterti a una rete VPC e specifica il nome della subnet che hai creato nel passaggio precedente per la subnet del connettore.
  4. Crea un nuovo router Cloud. router Cloud è un componente del control plane necessario per Cloud NAT.

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

    Sostituisci quanto segue:

    • ROUTER_NAME: un nome per la risorsa router Cloud che vuoi creare.
    • NETWORK_NAME: il nome della tua rete VPC.
    • REGION: la regione in cui vuoi creare un gateway NAT.
  5. Prenota un indirizzo IP statico.

    Questo è l'indirizzo che il servizio utilizzerà per inviare il traffico in uscita. Una risorsa con indirizzo IP prenotato conserva l'indirizzo IP sottostante quando la risorsa a cui è associata viene eliminata e ricreata. Questo indirizzo IP viene conteggiato ai fini delle quote di indirizzi IP statici nel tuo progetto Google Cloud .

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    Sostituisci quanto segue:

    • ORIGIN_IP_NAME: il nome che vuoi assegnare alla risorsa dell'indirizzo IP.
    • REGION: la regione in cui verrà eseguito il router Cloud NAT. Idealmente, utilizza la stessa regione del servizio App Engine per ridurre al minimo la latenza e i costi di rete.

    Utilizza il comando compute addresses describe per visualizzare il risultato:

    gcloud compute addresses describe ORIGIN_IP_NAME
  6. Crea un gateway Cloud NAT e specifica il tuo indirizzo IP.

    Il traffico proveniente dalla tua subnet passerà attraverso questo gateway e utilizzerà l'indirizzo IP statico che hai prenotato nel passaggio precedente.

    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
      

    Sostituisci quanto segue:

    • NAT_NAME: un nome per la risorsa gateway Cloud NAT che vuoi creare.
    • ROUTER_NAME: il nome del tuo router Cloud.
    • REGION: la regione in cui vuoi creare un gateway NAT.
    • ORIGIN_IP_NAME: il nome della risorsa dell'indirizzo IP prenotato che hai creato nel passaggio precedente.
  7. Imposta l'impostazione del traffico in uscita su all-traffic.

    Per impostazione predefinita, i servizi App Engine inviano solo il traffico interno alla tua rete VPC. Per inviare il traffico con destinazioni esterne tramite la rete VPC in modo che utilizzi l'indirizzo IP statico specificato, devi modificare l'impostazione del traffico in uscita.

    Specifica l'impostazione del traffico in uscita nel file app.yaml del tuo servizio.

    Se utilizzi il VPC diretto in uscita, imposta vpc_egress su all-traffic:

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

    Sostituisci quanto segue:

    • NETWORK_NAME: il nome della tua rete VPC.
    • SUBNET_NAME: il nome della subnet che hai creato.

    Se utilizzi un connettore di accesso VPC serverless, configura l'impostazione del traffico in uscita su all-traffic:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto Google Cloud .
    • REGION: la regione in cui si trova il connettore.
    • CONNECTOR_NAME: il nome del connettore.
  8. Esegui il deployment del servizio:

    gcloud app deploy