Adresses IP sortantes pour les services App Engine

Par défaut, les services sortants de l'environnement standard App Engine, tels que les API URL Fetch, Sockets et Mail, utilisent un pool régional d'adresses IP dynamiques partagées entre toutes les charges de travail sans serveur. Les plages d'adresses IP de ce pool changent régulièrement. Deux appels séquentiels provenant de la même application peuvent donc provenir d'adresses IP différentes.

Étant donné que d'autres charges de travail sans serveur partagent ce pool d'adresses IP par défaut, ne vous fiez pas à lui lorsque vous avez besoin d'une adresse IP d'origine prévisible ou d'une réputation d'adresse IP isolée. À la place, configurez une adresse IP sortante statique pour votre service dans les situations suivantes :

  • Vous vous connectez à une base de données ou à une API externe qui utilise une liste d'autorisation d'adresses IP ou un pare-feu.
  • Vous vous connectez à des points de terminaison externes sensibles à la réputation, tels que des passerelles de paiement, des bases de données hébergées ou des API partenaires protégées par des pare-feu d'application Web (WAF) tiers. Le trafic bruyant d'un autre locataire sur le pool d'adresses IP partagé par défaut peut dégrader la réputation des adresses IP et entraîner le blocage ou la limitation de vos requêtes par les WAF externes.
  • Vous exécutez des charges de travail d'analyse réseau autorisée, d'énumération de ports, de fingerprinting d'hôte, de détection de failles, de scraping Web ou de tests de charge.

Si vous n'avez besoin que de rechercher les plages d'adresses IP associées au trafic sortant par défaut de votre service, vous pouvez trouver les plages d'adresses IP actuelles qui incluent les adresses IP App Engine.

Adresses IP pour les services App Engine

Vous pouvez trouver les plages d'adresses IP actuelles des services App Engine à l'aide de deux fichiers JSON publiés par Google :

  • Google publie une liste d'adresses IP appartenant à Google dans goog.json.

  • Google publie également une liste de plages d'adresses IP externes globales et régionales disponibles pour les ressources Google Cloud des clients dans le fichier cloud.json.

La suppression de toutes les plages de cloud.json par rapport à celles de goog.json entraîne un grand ensemble d'adresses IP utilisées par les API Google globales et d'autres services Google, y compris les produits destinés aux clients en dehors de Google Cloud. Ces listes sont mises à jour fréquemment.

Vous pouvez utiliser le script Python suivant pour créer une liste de plages d'adresses IP, incluant celles utilisées par les API et les services Google.

Pour en savoir plus sur l'exécution de ce script, consultez la page Exécuter.

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

Configurer une adresse IP sortante statique

Pour configurer une adresse IP statique pour votre service d'environnement standard App Engine, acheminez votre trafic sortant vers un réseau cloud privé virtuel (VPC) à l'aide de la sortie VPC directe ou de l'accès au VPC sans serveur avec Cloud Router et Cloud NAT. L'ajout d'une passerelle Cloud NAT à votre réseau VPC achemine votre trafic sortant App Engine via votre adresse IP statique réservée.

Si votre service effectue un scaling vers de nombreuses instances ou ouvre de nombreuses connexions simultanées, par exemple lors d'une analyse de réseau autorisée, attribuez plusieurs adresses IP statiques à Cloud NAT. Vous pouvez également augmenter le nombre minimal de ports par instance ou activer l'allocation dynamique de ports pour éviter l'épuisement des ports. Découvrez comment les passerelles Cloud NAT utilisent les adresses IP et les ports.

Le routage de votre trafic via Cloud NAT n'ajoute pas de saut supplémentaire dans votre pile réseau, car la passerelle Cloud NAT et le routeur Cloud Router ne fournissent qu'un plan de contrôle, et les paquets ne passent pas par la passerelle Cloud NAT ni par le routeur Cloud Router.

Les étapes suivantes montrent comment configurer une adresse IP sortante statique pour le service d'environnement standard App Engine.

  1. Assurez-vous de disposer du rôle roles/compute.networkAdmin ou d'un rôle personnalisé avec les mêmes autorisations.

  2. Créez un sous-réseau à l'intérieur de votre réseau VPC pour le trafic App Engine. Cela garantit que les autres ressources de votre réseau VPC ne peuvent pas utiliser l'adresse IP statique.

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

    Remplacez les éléments suivants :

    • SUBNET_NAME : nom du sous-réseau.
    • RANGE : plage d'adresses IP au format CIDR que vous souhaitez attribuer à ce sous-réseau (par exemple, 10.124.0.0/28). La sortie VPC directe nécessite une plage de /26 ou plus. Un connecteur d'accès au VPC sans serveur nécessite une plage /28.
    • NETWORK_NAME : nom de votre réseau VPC.
    • REGION : région de votre service App Engine.
  3. Connectez votre service App Engine au sous-réseau à l'aide de l'une des méthodes suivantes :

    • Sortie VPC directe : suivez la procédure pour configurer la sortie VPC directe, puis spécifiez le nom du sous-réseau que vous avez créé à l'étape précédente dans le champ subnet.
    • Connecteur d'accès au VPC sans serveur : suivez la procédure pour vous connecter à un réseau VPC, puis spécifiez le nom du sous-réseau que vous avez créé à l'étape précédente pour le sous-réseau du connecteur.
  4. Créez un routeur Cloud Router. Cloud Router est un composant de plan de contrôle nécessaire pour Cloud NAT.

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

    Remplacez les éléments suivants :

    • ROUTER_NAME : nom de la ressource Cloud Router que vous souhaitez créer.
    • NETWORK_NAME : nom de votre réseau VPC.
    • REGION : région dans laquelle vous souhaitez créer une passerelle NAT.
  5. Réserver une adresse IP statique

    Il s'agit de l'adresse que votre service utilisera pour envoyer du trafic sortant. Une ressource d'adresse IP réservée conserve l'adresse IP sous-jacente lorsque la ressource à laquelle elle est associée est supprimée et recréée. Cette adresse IP est comptabilisée dans les quotas d'adresses IP statiques de votre projet Google Cloud .

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    Remplacez les éléments suivants :

    • ORIGIN_IP_NAME : nom que vous souhaitez attribuer à la ressource d'adresse IP.
    • REGION : région qui exécutera le routeur Cloud NAT. Idéalement, utilisez la même région que votre service App Engine, afin de minimiser la latence et les coûts du réseau.

    Utilisez la commande compute addresses describe pour afficher le résultat :

    gcloud compute addresses describe ORIGIN_IP_NAME
  6. Créez une passerelle Cloud NAT et spécifiez votre adresse IP.

    Le trafic provenant de votre sous-réseau transitera par cette passerelle et utilisera l'adresse IP statique que vous avez réservée à l'étape précédente.

    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
      

    Remplacez les éléments suivants :

    • NAT_NAME : nom de la ressource de passerelle Cloud NAT que vous souhaitez créer.
    • ROUTER_NAME : nom de votre routeur Cloud Router.
    • REGION : région dans laquelle vous souhaitez créer une passerelle NAT.
    • ORIGIN_IP_NAME : nom de la ressource d'adresse IP réservée que vous avez créée à l'étape précédente.
  7. Définissez le paramètre de sortie sur all-traffic.

    Par défaut, les services App Engine n'envoient que le trafic interne à votre réseau VPC. Pour envoyer du trafic avec des destinations externes via votre réseau VPC afin qu'il utilise l'adresse IP statique que vous avez spécifiée, vous devez modifier le paramètre de sortie.

    Spécifiez le paramètre de sortie dans le fichier app.yaml de votre service.

    Si vous utilisez la sortie VPC directe, définissez vpc_egress sur all-traffic :

    vpc_access:
    network_interface:
    network: NETWORK_NAME
    subnet: SUBNET_NAME
    vpc_egress: all-traffic

    Remplacez les éléments suivants :

    • NETWORK_NAME : nom de votre réseau VPC.
    • SUBNET_NAME : nom du sous-réseau que vous avez créé.

    Si vous utilisez un connecteur d'accès au VPC sans serveur, définissez le paramètre de sortie sur all-traffic :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet Google Cloud .
    • REGION : région dans laquelle se trouve votre connecteur.
    • CONNECTOR_NAME : nom de votre connecteur.
  8. Déployez le service :

    gcloud app deploy