Direcciones IP salientes para servicios de App Engine

De forma predeterminada, los servicios salientes en el entorno estándar de App Engine, como las APIs de recuperación de URL, Sockets y Mail, usan un grupo regional de direcciones IP dinámicas que se comparten en todas las cargas de trabajo sin servidores. Los rangos de direcciones IP en este grupo cambian de forma rutinaria, por lo que dos llamadas secuenciales desde la misma aplicación pueden originarse en direcciones IP diferentes.

Debido a que otras cargas de trabajo sin servidores comparten este grupo de direcciones IP predeterminado, no confíes en él cuando necesites una dirección IP de origen predecible o una reputación de IP aislada. En su lugar, configura una dirección IP saliente estática para tu servicio en las siguientes situaciones:

  • Te conectas a una base de datos o API externa que usa una lista de direcciones IP permitidas o un firewall.
  • Te conectas a extremos externos sensibles a la reputación, como puertas de enlace de pagos, bases de datos alojadas o APIs de socios protegidas por firewalls de aplicaciones web (WAF) de terceros. El tráfico ruidoso de otro usuario en el grupo de IP compartido predeterminado puede degradar la reputación de la IP y hacer que los WAF externos bloqueen o limiten tus solicitudes.
  • Ejecutas análisis de red autorizados, enumeración de puertos, creación de huellas digitales de hosts, sondeo de vulnerabilidades, extracción de datos web o cargas de trabajo de pruebas de carga.

Si solo necesitas buscar los rangos de direcciones IP asociados con el tráfico saliente predeterminado de tu servicio, puedes encontrar los rangos de direcciones IP actuales que incluyen las direcciones IP de App Engine.

Direcciones IP para servicios de App Engine

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 direcciones IP de su propiedad en goog.json.

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

Si se quitan todos los rangos en cloud.json de los que están en 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 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()

Configura una dirección IP saliente estática

Para configurar una dirección IP estática para tu servicio del entorno estándar de App Engine, enruta el tráfico saliente a una red de nube privada virtual (VPC) con la salida de VPC directa (versión preliminar) o el Acceso a VPC sin servidores con Cloud Router y Cloud NAT. Agregar una puerta de enlace de Cloud NAT a tu red de VPC enruta el tráfico saliente de App Engine a través de tu dirección IP estática reservada.

Si tu servicio escala a muchas instancias o abre muchas conexiones simultáneas, como durante el análisis de red autorizado, asigna varias direcciones IP estáticas a Cloud NAT. También puedes aumentar la cantidad mínima de puertos por instancia o habilitar la asignación dinámica de puertos para evitar el agotamiento de puertos. Obtén más información sobre cómo las puertas de enlace de Cloud NAT usan direcciones IP y puertos.

Enrutar el tráfico a través de Cloud NAT no agrega un salto adicional en tu pila de red, ya que la puerta de enlace de Cloud NAT y el Cloud Router proporcionan solo un plano de control, y los paquetes no pasan por la puerta de enlace de Cloud NAT ni por el Cloud Router.

En los siguientes pasos, se muestra cómo configurar una dirección IP saliente estática para el servicio del entorno estándar de App Engine.

  1. Asegúrate de tener la función roles/compute.networkAdmin o una función personalizada con los mismos permisos.

  2. Crea una subred dentro de tu red de VPC para el tráfico de App Engine. Esto garantiza que otros recursos de la red de VPC no puedan usar la dirección IP estática.

    gcloud compute networks subnets create SUBNET_NAME \
        --range=RANGE \
        --network=NETWORK_NAME \
        --region=REGION

    En el comando anterior, reemplaza los siguientes valores:

    • SUBNET_NAME por el nombre que deseas darle a la subred
    • RANGE por el rango de IP en formato CIDR que deseas asignar a esta subred (p. ej., 10.124.0.0/28)
    • NETWORK_NAME por el nombre de la red de VPC
    • REGION por la región del servicio de App Engine
  3. Conecta tu servicio de App Engine a la subred.

    Sigue la guía Conéctate a una red de VPC y especifica el nombre de la subred que creaste en el paso anterior para la subred del conector.

  4. Crea un Cloud Router nuevo. Cloud Router es un componente necesario del plano de control para Cloud NAT.

    gcloud compute routers create ROUTER_NAME \
        --network=NETWORK_NAME \
        --region=REGION

    En el comando anterior, reemplaza los siguientes valores:

    • ROUTER_NAME por un nombre para el recurso de Cloud Router que deseas crear
    • NETWORK_NAME por el nombre de la red de VPC
    • REGION por la región en la que deseas crear una puerta de enlace NAT
  5. Reserva una dirección IP estática.

    Esta es la dirección que usará tu servicio para enviar tráfico saliente. Un recurso de dirección IP reservada retiene la dirección IP subyacente cuando el recurso al que está asociado se borra y se vuelve a crear. Esta dirección IP se tiene en cuenta para las cuotas de direcciones IP estáticas en tu proyecto de Google Cloud .

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    En el comando anterior, reemplaza los siguientes valores:

    • ORIGIN_IP_NAME por el nombre que deseas asignar al recurso de dirección IP
    • REGION por la región en la que se ejecutará el router de Cloud NAT. Lo ideal sería que el router esté en la misma región en la que está tu servicio de App Engine para minimizar la latencia y los costos de red.

    Usa el comando compute addresses describe para ver el resultado:

    gcloud compute addresses describe ORIGIN_IP_NAME
  6. Crea una puerta de enlace de Cloud NAT y especifica tu dirección IP.

    El tráfico que se origina en la subred pasará por esta puerta de enlace y usará la dirección IP estática que reservaste en el paso anterior.

    gcloud compute routers nats create NAT_NAME \
        --router=ROUTER_NAME \
        --region=REGION \
        --nat-custom-subnet-ip-ranges=SUBNET_NAME \
        --nat-external-ip-pool=ORIGIN_IP_NAME
      

    En el comando anterior, reemplaza los siguientes valores:

    • NAT_NAME por un nombre para el recurso de puerta de enlace de Cloud NAT que deseas crear
    • ROUTER_NAME por el nombre de tu Cloud Router
    • REGION por la región en la que deseas crear una puerta de enlace NAT
    • ORIGIN_IP_NAME por el nombre del recurso de dirección IP reservada que creaste en el paso anterior
  7. Establece el parámetro de configuración de salida del Acceso a VPC sin servidores en all-traffic.

    De forma predeterminada, los servicios de App Engine que usan el Acceso a VPC sin servidores solo envían tráfico interno a tu red de VPC. Para enviar tráfico con destinos externos a tu red de VPC a fin de que tenga la dirección IP estática que especificaste, debes cambiar el parámetro de configuración de salida.

    Especifica el parámetro de configuración de salida en el archivo app.yaml del servicio:

    vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
    egress_setting: all-traffic

    Reemplaza lo siguiente:

    • PROJECT_ID por el ID del proyecto de Google Cloud .
    • REGION por la región en la que se encuentra el conector
    • CONNECTOR_NAME por el nombre de tu conector

Implementa el servicio:

 gcloud app deploy