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 tus servicios de App Engine en función de la información del rango de IP que Google publica:

  • Google publica la lista completa de rangos de IP que pone a disposición de los usuarios en Internet, en goog.json.

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

Las direcciones IP que usan las API y los servicios de Google se ajustan a la lista de rangos calculados si se quitan todos los rangos en cloud.json de los que están en goog.json. En el siguiente ejemplo, se muestra cómo obtener este rango con Python.

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