Utiliser des règles Cloud NAT NAT

1. Présentation

Cloud NAT est un outil puissant: grâce à lui, les charges de travail Compute Engine et Google Kubernetes Engine (GKE) peuvent accéder aux ressources Internet de manière évolutive et sécurisée, sans exposer les charges de travail exécutées sur celles-ci à un accès extérieur via des adresses IP externes.

Cloud NAT offre une conception sans proxy, qui implémente la NAT directement au niveau de la couche SDN Andromeda. Ainsi, votre charge de travail n'a aucune incidence sur les performances, et elle s'adapte facilement à un grand nombre de VM, régions et VPC.

Les règles NAT sont une extension de Cloud NAT. La fonctionnalité de règles NAT dans Cloud NAT vous permet de créer des règles d'accès qui définissent la manière dont Cloud NAT est utilisé pour se connecter à Internet. Actuellement, les règles NAT prennent en charge la sélection de l'adresse NAT source en fonction de l'adresse de destination.

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

Parfois, un cas d'utilisation NAT appelle Cloud NAT à utiliser différentes adresses IP sources pour des destinations spécifiques. Une règle NAT définit une correspondance et une action correspondante. Une fois que vous avez spécifié les règles NAT, le paquet est mis en correspondance avec chaque règle NAT. Lorsqu'une correspondance est établie, l'action correspondante a lieu.

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

Points abordés

  • Configurer une passerelle Cloud NAT en vue des règles NAT
  • Concevoir des règles NAT à l'aide du langage CEL (Common Expression Language)
  • Créer des règles NAT et les associer à une passerelle NAT
  • Tester les règles NAT à partir d'une instance
  • Mettre à jour les règles d'une passerelle NAT
  • Supprimer des règles NAT et rétablir le 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 visite guidée de la mise en réseau dans GCP, telle que l'atelier Networking in Google Cloud.
  • Comprendre les principes de base de Cloud NAT

2. Utiliser la console Google Cloud et Cloud Shell

Pour interagir avec GCP, nous allons utiliser à 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 d'attribution de noms, vous pouvez utiliser ce que vous voulez et la mettre à jour à tout moment.
  • L'ID du projet doit être unique parmi tous les projets Google Cloud et ne peut pas être modifié une fois qu'il est défini. La console Cloud génère automatiquement une chaîne unique. généralement, vous ne vous souciez pas de ce que c’est. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (il est généralement identifié comme PROJECT_ID). Si cela ne vous convient pas, générez-en un autre au hasard ou essayez le vôtre pour voir s'il est disponible. Ensuite, il est « 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 gratuite. 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

Dans cet atelier, vous allez utiliser un projet et créer deux VPC comportant chacun un sous-réseau. 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 consommateur. Après avoir validé le comportement Cloud NAT par défaut, vous allez créer des règles personnalisées Cloud NAT et valider leur comportement.

Présentation de l'architecture réseau:

815147de3de0bd19.png

4. Réserver des adresses IP externes

Nous allons réserver toutes les adresses IP externes pour cet atelier. Cela vous aidera à écrire toutes les règles NAT et de pare-feu pertinentes dans les VPC du client 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

Sortie :

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 attendu, mais pour confirmer que les adresses ont été correctement renseignées. Nous allons générer les valeurs de toutes les variables d'environnement.

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

Sortie :

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 du producteur et des instances.

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

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

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

Sortie :

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éons maintenant le sous-réseau dans la région us-east4. Depuis Cloud Shell:

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

Sortie :

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

Nous allons maintenant créer des règles de pare-feu VPC pour permettre aux adresses IP NAT d'atteindre les instances du producteur sur le port 8080.

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

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

Sortie :

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 du producteur exécutent un service d'écho d'adresses 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

Sortie :

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

Sortie :

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 producteur, vous pouvez créer le VPC consommateur et sa passerelle Cloud NAT.

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

Nous créerons ensuite une passerelle Cloud NAT simple en mode d'allocation manuelle et l'adresse réservée "nat-address-1". qui lui est associée. Dans les parties suivantes de l'atelier de programmation, nous modifierons 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

Sortie :

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

Créons maintenant un sous-réseau dans la région us-east4. Depuis Cloud Shell:

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

Sortie :

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

Nous allons maintenant créer des règles de pare-feu VPC afin d'autoriser les plages d'adresses IAP à atteindre les instances de clients sur le port 22.

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

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

Sortie :

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é qui n'est pas pertinent pour les activités de cet atelier). Depuis Cloud Shell:

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

Sortie :

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

Sortie :

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

Créez l'instance de test consommateur. Nous insérons ici les adresses IP de producteurs réservées afin de 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

Sortie :

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 Cloud NAT par défaut

À 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.

Commençons par valider ce comportement avant d'utiliser la nouvelle fonctionnalité de règles NAT dans Cloud NAT.

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

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

Vous devriez à présent vous trouver dans le shell de l'instance.

Exemple de résultat (la sortie complète est tronquée pour des raisons 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:~$

À partir de l'instance consommateur, récupérons les deux adresses IP de producteur et ajoutons-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'utiliser la commande curl vers les 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 s'afficher pour les deux points de terminaison. Elle est égale à la valeur de l'adresse IP externe réservée "nat-address-1".

De même, une requête curl avec un service de réflecteur d'adresses 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 rétablirons l'accès 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 des expressions de règles, consultez la section Langage d'expression de règle.

Vous pouvez également ajouter une règle NAT à une passerelle NAT existante à l'aide de commandes gcloud. Nous étudierons 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

Mettons ensuite à 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 devez 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 devez 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 n'utilisant que 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 devez obtenir le résultat suivant :

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

Ensuite, recréez 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 devez 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, répétez la commande précédente. Cette fois, nous allons ajouter le bouton 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 devez 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 "nat-address1" et "nat-address-2" Les adresses externes s'affichent sous la forme "IN_USE". Pour le voir, exécutez la commande suivante à partir de Cloud Shell:

$ gcloud compute addresses list

Vous devriez obtenir le résultat suivant (les adresses IP réelles doivent correspondre aux adresses 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 afin d'utiliser nat-address-2 pour communiquer avec producer-address-2.

Vérifions ce comportement. Connectez-vous en SSH à l'instance du client. Depuis Cloud Shell:

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

Vous devriez à présent vous trouver dans le shell de l'instance.

Exemple de résultat (la sortie complète est tronquée pour des raisons 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:~$

À partir de l'instance consommateur, récupérons les deux adresses IP de producteur et ajoutons-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'utiliser la commande curl vers les 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

Vous devriez voir une adresse IP différente renvoyée pour les deux points de terminaison. La première adresse IP doit être identique au 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 commande curl vers un service de réflecteur d'adresses 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 allons nous reconnecter en SSH pour tester le drainage d'adresse.

10. Mettre à jour et Supprimer les règles Cloud NAT

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

Mettons à 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 désormais "nat-address-2". à l'état drainé. Et ajoutez "nat-address-3" à l'état actif. Cela devrait permettre aux connexions existantes utilisant nat-address-2 de s'arrêter en douceur, tout en créant de nouvelles connexions uniquement à l'aide de nat-address-3.

Mettons ensuite à 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 devez 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 devez 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 passé à l'état drainé. Il ne vous reste plus qu'à vérifier que les nouvelles connexions du VPC consommateur utilisent désormais les bonnes adresses IP NAT.

Enfin, vous devez supprimer les règles NAT de votre passerelle Cloud NAT et rétablir le 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 devez 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 "NAT_gateway describe"

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

Vous devez 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'existe pas de "règles" : dans le fichier YAML de sortie. Indiquer qu'aucune règle NAT n'est configurée.

11. Étapes de nettoyage

Pour éviter des 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 devez 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 devez 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].

Supprimer des règles de pare-feu VPC Depuis Cloud Shell:

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

Vous devez 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].

supprimer des sous-réseaux ; Depuis Cloud Shell:

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

Vous devez 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 devez 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.

Points abordés

  • Configurer une passerelle Cloud NAT en vue des règles NAT
  • Concevoir des règles NAT à l'aide du langage CEL (Common Expression Language)
  • Créer des règles NAT et les associer à une passerelle NAT
  • Tester les règles NAT à partir d'une instance
  • Mettre à jour les règles d'une passerelle NAT
  • Supprimer des règles NAT et rétablir le comportement Cloud NAT par défaut

Étapes suivantes

  • Testez la création de règles NAT plus complexes, comme dans cet exemple.
  • Explorer le drainage des adresses IP NAT et observer l'impact des connexions
  • Familiarisez-vous davantage avec la mise en réseau sur Google Cloud Platform.

©Google, Inc. or its affiliates. Tous droits réservés. Ne pas diffuser.