Indirizzi IP in uscita per i servizi App Engine

I servizi in uscita, come le API URL Fetch, Sockets e Mail, utilizzano un ampio pool di indirizzi IP. Gli intervalli di indirizzi IP in questo pool sono soggetti a modifiche di routine. Infatti, due chiamate API sequenziali dalla stessa applicazione possono sembrano provenire da due indirizzi IP diversi.

Puoi trovare gli intervalli di indirizzi IP attuali per i tuoi servizi App Engine in base alle informazioni sugli intervalli IP pubblicate da Google:

  • Google pubblica l'elenco completo degli intervalli IP che rende disponibili utenti su internet in goog.json.

  • Google pubblica inoltre un elenco di indirizzi IP esterni globali e a livello di regione disponibili per i clienti alle risorse Google Cloud cloud.json.

Gli indirizzi IP utilizzati dalle API e dai servizi Google sono adatti all'interno dell'elenco di intervalli calcolato rimuovendo tutti gli intervalli in cloud.json da quelli di goog.json. 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 e dai servizi Google.

Per informazioni sull'esecuzione di questo script, consulta Come vengono eseguiti.

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