Indirizzi IP in uscita per i servizi App Engine

I servizi in uscita, come le API di recupero URL, Socket e Posta, utilizzano un ampio pool di indirizzi IP. Gli intervalli di indirizzi IP in questo pool sono soggetti a modifiche alla routine. Infatti, due chiamate API sequenziali dalla stessa applicazione possono sembrare provenienti da due indirizzi IP diversi.

Puoi trovare gli intervalli di indirizzi IP correnti 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 per gli utenti su internet in goog.json.

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

Gli indirizzi IP utilizzati dalle API e dai servizi Google rientrano nell'elenco di intervalli calcolato rimuovendo tutti gli intervalli in cloud.json da quelli in 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 la sezione Come eseguire.

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