Direcciones IP de salida de los servicios de App Engine

Los servicios salientes, como las APIs URL Fetch, Sockets y Mail, utilizan un gran conjunto de direcciones IP. Los intervalos de direcciones IP de este grupo están sujetos a cambios rutinarios. De hecho, puede parecer que dos llamadas a la API secuenciales de la misma aplicación proceden de dos direcciones IP diferentes.

Puedes encontrar los intervalos de direcciones IP actuales de los servicios de App Engine mediante dos archivos JSON publicados por Google:

  • Google publica una lista de direcciones IP propiedad de Google en goog.json.

  • Google también publica una lista de intervalos de direcciones IP externas globales y regionales disponibles para los recursos de los clientes en cloud.json. Google Cloud

Si se quitan todos los intervalos de cloud.json de los de goog.json, se obtiene un conjunto grande de direcciones IP que usan las APIs de Google globales y otros servicios de Google, incluidos los productos orientados al cliente que no forman parte de Google Cloud. Estas listas se actualizan con frecuencia.

Puedes usar la siguiente secuencia de comandos de Python para crear una lista de intervalos de direcciones IP que incluya las que usan las APIs y los servicios de Google.

Para obtener información sobre cómo ejecutar esta secuencia de comandos, consulta Cómo ejecutar.

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