Atelier de programmation sur les routes basées sur des règles (PBR)

1. Introduction

Routes basées sur des règles

Les routes basées sur des règles vous permettent de choisir un saut suivant en fonction de l'adresse IP de destination d'un paquet. Vous pouvez également mettre en correspondance le trafic par protocole et adresse IP source. Le trafic correspondant est redirigé vers un équilibreur de charge réseau interne. Cela peut vous aider à insérer des dispositifs tels que des pare-feu dans le chemin du trafic réseau.

Lorsque vous créez une route basée sur des règles, vous sélectionnez les ressources dont le trafic peut être traité par la route. La route peut s'appliquer aux éléments suivants :

  • L'ensemble du réseau : toutes les instances de machines virtuelles (VM), les passerelles VPN et les interconnexions
  • Sélectionner des instances de VM dans le VPC à l'aide de tags réseau
  • Région d'interconnexion : tout le trafic entrant dans le réseau VPC via des rattachements de VLAN pour la région

Le saut suivant d'une route basée sur des règles doit être un équilibreur de charge réseau interne valide qui se trouve dans le même réseau VPC que la route basée sur des règles.

Par défaut, les équilibreurs de charge réseau internes utilisent le hachage symétrique afin que le trafic puisse atteindre le même dispositif sur les chemins sortants et renvoyés sans configurer la NAT source.

Les routes basées sur des règles ont une priorité plus élevée que les autres types de routes, à l'exception des chemins de retour spéciaux.

Si deux routes basées sur des règles ont la même priorité, Google Cloud utilise un algorithme interne déterministe pour sélectionner une seule route, en ignorant les autres routes ayant la même priorité. Les routes basées sur des règles n'utilisent pas la correspondance du préfixe le plus long et ne sélectionnent que la route ayant la priorité la plus élevée.

Vous pouvez créer une règle unique pour le trafic à sens unique ou plusieurs règles pour gérer le trafic bidirectionnel.

Pour utiliser des routes basées sur des règles avec Cloud Interconnect, elles doivent être appliquées à toutes les connexions Cloud Interconnect d'une région entière. Les routes basées sur des règles ne peuvent être appliquées qu'à une seule connexion Cloud Interconnect.

Le transfert IP doit être activé sur les instances de VM qui reçoivent le trafic provenant d'une route basée sur des règles.

Remarques concernant la PBR

Une configuration spéciale est nécessaire pour utiliser les routages basés sur des règles des manières suivantes.

Par exemple, en utilisant PBR avec GKE, PSC ou avec PGA/PSA.

Pour en savoir plus sur la PBR avec GKE, cliquez ici. Pour en savoir plus sur les limites générales de la PBR, cliquez ici.

Points abordés

  • Configurer des routes basées sur des règles

Prérequis

  • Connaissances sur le déploiement d'instances et la configuration de composants réseau
  • Connaissances sur la configuration des pare-feu VPC

2. Environnement de test

Cet atelier de programmation utilisera un seul VPC. Cet environnement comprendra deux ressources de calcul, clienta et clientb, qui enverront des paquets à une autre ressource de serveur. À l'aide de PBR et de filtres, nous forcerons le trafic de clienta à passer par une autre ressource de calcul pour l'application du pare-feu, tandis que le trafic de clientb ira directement au serveur. Le schéma ci-dessous illustre le chemin d'accès.

bff32b01ada8e9ad.png

Dans le schéma ci-dessus, il devrait techniquement y avoir un équilibreur de charge interne (ILB, internal load balancer) pour les chemins PBR. Cette étape a été omise pour simplifier le schéma.

3. Avant de commencer

L'atelier de programmation nécessite un seul projet.

Depuis Cloud Shell :

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

4. Activer les API

Si ce n'est pas déjà fait, activez les API pour utiliser les produits.

Depuis Cloud Shell :

gcloud services enable compute.googleapis.com
gcloud services enable networkconnectivity.googleapis.com

5. Créer un réseau et un sous-réseau VPC

Réseau VPC

Créez le VPC codelab-pbr-vpc :

Depuis Cloud Shell :

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

Sous-réseau

Créez les sous-réseaux respectifs dans la région sélectionnée :

Depuis Cloud Shell :

gcloud compute networks subnets create $prefix-vpc-subnet \
   --range=10.10.10.0/24 --network=$prefix-vpc --region=${region}

6. Créer des règles de pare-feu

Pour permettre à IAP de se connecter à vos instances de VM, créez une règle de pare-feu qui :

  • S'applique à toutes les instances de VM auxquelles vous souhaitez être accessible à l'aide d'IAP.
  • Autorise le trafic entrant à partir de la plage d'adresses IP 35.235.240.0/20. Cette plage contient toutes les adresses IP qu'IAP utilise pour le transfert TCP.

Depuis Cloud Shell :

gcloud compute firewall-rules create $prefix-allow-iap-proxy \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20

Pour autoriser le port HTTP standard (TCP 80) et le protocole ICMP sur le serveur :

  • S'applique aux ressources avec le tag réseau "server"
  • Autorise l'entrée depuis toutes les sources

Depuis Cloud Shell :

gcloud compute firewall-rules create $prefix-allow-http-icmp \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:80,icmp \
--source-ranges=0.0.0.0/0 \
--target-tags=server

Pour autoriser le pare-feu à recevoir des paquets, autorisez une entrée sur tous les protocoles et ports.

  • S'applique aux ressources avec le tag réseau "fw"
  • Autorise le trafic entrant provenant des sources 10.10.10.0/24

Depuis Cloud Shell :

gcloud compute firewall-rules create $prefix-fw-allow-ingress \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=all \
--source-ranges=10.10.10.0/24 \
--target-tags=fw

Pour autoriser les vérifications de l'état

  • S'applique aux ressources avec le tag réseau "fw"
  • Autorise l'entrée à partir des plages de vérification de l'état

Depuis Cloud Shell :

gcloud compute firewall-rules create $prefix-allow-hc-ingress \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=fw

7. Créer un routeur Cloud Router et Cloud NAT

L'objectif de cette section est de permettre aux machines virtuelles privées de télécharger les packages logiciels appropriés depuis Internet.

Créer un routeur Cloud Router

Depuis Cloud Shell :

gcloud compute routers create ${prefix}-cr \
--region=${region} \
--network=${prefix}-vpc

Créer une passerelle Cloud NAT

Depuis Cloud Shell :

gcloud compute routers nats create ${prefix}-nat-gw-${region} \
--router=${prefix}-cr \
--router-region=${region} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges

8. Créer des instances de calcul

Créez les instances de calcul ClientA, ClientB, FW et Server :

Depuis Cloud Shell :

gcloud compute instances create clienta \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.10 \
   --zone $zone \
   --tags client \
   --metadata startup-script='#! /bin/bash
apt-get update'

Depuis Cloud Shell :

gcloud compute instances create clientb \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.11 \
   --zone $zone \
   --tags client \
   --metadata startup-script='#! /bin/bash
apt-get update'

Depuis Cloud Shell :

gcloud compute instances create server \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.200 \
   --zone $zone \
   --tags server \
   --metadata startup-script='#! /bin/bash
sudo su
apt-get update
apt-get -y install tcpdump
apt-get -y install nginx
cat > /var/www/html/index.html << EOF
<html><body><p>Server</p></body></html>
EOF'

Depuis Cloud Shell :

gcloud compute instances create fw \
   --subnet=$prefix-vpc-subnet \
   --can-ip-forward \
   --no-address \
   --private-network-ip=10.10.10.75 \
   --zone $zone \
   --tags fw \
   --metadata startup-script='#! /bin/bash
apt-get update
sudo apt-get -y install tcpdump
sudo apt-get -y install nginx
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -I FORWARD -d 10.10.10.200 -j REJECT'

9. Tester la connectivité sans PBR

Connectez-vous en SSH aux VM de calcul clientes que nous avons créées récemment et vérifiez la connectivité des deux clients au serveur.

Depuis cloudshell1, connectez-vous à clienta :

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

Exécutez les commandes suivantes :

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Les pings et les requêtes curl devraient fonctionner.

Résultat :

root@clienta:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms
64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms
64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clienta:~$ curl 10.10.10.200/index.html
<html><body><p>Server</p></body></html>

Ouvrez un onglet Cloud Shell supplémentaire en cliquant sur le signe +.

3722d8574c3812b1.png

Dans cloudshell2, définissez les variables à utiliser :

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

Depuis cloudshell2, connectez-vous en SSH à clientb :

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

Exécutez les commandes suivantes :

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Les pings et les requêtes curl devraient fonctionner.

Résultat :

root@clientb:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms
64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms
64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clientb:~$ curl 10.10.10.200/index.html
<html><body><p>Server</p></body></html>

Quittez maintenant le terminal de la VM et revenez à Cloud Shell.

10. Créer un groupe d'instances

Créez un groupe d'instances non géré pour votre VM de pare-feu.

Depuis Cloud Shell :

gcloud compute instance-groups unmanaged create pbr-uig --zone=$zone

Ajoutez l'instance fw au groupe d'instances non géré.

Depuis Cloud Shell :

gcloud compute instance-groups unmanaged add-instances pbr-uig --instances=fw --zone=$zone

11. Créer une vérification d'état

Créez une vérification d'état pour le service de backend. Nous allons effectuer une simple vérification de l'état du port TCP 80.

Depuis Cloud Shell :

gcloud compute health-checks create tcp $prefix-hc-tcp-80 --region=$region --port 80

12. Créer un service de backend

Créez un service de backend à associer à la règle de transfert.

Depuis Cloud Shell :

gcloud compute backend-services create be-pbr --load-balancing-scheme=internal --protocol=tcp --region=$region --health-checks=$prefix-hc-tcp-80 --health-checks-region=$region

Ajoutez maintenant le groupe d'instances au service de backend.

Depuis Cloud Shell :

gcloud compute backend-services add-backend be-pbr --region=$region --instance-group=pbr-uig --instance-group-zone=$zone

13. Créer une règle de transfert

Depuis Cloud Shell :

gcloud compute forwarding-rules create fr-pbr --region=$region --load-balancing-scheme=internal --network=$prefix-vpc --subnet=$prefix-vpc-subnet --ip-protocol=TCP --ports=ALL --backend-service=be-pbr --backend-service-region=$region --address=10.10.10.25 --network-tier=PREMIUM

14. Créer une règle PBR

Cette règle PBR s'applique aux clients. Il acheminera tout le trafic IPv4 vers la règle de transfert 10.10.10.25 si l'adresse IP source est 10.10.10.10/32 (adresse de clienta) et l'adresse IP de destination est 10.10.10.0/24.

Cela signifie que clienta correspondra à PBR, mais pas à clientb.

Depuis Cloud Shell :

gcloud network-connectivity policy-based-routes create pbr-client \
   --network=projects/$project_id/global/networks/$prefix-vpc \
   --next-hop-ilb-ip=10.10.10.25 \
   --source-range=10.10.10.10/32 \
   --destination-range=10.10.10.0/24 \
   --protocol-version=IPv4 \
   --priority=1000 \
   --tags=client

Cette règle PBR s'applique au serveur. Il acheminera tout le trafic IPv4 vers la règle de transfert 10.10.10.25 si l'adresse IP source est 10.10.10.200/32 et l'adresse IP de destination est 10.10.10.10/32.

Depuis Cloud Shell :

gcloud network-connectivity policy-based-routes create pbr-server \
   --network=projects/$project_id/global/networks/$prefix-vpc \
   --next-hop-ilb-ip=10.10.10.25 \
   --source-range=10.10.10.200/32 \
   --destination-range=10.10.10.10/32 \
   --protocol-version=IPv4 \
   --priority=2000 \
   --tags=server

15. Tester la connectivité avec PBR

Nous allons maintenant vérifier la fonctionnalité PBR. L'instance "fw" est configurée avec iptables pour refuser les requêtes destinées au serveur. Si le PBR fonctionne, les requêtes qui fonctionnaient auparavant sur clienta échoueront désormais, tandis que clientb réussira toujours.

Connectez-vous en SSH à une VM de calcul cliente et exécutez les mêmes tests.

Depuis cloudshell1 :

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

Exécutez les commandes suivantes :

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Résultat :

root@clienta:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
From 10.10.10.75 icmp_seq=1 Destination Port Unreachable
From 10.10.10.75 icmp_seq=2 Destination Port Unreachable
From 10.10.10.75 icmp_seq=3 Destination Port Unreachable
From 10.10.10.75 icmp_seq=4 Destination Port Unreachable
From 10.10.10.75 icmp_seq=5 Destination Port Unreachable
root@clienta:~$ curl 10.10.10.200/index.html
curl: (7) Failed to connect to 10.10.10.200 port 80: Connection refused

Étant donné que les requêtes ont échoué, nous pouvons confirmer que le PBR achemine activement le trafic pour clienta vers l'instance de pare-feu configurée pour bloquer ce trafic.

Connectez-vous en SSH à clientb et exécutez le même test de connectivité.

Depuis cloudshell2 :

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

Exécutez les commandes suivantes :

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Résultat :

root@clientb:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=63 time=0.361 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=63 time=0.475 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=63 time=0.379 ms
root@clientb:~$ curl 10.10.10.200
<html><body><p>Server</p></body></html>

Comme vous pouvez le voir, les requêtes de clientb au serveur ont abouti. En effet, les requêtes ne correspondent pas à une règle PBR pour l'adresse IP source.

16. [Facultatif] Valider avec des captures sur le pare-feu

Dans cette section facultative, vous pouvez valider le PBR en effectuant des captures de paquets sur la VM du pare-feu.

Vous devriez toujours disposer d'une connexion SSH dans cloudshell1 et cloudshell2 à clienta et clientb.

Ouvrez un onglet Cloud Shell supplémentaire en cliquant sur le signe +.

5eb3a9956f7e41a2.png

Dans cloudshell3, définissez les variables :

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

Connectez-vous à fw en SSH :

gcloud compute ssh fw --zone=$zone --tunnel-through-iap

Exécutez la commande suivante sur fw (cloudshell3) :

sudo tcpdump -i any icmp -nn

À partir de clienta (cloudshell1), exécutez le test ping :

ping 10.10.10.200 -c 5

À partir de clientb (cloudshell2), exécutez le test ping :

ping 10.10.10.200 -c 5

Sortie sur fw (cloudshell 3) :

root@fw:~$ sudo tcpdump -i any icmp -nn
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
17:07:42.215297 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 1, length 64
17:07:42.215338 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 51064 unreachable, length 92
17:07:43.216122 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 2, length 64
17:07:43.216158 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 30835 unreachable, length 92
17:07:44.219064 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 3, length 64
17:07:44.219101 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 2407 unreachable, length 92

Vous ne verrez aucun paquet sur le tcpdump du client B (10.10.10.11), car la PBR n'est pas applicable.

Quittez Cloud Shell pour nettoyer les ressources.

17. Étapes de nettoyage

Dans Cloud Shell, supprimez la règle PBR, la règle de transfert, le service de backend, la vérification de l'état, le groupe d'instances, les instances de calcul, le NAT, le routeur Cloud Router et les règles de pare-feu.

gcloud -q network-connectivity policy-based-routes delete pbr-client

gcloud -q network-connectivity policy-based-routes delete pbr-server

gcloud -q compute forwarding-rules delete fr-pbr --region=$region

gcloud -q compute backend-services delete be-pbr --region=$region

gcloud -q compute health-checks delete $prefix-hc-tcp-80 --region=$region

gcloud -q compute instance-groups unmanaged delete pbr-uig --zone=$zone

gcloud -q compute instances delete clienta --zone=$zone
gcloud -q compute instances delete clientb --zone=$zone
gcloud -q compute instances delete server --zone=$zone
gcloud -q compute instances delete fw --zone=$zone


gcloud -q compute routers nats delete ${prefix}-nat-gw-${region} \
--router=$prefix-cr --router-region=$region

gcloud -q compute routers delete $prefix-cr --region=$region

gcloud -q compute firewall-rules delete $prefix-allow-iap-proxy
gcloud -q compute firewall-rules delete $prefix-allow-http-icmp
gcloud -q compute firewall-rules delete $prefix-fw-allow-ingress
gcloud -q compute firewall-rules delete $prefix-allow-hc-ingress

Supprimez le sous-réseau et les VPC :

gcloud -q compute networks subnets delete $prefix-vpc-subnet \
    --region $region

gcloud -q compute networks delete $prefix-vpc

18. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation.

Points abordés

  • Routes basées sur des règles