Direcciones IP salientes para servicios de App Engine

Los servicios salientes, como las API de recuperación de URL, Sockets y Correo electrónico, usan un gran conjunto de direcciones IP. Los rangos de direcciones IP en este grupo están sujetos a cambios de rutina. De hecho, puede parecer que dos llamadas a la API secuenciales desde la misma aplicación se originan en dos direcciones IP diferentes.

Puedes encontrar los rangos de direcciones IP actuales para los servicios de App Engine con dos archivos JSON que publica Google:

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

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

Si se quitan todos los rangos en cloud.json de los que están en goog.json, se obtiene un gran conjunto de direcciones IP que usan las APIs de Google globales y otros servicios de Google, incluidos los productos orientados al cliente fuera de Google Cloud. Estas listas se actualizan con frecuencia.

Puedes usar la siguiente secuencia de comandos de Python para crear una lista de rangos de direcciones IP que incluyan los 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()