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 consultar los intervalos de direcciones IP actuales de tus servicios de App Engine en la información sobre intervalos de IP que publica Google:

  • Google publica la lista completa de intervalos de direcciones IP que pone a disposición de los usuarios en Internet 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

Las direcciones IP que usan las APIs y los servicios de Google se obtienen a partir de la confluencia entre estas dos fuentes, restando los intervalos de cloud.json de los de goog.json. 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()