Utiliser des règles Cloud NAT NAT

1. Présentation

Cloud NAT est un outil puissant qui permet aux charges de travail Compute Engine et Google Kubernetes Engine (GKE) d'accéder aux ressources Internet de manière évolutive et sécurisée, sans exposer les charges de travail qui y sont exécutées à un accès externe à l'aide d'adresses IP externes.

Cloud NAT présente une conception sans proxy, qui implémente NAT directement au niveau de la couche Andromeda SDN. Par conséquent, cela n'a aucune incidence sur les performances de votre charge de travail, qui s'adapte facilement à de nombreuses VM, régions et VPC.

Les règles NAT sont une extension de Cloud NAT. La fonctionnalité des règles NAT dans Cloud NAT vous permet de créer des règles d'accès qui définissent la façon dont Cloud NAT est utilisé pour se connecter à Internet. Actuellement, les règles NAT sont compatibles avec la sélection d'adresses NAT sources en fonction de l'adresse de destination.

Sans règles NAT, une VM avec Cloud NAT activé utilise le même ensemble d'adresses IP NAT pour atteindre toutes les adresses Internet.

Parfois, un cas d'utilisation NAT nécessite que Cloud NAT utilise différentes adresses IP sources pour des destinations spécifiques. Une règle NAT définit une correspondance et une action correspondante. Une fois les règles NAT spécifiées, le paquet est mis en correspondance avec chacune des règles NAT. Si une règle correspond, l'action associée à cette correspondance est effectuée.

Pour en savoir plus, consultez la section de la documentation sur les règles NAT .

Points abordés

  • Découvrez comment configurer une passerelle Cloud NAT en vue d'utiliser des règles NAT.
  • Concevoir des règles NAT à l'aide du langage CEL (Common Expression Language)
  • Découvrez comment créer des règles NAT et les associer à une passerelle NAT.
  • Comment tester les règles NAT à partir d'une instance
  • Découvrez comment mettre à jour les règles d'une passerelle NAT.
  • Découvrez comment supprimer des règles NAT et revenir au comportement Cloud NAT par défaut.

Prérequis

  • Connaissance de base de Google Compute Engine
  • Connaissance de base de la mise en réseau et des protocoles TCP/IP
  • Connaissances de base de la ligne de commande Unix/Linux
  • Il est utile d'avoir suivi une présentation de la mise en réseau dans GCP, comme l'atelier Mise en réseau dans Google Cloud.
  • Comprendre les principes de base de Cloud NAT.

2. Utiliser la console Google Cloud et Cloud Shell

Pour interagir avec GCP, nous utiliserons à la fois la console Google Cloud et Cloud Shell tout au long de cet atelier.

Console Google Cloud

La console Cloud est accessible à l'adresse https://console.cloud.google.com.

75eef5f6fd6d7e41.png

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Le nom du projet est votre identifiant personnel pour ce projet. Tant que vous respectez ses conventions de dénomination, vous pouvez utiliser ce que vous voulez et le mettre à jour à tout moment.
  • L'ID du projet doit être unique sur l'ensemble des projets Google Cloud et doit être immuable (vous ne pouvez pas le modifier une fois que vous l'avez défini). La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire ou essayer le vôtre pour voir s'il est disponible. Il est ensuite "gelé" une fois le projet créé.
  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Veillez à suivre les instructions de la section "Nettoyer" qui indique comment désactiver les ressources afin d'éviter les frais une fois ce tutoriel terminé. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300$.

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Google Cloud Shell pour cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Depuis la console GCP, cliquez sur l'icône Cloud Shell de la barre d'outils située dans l'angle supérieur droit :

bce75f34b2c53987.png

Le provisionnement et la connexion à l'environnement prennent quelques instants seulement. Une fois l'opération terminée, le résultat devrait ressembler à ceci :

f6ef2b5f13479f3a.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser toutes les activités de cet atelier dans un simple navigateur.

3. Mettre en place l'atelier

Pour cet atelier, vous allez utiliser un projet et créer deux VPC avec un sous-réseau dans chacun d'eux. Vous allez réserver des adresses IP externes, puis créer et configurer une passerelle Cloud NAT (avec un routeur Cloud Router), deux instances de producteur et une instance de consommateur. Après avoir validé le comportement par défaut de Cloud NAT, vous allez créer des règles Cloud NAT personnalisées et valider leur comportement.

Présentation de l'architecture réseau :

815147de3de0bd19.png

4. Réserver des adresses IP externes

Réservons toutes les adresses IP externes à utiliser dans cet atelier. Cela vous aidera à écrire toutes les règles NAT et de pare-feu pertinentes dans les VPC du consommateur et du producteur.

Depuis Cloud Shell :

gcloud compute addresses  create nat-address-1 nat-address-2 nat-address-3 producer-address-1 producer-address-2 --region us-east4

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].

Renseignez les adresses IP réservées en tant que variables d'environnement.

export natip1=`gcloud compute addresses list --filter name:nat-address-1 --format="get(address)"`
export natip2=`gcloud compute addresses list --filter name:nat-address-2 --format="get(address)"`
export natip3=`gcloud compute addresses list --filter name:nat-address-3 --format="get(address)"`
export producerip1=`gcloud compute addresses list --filter name:producer-address-1 --format="get(address)"`
export producerip2=`gcloud compute addresses list --filter name:producer-address-2 --format="get(address)"`

Aucun résultat n'est attendu, mais vous pouvez vérifier que les adresses ont été correctement renseignées. Affichons les valeurs de toutes les variables d'environnement.

$ env | egrep '^(nat|producer)ip[1-3]'

Résultat :

producerip1=<Actual Producer IP 1>
producerip2=<Actual Producer IP 2>
natip1=<NAT IP 1>
natip2=<NAT IP 2>
natip3=<NAT IP 3>

5. Configuration du VPC et des instances du producteur.

Nous allons maintenant créer les ressources pour les ressources du producteur. Les instances exécutées dans le VPC du producteur proposeront le service accessible sur Internet à l'aide de deux adresses IP publiques, "producer-address-1" et "producer-address-2" .

Commençons par créer le VPC. Depuis Cloud Shell :

gcloud compute networks create producer-vpc --subnet-mode custom

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/producer-vpc].
NAME      SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
producer-vpc  CUSTOM       REGIONAL

Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:

$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp

Créez ensuite le sous-réseau dans us-east4. Depuis Cloud Shell :

gcloud compute networks subnets create producer-e4 \
   --network producer-vpc --range 10.0.0.0/24 --region us-east4

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/producer-e4].
NAME              REGION       NETWORK       RANGE
producer-e4       us-east4  producer-vpc  10.0.0.0/24

Ensuite, créons des règles de pare-feu VPC pour permettre aux adresses IP NAT d'atteindre les instances de producteur sur le port 8080.

Pour la première règle, depuis Cloud Shell :

gcloud compute firewall-rules create producer-allow-8080 \
  --network producer-vpc --allow tcp:8080 \
  --source-ranges $natip1,$natip2,$natip3

Résultat :

Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/producer-allow-8080].
Creating firewall...done.
NAME                 NETWORK       DIRECTION  PRIORITY  ALLOW     DENY  DISABLED
producer-allow-8080  producer-vpc  INGRESS    1000      tcp:8080        False

L'étape suivante consiste à créer les deux instances de producteur.

Les instances de producteur exécuteront un service d'écho IP dans un conteneur Docker disponible sur Docker Hub (le code source est disponible dans le dépôt GitHub de l'auteur du service).

Pour provisionner rapidement les instances avec tous les logiciels requis, nous allons utiliser la fonctionnalité Déploiement de conteneurs sur Compute Engine.

Pour pouvoir écrire des règles NAT, nous allons provisionner chaque instance avec une adresse IP réservée différente.

Créez la première instance. Depuis Cloud Shell :

gcloud compute instances create-with-container producer-instance-1 \
--zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-1].
NAME                 ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
producer-instance-1  us-east4-a  e2-medium                  10.0.0.2     <producer IP 1>  RUNNING

Créez ensuite la deuxième instance. Depuis Cloud Shell :

gcloud compute instances create-with-container producer-instance-2 \
 --zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-2].
NAME                 ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
producer-instance-2  us-east4-a  e2-medium                  10.0.0.3     <producer IP 2>  RUNNING

6. Configurer le VPC consommateur, Cloud NAT et l'instance

Maintenant que vous avez créé le service de producteur, il est temps de créer le VPC consommateur et sa passerelle Cloud NAT.

Après avoir créé le VPC et le sous-réseau, nous allons ajouter une règle de pare-feu d'entrée simple pour autoriser les plages d'adresses IP sources IAP pour TCP. Cela nous permettra d'établir une connexion SSH aux instances du consommateur directement à l'aide de gcloud.

Nous allons ensuite créer une passerelle Cloud NAT simple en mode d'allocation manuelle et l'adresse réservée "nat-address-1" qui y est associée. Dans les parties suivantes de l'atelier de programmation, nous mettrons à jour la configuration de la passerelle pour ajouter des règles personnalisées. .

Commençons par créer le VPC. Depuis Cloud Shell :

gcloud compute networks create consumer-vpc --subnet-mode custom

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/consumer-vpc].
NAME      SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
consumer-vpc  CUSTOM       REGIONAL

Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:

$ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp

Ensuite, créons un sous-réseau dans us-east4. Depuis Cloud Shell :

gcloud compute networks subnets create consumer-e4 \
   --network consumer-vpc --range 10.0.0.0/24 --region us-east4

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/consumer-e4].
NAME              REGION       NETWORK       RANGE
consumer-e4       us-east4  consumer-vpc  10.0.0.0/24

Ensuite, créons des règles de pare-feu VPC pour autoriser les plages d'adresses IAP à atteindre les instances de consommateur sur le port 22.

Pour la première règle de pare-feu, exécutez la commande suivante dans Cloud Shell :

gcloud compute firewall-rules create consumer-allow-iap \
  --network consumer-vpc --allow tcp:22 \
  --source-ranges 35.235.240.0/20

Résultat :

Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/consumer-allow-iap].
Creating firewall...done.
NAME                 NETWORK       DIRECTION  PRIORITY  ALLOW     DENY  DISABLED
consumer-allow-iap  consumer-vpc  INGRESS    1000      tcp:22        False

Avant de créer une passerelle NAT, nous devons d'abord créer une instance Cloud Router (nous utilisons un numéro ASN privé, mais cela n'a pas d'importance pour les activités de cet atelier). Depuis Cloud Shell :

gcloud compute routers create consumer-cr \
--region=us-east4 --network=consumer-vpc \
 --asn=65501

Résultat :

Creating router [consumer-cr]...done.
NAME         REGION       NETWORK
consumer-cr  us-east4  consumer-vpc

Créez ensuite l'instance de passerelle NAT. Depuis Cloud Shell :

gcloud compute routers nats create consumer-nat-gw \
    --router=consumer-cr \
    --router-region=us-east4 \
    --nat-all-subnet-ip-ranges \
    --nat-external-ip-pool=nat-address-1

Résultat :

Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.

Créez l'instance de test du consommateur. Nous renseignons ici les adresses IP de producteurs réservées pour pouvoir y faire référence ultérieurement dans l'instance. Depuis Cloud Shell :

gcloud compute instances create consumer-instance --zone=us-east4-a \
--machine-type=e2-medium --network-interface=subnet=consumer-e4,no-address \
--metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2

Résultat :

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/consumer-instance].
NAME               ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
consumer-instance  us-east4-a  e2-medium                  10.0.0.2                  RUNNING

7. Vérifier le comportement par défaut de Cloud NAT

À ce stade, l'instance consommateur utilise le comportement Cloud NAT par défaut, qui utilise la même adresse IP réservée "nat-address-1" pour communiquer avec toutes les adresses externes.

Avant d'utiliser la nouvelle fonctionnalité de règles NAT dans Cloud NAT, validons d'abord ce comportement.

Connectez-vous en SSH à l'instance consommateur. Depuis Cloud Shell :

gcloud compute ssh consumer-instance --zone=us-east4-a

Vous devriez maintenant être dans le shell de l'instance.

Exemple de résultat (résultat complet tronqué pour plus de concision)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

Depuis l'instance consommateur, récupérons d'abord les adresses IP du producteur et renseignons-les en tant que variables d'environnement.

export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"`

export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`

Essayez ensuite d'envoyer une requête curl aux deux instances de producteur et observez l'adresse IP source renvoyée.

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.136.8.83

La même adresse IP doit être renvoyée pour les deux points de terminaison, ce qui correspond à la valeur de l'adresse IP externe réservée "nat-address-1".

De même, une requête curl envoyée à un service de réflexion d'adresse IP externe doit afficher la même adresse IP. Par exemple :

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

Quittez la session SSH de l'instance pour le moment. Nous nous reconnecterons en SSH après avoir configuré les règles NAT.

8. Créer des règles Cloud NAT

Les règles NAT sont écrites à l'aide de la syntaxe Common Expression Language. Pour en savoir plus sur le langage d'expression des règles, consultez la section Langage d'expression des règles.

Vous pouvez également ajouter une règle NAT à une passerelle NAT existante à l'aide des commandes gcloud. Nous allons examiner les deux options pour créer des règles Cloud NAT.

Commençons par créer un fichier YAML de règle NAT.

Depuis Cloud Shell :

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
EOF

Ensuite, mettons à jour notre passerelle NAT existante à l'aide de ce fichier de règles. Depuis Cloud Shell :

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

Vous devriez obtenir le résultat suivant :

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

Vérifiez que la règle a bien été configurée. Depuis Cloud Shell :

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4

Vous devriez obtenir le résultat suivant :

RULE_NUMBER  MATCH
100          destination.ip == '35.192.142.134'

Essayons de recréer la même règle en utilisant uniquement des commandes gcloud. Commencez par supprimer la règle existante. Depuis Cloud Shell :

gcloud alpha compute routers nats rules delete 100 \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --quiet

Vous devriez obtenir le résultat suivant :

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

Recréez ensuite la règle à l'aide de cette commande gcloud. Depuis Cloud Shell :

gcloud alpha compute routers nats rules create 100 \
 --match='destination.ip == "'$producerip2'"' \
--source-nat-active-ips=nat-address-2 --nat=consumer-nat-gw \
 --router=consumer-cr --router-region=us-east4

Vous devriez obtenir le résultat suivant :

Creating Rule [100] in NAT [consumer-nat-gw]...done.

Pour vérifier que la règle a bien été créée, exécutez à nouveau la commande précédente. Cette fois, nous allons ajouter le commutateur de mise en forme YAML pour afficher tous les détails de la règle.

Depuis Cloud Shell :

gcloud alpha compute routers nats rules list\
 --nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4  --format=yaml

Vous devriez obtenir le résultat suivant :

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/<Project-ID>/regions/us-east4/addresses/nat-address-2
match: destination.ip == <actual IP for producer-IP 2>
ruleNumber: 100

Enfin, notez que les adresses externes "nat-address1" et "nat-address-2" sont désormais toutes les deux indiquées comme "IN_USE" (UTILISÉES). Pour ce faire, exécutez la commande suivante dans Cloud Shell :

$ gcloud compute addresses list

Le résultat suivant devrait s'afficher (les adresses IP réelles doivent correspondre à celles que vous avez réservées) :

NAME                ADDRESS/RANGE   TYPE      PURPOSE  NETWORK  REGION       SUBNET  STATUS
nat-address-1       34.136.8.83     EXTERNAL                    us-east4          IN_USE
nat-address-2       34.70.137.35    EXTERNAL                    us-east4          IN_USE
nat-address-3       34.135.103.88   EXTERNAL                    us-east4          RESERVED
producer-address-1  34.66.0.105     EXTERNAL                    us-east4          IN_USE
producer-address-2  35.192.142.134  EXTERNAL                    us-east4          IN_USE

9. Vérifier le comportement des règles Cloud NAT

À ce stade, l'instance consommateur doit utiliser la règle Cloud NAT créée pour utiliser nat-address-2 afin de communiquer avec producer-address-2.

Validons ce comportement. Connectez-vous en SSH à l'instance consommateur. Depuis Cloud Shell :

gcloud compute ssh consumer-instance --zone=us-east4-a

Vous devriez maintenant être dans le shell de l'instance.

Exemple de résultat (résultat complet tronqué pour plus de concision)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

Depuis l'instance consommateur, récupérons d'abord les adresses IP du producteur et renseignons-les en tant que variables d'environnement.

export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"`

export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`

Essayez ensuite d'envoyer une requête curl aux deux instances de producteur et observez l'adresse IP source renvoyée.

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.70.137.35

Une adresse IP différente doit maintenant être renvoyée pour les deux points de terminaison. La première adresse IP doit être la même que celle du comportement par défaut. La deuxième adresse IP doit être égale à "nat-address-2" après l'ajout de la nouvelle règle NAT.

Une requête curl envoyée à un service de réflexion d'adresse IP externe doit toujours afficher la même adresse IP que le comportement par défaut. Par exemple :

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

Quittez la session SSH de l'instance pour le moment. Nous nous reconnecterons via SSH pour tester l'épuisement des adresses.

10. Modifier et supprimer des règles Cloud NAT

Vous pouvez mettre à jour les règles Cloud NAT existantes. Par exemple, vous pouvez associer de nouvelles adresses IP et vider les adresses IP existantes associées aux règles existantes.

Mettez à jour le fichier de règles NAT comme suit :

Depuis Cloud Shell :

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatDrainIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-3
EOF

Ce nouveau fichier place "nat-address-2" dans un état vidé. Ajoutez "nat-address-3" à l'état actif. Cela devrait permettre aux connexions existantes utilisant nat-address-2 de se terminer correctement, tout en créant de nouvelles connexions uniquement à l'aide de nat-address-3.

Ensuite, mettons à jour notre passerelle NAT existante à l'aide de ce fichier de règles. Depuis Cloud Shell :

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

Vous devriez obtenir le résultat suivant :

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

Vérifiez que la règle a bien été configurée. Depuis Cloud Shell :

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --format=yaml

Vous devriez obtenir le résultat suivant :

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-3
  sourceNatDrainIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-2
match: destination.ip == '35.192.142.134'
ruleNumber: 100

Notez que "nat-address-2" est désormais à l'état "drained" (vidé). Nous vous laissons le soin de vérifier que les nouvelles connexions depuis le VPC consommateur utilisent désormais les adresses IP NAT correctes.

Enfin, pour supprimer les règles NAT de votre passerelle Cloud NAT et revenir au comportement par défaut. Vous pouvez utiliser la commande gcloud suivante. Depuis Cloud Shell :

gcloud alpha compute routers nats rules delete 100 \
 --nat=consumer-nat-gw --router=consumer-cr \
 --router-region=us-east4 --quiet

Vous devriez obtenir le résultat suivant :

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

Pour vérifier qu'il n'existe plus de règles NAT, utilisons la commande de description de la passerelle NAT.

gcloud alpha compute routers nats describe consumer-nat-gw \
 --router=consumer-cr --router-region=us-east4

Vous devriez obtenir le résultat suivant :

enableEndpointIndependentMapping: false
name: consumer-nat-gw
natIpAllocateOption: MANUAL_ONLY
natIps:
- https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-1
sourceSubnetworkIpRangesToNat: ALL_SUBNETWORKS_ALL_IP_RANGES

Notez qu'il n'y a pas de section "rules:" dans le fichier YAML de sortie. Indique qu'aucune règle NAT n'est configurée.

11. Étapes de nettoyage

Pour éviter les frais récurrents, vous devez supprimer toutes les ressources associées à cet atelier de programmation.

Commencez par supprimer toutes les instances.

Depuis Cloud Shell :

gcloud compute instances delete consumer-instance \
producer-instance-1 producer-instance-2 \
 --zone us-east4-a --quiet

Résultat attendu :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-2].

Supprimez ensuite le routeur Cloud Router. Depuis Cloud Shell :

gcloud compute routers delete consumer-cr \
--region us-east4 --quiet

Vous devriez obtenir le résultat suivant :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].

Libérez toutes les adresses IP externes. Depuis Cloud Shell :

gcloud compute addresses delete nat-address-1 \
 nat-address-2 nat-address-3 producer-address-1 \
producer-address-2 --region us-east4 --quiet

Vous devriez obtenir le résultat suivant :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].

Supprimez les règles de pare-feu VPC. Depuis Cloud Shell :

gcloud compute firewall-rules delete consumer-allow-iap \
 producer-allow-8080 --quiet

Vous devriez obtenir le résultat suivant :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/consumer-allow-iap].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-8080].

Supprimez les sous-réseaux. Depuis Cloud Shell :

gcloud compute networks subnets delete consumer-e4 \
producer-e4 --region=us-east4 --quiet

Vous devriez obtenir le résultat suivant :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/consumer-e4].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/producer-e4].

Enfin, supprimons les VPC. Depuis Cloud Shell :

gcloud compute networks delete consumer-vpc \
producer-vpc --quiet

Vous devriez obtenir le résultat suivant :

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/producer-vpc].

12. Félicitations !

Vous avez terminé l'atelier sur les règles Cloud NAT.

Sujets abordés

  • Découvrez comment configurer une passerelle Cloud NAT en vue d'utiliser des règles NAT.
  • Concevoir des règles NAT à l'aide du langage CEL (Common Expression Language)
  • Découvrez comment créer des règles NAT et les associer à une passerelle NAT.
  • Comment tester les règles NAT à partir d'une instance
  • Découvrez comment mettre à jour les règles d'une passerelle NAT.
  • Découvrez comment supprimer des règles NAT et revenir au comportement Cloud NAT par défaut.

Étapes suivantes

  • Créez des règles NAT plus complexes, comme cet exemple.
  • Découvrez comment drainer les adresses IP NAT et observez l'impact sur les connexions.
  • Familiarisez-vous davantage avec la mise en réseau sur Google Cloud Platform.

©Google, Inc. ou ses sociétés affiliées. Tous droits réservés. Ne pas diffuser.