Configurations spéciales pour les instances de VM

Cette page décrit plusieurs configurations réseau spéciales pour les instances de machine virtuelle (VM) Compute Engine. Par exemple :

  • Configurer une connexion HTTP externe à une instance
  • Configurer une instance en tant que proxy réseau
  • Configurer une instance en tant que passerelle VPN
  • Configurer une instance en tant que passerelle NAT
  • Créer des passerelles NAT à haut débit et haute disponibilité

Configurer une connexion HTTP externe à une instance

Les règles de pare-feu par défaut n'autorisent pas les connexions HTTP ou HTTPS à vos instances. Cependant, il est assez simple d'ajouter une règle autorisant ces connexions. Notez qu'une instance doit disposer d'une adresse IP externe pour recevoir du trafic provenant de l'extérieur de son réseau VPC.

Vous pouvez ajouter une règle de pare-feu autorisant les connexions HTTP ou HTTPS à l'aide de l'outil de ligne de commande gcloud ou de la console Google Cloud Platform. Vous pouvez également ajouter une règle de pare-feu via l'API.

Console

Vous pouvez utiliser la console GCP pour créer une règle de pare-feu globale couvrant toutes les instances présentes sur le réseau VPC, ou autoriser individuellement des instances à accéder aux connexions HTTP et HTTPS en sélectionnant l'option correspondante lors de la création de ces instances. Cette dernière option est décrite en premier, car elle permet de mieux contrôler individuellement les instances.

  1. Dans la console GCP, accédez à la page "Instances de VM".

    Accéder à la page Instances de VM

  2. Cliquez sur Créer une instance.
  3. Dans la section Pare-feu, sélectionnez Autoriser le trafic HTTP et Autoriser le trafic HTTPS.
  4. Cliquez sur Créer pour créer l'instance.

Lorsque ces cases sont cochées, le réseau VPC crée automatiquement une règle default-http ou default-https qui s'applique à toutes les instances utilisant les balises http-server ou https-server. La nouvelle instance est également étiquetée avec la balise correspondant aux cases à cocher que vous avez sélectionnées.

Si vous disposez déjà de règles de pare-feu default-http et default-https, vous pouvez les appliquer aux instances existantes en activant les options Autoriser le trafic HTTP ou Autoriser le trafic HTTPS sur la page des détails de chacune de ces instances.

  1. Accédez à la page Instances de VM.
  2. Cliquez sur le nom de l'instance souhaitée.
  3. Cliquez sur le bouton Modifier en haut de la page.
  4. Faites défiler l'affichage jusqu'à la section Pare-feu.
  5. Cochez la case Autoriser le trafic HTTP et/ou la case Autoriser le trafic HTTPS sous le réseau VPC souhaité.
  6. Cliquez sur Enregistrer.

Vous pouvez de même désactiver l'accès HTTP ou HTTPS externe pour une instance en décochant la ou les cases à cocher voulues.

En vous permettant de baliser certaines instances pour le trafic HTTP et HTTPS plutôt que de créer une règle de pare-feu globale pour toutes les instances, GCP limite les problèmes de sécurité potentiels liés au fait d'autoriser le trafic externe vers toutes les machines virtuelles d'un projet. Toutefois, si vous souhaitez créer une règle de pare-feu autorisant le trafic HTTP ou HTTPS vers toutes les instances de machine virtuelle, vous pouvez créer votre propre règle de pare-feu :

  1. Accédez à la page Réseaux VPC.
  2. Sélectionnez le réseau VPC sur lequel vous souhaitez appliquer la règle de pare-feu.
  3. Dans la section Règles de pare-feu, cliquez sur Ajouter une règle de pare-feu.
  4. Nommez la nouvelle règle de pare-feu et ajoutez tcp:80 dans la zone Protocoles/Ports ou tcp:443 pour le trafic HTTPS.
  5. Cliquez sur Créer.
Outil de ligne de commande gcloud

Si vous souhaitez autoriser le trafic HTTP et HTTPS vers toutes les machines virtuelles d'un projet, la commande suivante crée un pare-feu autorisant les requêtes HTTP et HTTPS entrantes à partir de n'importe quelle instance connectée à ce réseau VPC.

gcloud compute firewall-rules create FIREWALL_RULE --allow tcp:80,tcp:443

**Exemple**

gcloud compute firewall-rules create sample-http \
 --description "Incoming http and https allowed." \
 --allow tcp:80,tcp:443
gcloud compute firewall-rules describe sample-http
allowed:
- IPProtocol: tcp
  ports:
  - '80'
  - '443'
creationTimestamp: '2014-06-13T13:27:12.206-07:00'
id: '5057780722612413546'
kind: compute#firewall
name: sample-http
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/samplehttp
sourceRanges:
- 0.0.0.0/0

Configurer une instance en tant que proxy réseau

Vous pouvez concevoir un réseau VPC de sorte qu'une seule instance dispose d'un accès externe, afin que toutes les autres instances présentes dans ce réseau utilisent cette instance comme serveur proxy pour communiquer avec le monde extérieur. Une telle configuration est utile si vous souhaitez contrôler les accès à destination ou en provenance de votre réseau VPC, ou réduire vos coûts en évitant de payer plusieurs adresses IP externes.

L'exemple qui suit indique comment configurer un proxy réseau sur des instances de VM utilisant une image Debian. Cet exemple fait intervenir une instance de passerelle en tant que serveur proxy Squid, mais ce n'est là qu'un moyen parmi d'autres de configurer un serveur proxy.

Pour configurer un serveur proxy Squid :

  1. Configurez une instance avec une adresse IP externe (statique ou éphémère). Pour cet exemple, nommez cette instance gateway-instance.
  2. Configurez une ou plusieurs instances sans adresse IP externe en spécifiant l'indicateur : gcloud compute instances create ... --no-address. Pour cet exemple, nommez cette instance hidden-instance.
  3. Apprenez à vous connecter d'une instance à une autre, car vous ne pourrez pas vous connecter directement à vos instances uniquement internes.
  4. Ajoutez un pare-feu pour autoriser le trafic TCP sur le port 3128 :

    gcloud compute firewall-rules create [FIREWALL_RULE] --network [NETWORK] --allow tcp:3128
    
  5. Installez Squid sur l'instance gateway-instance et configurez-le pour autoriser l'accès à partir de n'importe quelle machine du réseau VPC (espaces IP RFC 1918, RFC 4193 et RFC 4291). Cela suppose que les instances gateway-instance et hidden-instance sont toutes deux connectées au même réseau VPC et peuvent ainsi se connecter l'une à l'autre.

    user@gateway-instance:~$ sudo apt-get install squid3
    

    Autorisez toutes les machines présentes sur le réseau local à utiliser le serveur Squid3. Les commandes sed suivantes annulent la mise en commentaire et entraînent l'activation des entrées acl localnet src correspondant aux réseaux et machines locaux dans les fichiers de configuration Squid.

    user@gateway-instance:~$ sudo sed -i 's:#\(http_access allow localnet\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(http_access deny to_localhost\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 10.0.0.0/8.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 172.16.0.0/12.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 192.168.0.0/16.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fc00\:\:/7.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fe80\:\:/10.*\):\1:' /etc/squid/squid.conf
    
    # Prevent proxy access to metadata server
    user@gateway-instance:~$ sudo cat <<EOF >>/etc/squid/squid.conf
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    
    # Start Squid
    user@gateway:~$ sudo service squid3 start
    
  6. Configurez l'instance hidden-instance pour utiliser l'instance gateway-instance comme proxy. Utilisez ssh pour vous connecter à l'instance hidden-instance et définir ses adresses URL de proxy de sorte qu'elles pointent vers l'instance gateway-instance sur le port 3128 (la configuration par défaut de Squid), comme indiqué ici :

    user@gateway-instance:~$ ssh hidden-instance
    
    user@hidden-instance:~$ sudo -s
    
    root@hidden-instance:~# echo "export http_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export https_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export ftp_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export no_proxy=169.254.169.254,metadata,metadata.google.internal" >> /etc/profile.d/proxy.sh
    

    Mettez à jour les fichiers sudoers de façon à diffuser ces variables env.

    root@hidden-instance:~# cp /etc/sudoers /tmp/sudoers.new
    
    root@hidden-instance:~# chmod 640 /tmp/sudoers.new
    
    root@hidden-instance:~# echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy"\" >>/tmp/sudoers.new
    
    root@hidden-instance:~# chmod 440 /tmp/sudoers.new
    
    root@hidden-instance:~# visudo -c -f /tmp/sudoers.new && cp /tmp/sudoers.new /etc/sudoers
    
  7. Quittez sudo, chargez les variables et exécutez apt-get sur l'instance hidden-instance. Cette dernière devrait maintenant fonctionner en utilisant la passerelle comme proxy. Si la passerelle ne jouait pas le rôle de proxy, apt-get ne pourrait pas fonctionner puisque l'instance hidden-instance n'a pas de connexion directe à Internet.

    root@hidden-instance:~# exit
    
    user@hidden-instance:~$ source ~/.profile
    
    user@hidden-instance:~$ sudo apt-get update
    

Configurer une instance en tant que passerelle VPN

Vous pouvez utiliser le logiciel VPN Strongswan pour configurer une passerelle VPN sur l'une de vos instances. Pour la plupart des utilisateurs, Google recommande d'utiliser Cloud VPN plutôt que Strongswan. Cloud VPN vous évite d'avoir à créer et configurer une instance pour exécuter le logiciel VPN. Utilisez Strongswan dans les cas où Cloud VPN ne fournit pas les fonctionnalités requises.

  1. Créez un réseau VPC auquel votre réseau sur site se connectera.

    gcloud compute networks create vpn-network --subnet-mode custom
    
  2. Créez un sous-réseau dont la plage IP ne chevauche pas celle de votre sous-réseau sur site.

    gcloud compute networks subnets create vpn-subnet \
        --network vpn-network \
        --region us-central1 \
        --range 10.0.0.0/24 \
    
  3. Créez une instance dans le sous-réseau vpn-subnet. Cette instance sera votre passerelle VPN.

    gcloud compute instances create vpn-gateway --can-ip-forward \
        --subnet vpn-subnet \
        --zone us-central1-a \
        --tags vpn-gateway
    
  4. Recherchez et enregistrez les adresses IP interne et externe de votre passerelle VPN.

    gcloud compute instances describe --zone us-central1-a vpn-gateway
    

    L'adresse IP externe correspond à la valeur du champ natIP. L'adresse IP interne correspond à la valeur du champ networkIP – par exemple, 10.0.0.2.

  5. Créez une instance qui communique avec les clients de votre réseau sur site via la passerelle VPN.

    gcloud compute instances create test-vpn \
        --subnet vpn-subnet \
        --tags vpn \
        --zone us-central1-a
    
  6. Créez dans le réseau vpn-network une route permettant d'acheminer le trafic destiné à votre réseau sur site via la passerelle VPN.

    gcloud compute routes create vpnnetwork-to-gateway \
        --destination-range [ON_PREM_IP_RANGE] \
        --next-hop-address [VPN_GATEWAY_INTERNAL_IP] \
        --network vpn-network \
        --tags vpn
    

    La valeur [VPN_GATEWAY_INTERNAL_IP] correspond à l'adresse IP interne de votre passerelle VPN (la valeur du champ networkIP).

  7. Ajoutez les règles de pare-feu suivantes au réseau VPC pour accepter le trafic entrant.

    gcloud compute firewall-rules create ssh --source-ranges 0.0.0.0/0 \
        --allow tcp:22 \
        --network vpn-network
    
    gcloud compute firewall-rules create  allow-internal \
        --source-ranges 10.0.0.0/24 \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --allow all
    
    gcloud compute firewall-rules create allow-ipsec-nat \
        --source-ranges [ON_PREM_VPN_GATEWAY_EXTERNAL_IP]/32 \
        --allow udp:4500,udp:500 \
        --network vpn-network \
        --target-tags vpn-gateway
    
    gcloud compute firewall-rules create from-onprem \
        --source-ranges [ON_PREM_NETWORK_ADDRESS_SPACE] \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --target-tags vpn
    

    Créez des règles de pare-feu dans votre réseau sur site pour accepter le trafic entrant provenant du réseau VPC.

  8. Connectez-vous à l'instance de passerelle VPN.

  9. Installez et configurez le logiciel VPN Strongswan.

    À partir du répertoire d'accueil, créez un fichier nommé ipsec.conf. Insérez-y le contenu suivant, en remplaçant les espaces réservés par les valeurs propres à votre environnement :

    conn myconn
      authby=psk
      auto=start
      dpdaction=hold
      esp=aes128-sha1-modp2048!
      forceencaps=yes
      ike=aes128-sha1-modp2048!
      keyexchange=ikev2
      mobike=no
      type=tunnel
      left=%any
      leftid=[VPN_GATEWAY_EXTERNAL_IP_ADDRESS]
      leftsubnet=10.0.0.0/24
      leftauth=psk
      leftikeport=4500
      right=[ON_PREM_EXTERNAL_IP_ADDRESS]
      rightsubnet=[ON_PREM_ADDRESS_SPACE]
      rightauth=psk
      rightikeport=4500
    

    Exécutez ensuite les commandes suivantes, en remplaçant [secret-key] par une clé (valeur de chaîne) secrète :

    $ sudo apt-get update
    
    $ sudo apt-get install strongswan -y
    
    $ echo "%any : PSK \"[secret-key]\"" | sudo tee /etc/ipsec.secrets > /dev/null
    
    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
    
    $ sudo cp ipsec.conf /etc
    
    $ sudo ipsec restart
    

    Vous devez également configurer votre passerelle VPN sur site pour réussir à établir un tunnel VPN.

    Si cette passerelle sur site exécute un système d'exploitation basé sur Debian, vous pouvez suivre les mêmes étapes pour l'installation et la configuration de Strongswan. Par exemple, faites une copie de votre fichier ipsec.conf et intervertissez les ID et sous-réseaux de gauche et de droite.

  10. Testez le nouveau tunnel VPN en exécutant une commande ping vers une machine sur site à partir de l'instance test-vpn :

    gcloud compute ssh test-vpn --command 'ping -c 3 [ON_PREM_INTERNAL_ADDRESS]'
    

Dépannage

Si vous rencontrez des problèmes en configurant votre VPN à l'aide des instructions qui précèdent, tentez de les résoudre en suivant les conseils ci-dessous :

  1. Vérifiez le statut de la connexion :

    $ sudo ipsec status
    

    Si myconn n'est pas répertorié, lancez la connexion :

    $ sudo ipsec up myconn
    
  2. Déterminez si les deux points de terminaison VPN sont capables de communiquer.

    Utilisez netcat pour envoyer du trafic de type VPN (UDP, port 4500). Exécutez la commande suivante sur votre point de terminaison VPN local :

    $ echo | nc -u [vpn-vm-gateway-external-address] 4500
    

    Exécutez tcpdump du côté réception pour déterminer si votre instance de VM peut recevoir le paquet sur le port 4500 :

    $ tcpdump -nn -n host [public-ip-of-local-VPN-gateway-machine] -i any
    
  3. Activez la journalisation détaillée en ajoutant les lignes suivantes à vos fichiers ipsec.conf :

    config setup
      charondebug="ike 3, mgr 3, chd 3, net 3"
    
    conn myconn
      authby=psk
      auto=start
      ...
    

    Ensuite, réessayez votre connexion. Bien que la connexion échoue encore, vous pouvez vérifier les erreurs dans le journal. Le fichier journal se trouve normalement dans /var/log/charon.log sur votre instance de VM.

Configurer une instance en tant que passerelle NAT

Vous pouvez créer des scénarios de mise en réseau plus complexes en apportant des modifications à la collection de routes. Cette section explique comment configurer une instance de passerelle de traduction d'adresses réseau (NAT, Network Address Translation) capable d'acheminer le trafic depuis des instances de VM purement internes vers Internet. Cela vous permet d'envoyer le trafic provenant de plusieurs instances de VM via une même adresse IP externe, de façon à n'exposer qu'une seule machine virtuelle à Internet.

  1. Pour commencer, créez un réseau VPC afin d'héberger les instances de machine virtuelle intervenant dans ce scénario.

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
    
  2. Créez un sous-réseau pour la région us-central1.

    gcloud compute networks subnets create subnet-us-central \
        --network custom-network1 \
        --region us-central1 \
        --range 192.168.1.0/24
    
  3. Créez des règles de pare-feu autorisant les connexions ssh dans le réseau que vous venez de créer.

    gcloud compute firewall-rules create custom-network1-allow-ssh \
        --allow tcp:22 \
        --network custom-network1
    
    gcloud compute firewall-rules create custom-network1-allow-internal \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 192.168.1.0/24 \
        --network custom-network1
    
  4. Créez une machine virtuelle destinée à jouer le rôle de passerelle NAT sur custom-network1.

    gcloud compute instances create nat-gateway --network custom-network1 \
        --subnet subnet-us-central \
        --can-ip-forward \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags nat
    
  5. Taguez les instances de machine virtuelle dépourvues d'adresse IP externe qui utiliseront l'instance de passerelle avec le tag no-ip ou créez une machine virtuelle sans adresse IP externe et ajoutez-lui le tag no-ip.

    • Voici comment ajouter des balises à une instance existante :
    gcloud compute instances add-tags existing-instance --tags no-ip
    
    • Si vous préférez créer une machine virtuelle sans adresse IP externe :
    gcloud compute instances create example-instance --network custom-network1 \
        --subnet subnet-us-central \
        --no-address \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags no-ip
    
  6. Créez une route permettant d'envoyer le trafic destiné à Internet via votre instance de passerelle.

    gcloud compute routes create no-ip-internet-route \
        --network custom-network1 \
        --destination-range 0.0.0.0/0 \
        --next-hop-instance nat-gateway \
        --next-hop-instance-zone us-central1-a \
        --tags no-ip --priority 800
    

    La priorité définie pour cette route garantit que cette dernière l'emportera en cas de conflit avec d'autres routes. 1000 est la priorité par défaut, et toute valeur inférieure à 1000 aura la priorité.

  7. Ensuite, connectez-vous à votre instance de passerelle et configurez iptables de manière à appliquer la traduction NAT au trafic interne à destination d'Internet.

    gcloud compute ssh nat-gateway --zone us-central1-a
    

    Sur votre instance, configurez iptables :

    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    La première commande sudo indique au noyau que vous souhaitez autoriser le transfert IP. La seconde commande sudo fait passer les paquets reçus des instances internes pour des paquets envoyés depuis l'instance de passerelle NAT.

    Pour inspecter les règles NAT iptables, utilisez l'option "L" (liste) :

    $ sudo iptables -v -L -t nat
    

    Vérifiez que la sortie est semblable à l'exemple suivant :

    Chain PREROUTING (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain INPUT (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 64 packets, 4164 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    64  4164 MASQUERADE  all  --  any    eth0    anywhere             anywhere"
    
  8. (Facultatif) Si vous souhaitez que ces paramètres persistent lors des redémarrages futurs :

    $ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
    
    $ sudo apt-get install iptables-persistent
    

Créer des passerelles NAT à haut débit et haute disponibilité

Cette section explique comment configurer plusieurs passerelles NAT en activant le routage ECMP (Equal Cost Multi-Path) et l'autoréparation pour un déploiement plus résilient et à plus haut débit.

GCP utilise les adresses IP privées RFC 1918 pour les machines virtuelles. Si ces VM ont besoin d'accéder à des ressources sur Internet, une traduction NAT est requise. Une architecture à une seule passerelle NAT est suffisante pour des scénarios simples. En revanche, les scénarios exigeant un débit plus élevé ou une disponibilité supérieure requièrent une architecture plus résiliente.

Configurer les passerelles

Lorsque plusieurs routes ont la même priorité, GCP utilise le routage ECMP pour distribuer le trafic. Dans ce cas, vous créez plusieurs passerelles NAT pour recevoir les différentes parties du trafic via ECMP. Ces passerelles NAT transmettent ensuite le trafic aux hôtes externes avec leurs adresses IP publiques.

Le diagramme suivant présente cette configuration.

configuration à plusieurs passerelles

Pour améliorer la résilience, placez chaque passerelle dans un groupe d'instances géré distinct de taille 1 et joignez une vérification de l'état simple garantissant le redémarrage automatique des passerelles en cas de défaillance. Comme les passerelles se trouvent dans des groupes d'instances séparés, elles disposent d'une adresse IP externe statique associée au modèle d'instance. Le présent exemple vous fait provisionner trois passerelles NAT n1-standard-2, mais vous avez toute latitude quant au nombre et à la taille des passerelles utilisées. Par exemple, les instances n1-standard-2 sont plafonnées à 4 Gbit/s de trafic réseau : si vous devez gérer un volume de trafic plus élevé, vous pouvez opter pour des instances n1-standard-8.

  1. Créez un réseau VPC (si nécessaire). Si vous ne comptez pas ajouter les passerelles à un VPC existant, créez un réseau et un sous-réseau VPC pour les accueillir. Si vous les ajoutez à un VPC existant, passez à la deuxième étape et modifiez les régions en fonction de votre environnement.

    1. À l'aide de Cloud Shell, créez un VPC personnalisé associé à votre projet GCP. Ce VPC vous permet d'utiliser un adressage IP autre que celui par défaut, mais il n'inclut aucune règle de pare-feu par défaut :

      gcloud compute networks create example-vpc --subnet-mode custom
      
    2. Créez un sous-réseau au sein de ce VPC et spécifiez une région et une plage IP. Pour ce tutoriel, utilisez la page 10.0.1.0/24 et la région us-east1 :

      gcloud compute networks subnets create example-east \
          --network example-vpc --range 10.0.1.0/24 --region us-east1
      
  2. Réservez et stockez trois adresses IP statiques.

    1. Réservez et stockez une adresse nommée nat-1 dans la région us-east1 :

      gcloud compute addresses create nat-1 --region us-east1
      
      nat_1_ip=$(gcloud compute addresses describe nat-1 \
          --region us-east1 --format='value(address)')
      
    2. Réservez et stockez une adresse nommée nat-2 dans la région us-east1 :

      gcloud compute addresses create nat-2 --region us-east1
      
      nat_2_ip=$(gcloud compute addresses describe nat-2 \
          --region us-east1 --format='value(address)')
      
    3. Réservez et stockez une adresse nommée nat-3 dans la région us-east1 :

      gcloud compute addresses create nat-3 --region us-east1
      nat_3_ip=$(gcloud compute addresses describe nat-3 \
          --region us-east1 --format='value(address)')
      
  3. Créez trois modèles d'instance dotés d'adresses IP réservées.

    1. Copiez la configuration de démarrage :

      gsutil cp gs://nat-gw-template/startup.sh .
      

      Si vous ne pouvez pas accéder au script de démarrage, copiez-le à partir de la section Script de démarrage.

    2. Créez un modèle d'instance nat-1 :

      gcloud compute instance-templates create nat-1 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_1_ip
      
    3. Créez un modèle d'instance nat-2 :

      gcloud compute instance-templates create nat-2 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh  --address $nat_2_ip
      
    4. Créez un modèle d'instance nat-3 :

      gcloud compute instance-templates create nat-3 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_3_ip
      

      Le type de machine n1-standard-2 comporte deux processeurs virtuels et peut utiliser jusqu'à 4 Gbit/s de bande passante réseau. Si vous avez besoin de plus de bande passante, vous pouvez choisir un autre hôte. La bande passante peut être augmentée à raison de 2 Gbit/s par processeur virtuel, pour atteindre 16 Gbit/s sur un hôte à 8 processeurs virtuels.

  4. Créez une vérification de l'état afin de surveiller la réactivité :

    gcloud compute health-checks create http nat-health-check --check-interval 30 \
        --healthy-threshold 1 --unhealthy-threshold 5 --request-path /health-check
    
    gcloud compute firewall-rules create "natfirewall" \
        --allow tcp:80 --target-tags natgw \
        --source-ranges "130.211.0.0/22","35.191.0.0/16"
    

    Si un système tombe en panne et ne peut plus répondre au trafic HTTP, il est redémarré. Comme vous avez besoin d'un projet dans cette éventualité, vous pouvez soit utiliser un projet existant, soit en créer un.

  5. Créez un groupe d'instances pour chaque passerelle NAT :

    gcloud compute instance-groups managed create nat-1 --size=1 --template=nat-1 --zone=us-east1-b
    gcloud compute instance-groups managed create nat-2 --size=1 --template=nat-2 --zone=us-east1-c
    gcloud compute instance-groups managed create nat-3 --size=1 --template=nat-3 --zone=us-east1-d
    
  6. Configurez l'autoréparation de manière à redémarrer les passerelles NAT qui ne répondent pas :

    gcloud beta compute instance-groups managed set-autohealing nat-1 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-b
    nat_1_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-1/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-2 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-c
    nat_2_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-2/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-3 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-d
    nat_3_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-3/ { print $1 }')
    
  7. Ajoutez des routes par défaut à vos instances :

    gcloud compute routes create natroute1 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-b \
        --next-hop-instance $nat_1_instance
    gcloud compute routes create natroute2 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-c \
        --next-hop-instance $nat_2_instance
    gcloud compute routes create natroute3 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-d \
        --next-hop-instance $nat_3_instance
    
  8. Balisez les instances auxquelles vous souhaitez faire utiliser la traduction NAT :

    gcloud compute instances add-tags natted-servers --tags no-ip
    
  9. Testez la fonctionnalité NAT. Vos passerelles étant configurées et vos machines virtuelles invitées étant balisées, pinguez des hôtes externes sans attribuer d'adresses IP externes à vos VM, comme dans cet exemple :

    ping 8.8.8.8

    Exemple de résultat :

    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=52 time=0.618 ms
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=0.325 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=0.443 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=0.314 ms
    64 bytes from 8.8.8.8: icmp_seq=4 ttl=52 time=0.386 ms
    

Aspects à prendre en compte

Cette configuration fournit trois passerelles NAT offrant chacune un débit de 2 Gbit/s dans la région us-east1. L'équilibrage de charge ECMP n'est cependant pas parfait, et l'un des flux n'est pas réparti entre plusieurs liens.

  • Un module Terraform adapté à cette configuration est également disponible pour automatiser les déploiements.
  • Cette configuration est optimale pour les liens sortants éphémères ou sans état. Si la taille du pool de passerelles NAT change, les connexions TCP peuvent être rééquilibrées, ce qui peut entraîner la réinitialisation d'une connexion établie.
  • Les nœuds ne sont pas automatiquement mis à jour. Par conséquent, si une installation par défaut de Debian présente une menace, vous devrez procéder à une mise à jour manuelle.
  • Ces instances sont toutes situées dans la région us-east1. Si vos VM se trouvent dans d'autres zones, vous obtiendrez peut-être de meilleures performances en rapprochant les passerelles de ces zones.
  • Le débit par passerelle peut atteindre 2 Gbit/s par cœur en mode unidirectionnel. Lors d'une panne de passerelle, le trafic est réparti entre les passerelles restantes. Cependant, comme les flux en cours ne sont pas reprogrammés, le trafic ne se réinstalle pas immédiatement lorsque la passerelle est remise en ligne. Veillez par conséquent à prévoir une marge suffisante lors du dimensionnement.
  • Pour être alerté en cas de résultats inattendus, utilisez Stackdriver afin de surveiller les groupes d'instances gérés et le trafic réseau.

Script de démarrage : startup.sh

Script de démarrage référencé à l'étape 3a :

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

cat <<EOF > /usr/local/sbin/health-check-server.py
#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess

PORT_NUMBER = 80
PING_HOST = "www.google.com"

def connectivityCheck():
  try:
    subprocess.check_call(["ping", "-c", "1", PING_HOST])
    return True
  except subprocess.CalledProcessError as e:
    return False

#This class handles any incoming request
class myHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    if self.path == '/health-check':
      if connectivityCheck():
        self.send_response(200)
      else:
        self.send_response(503)
    else:
      self.send_response(404)

try:
  server = HTTPServer(("", PORT_NUMBER), myHandler)
  print "Started httpserver on port " , PORT_NUMBER
  #Wait forever for incoming http requests
  server.serve_forever()

except KeyboardInterrupt:
  print "^C received, shutting down the web server"
  server.socket.close()
EOF

nohup python /usr/local/sbin/health-check-server.py >/dev/null 2>&1 &

Migrer une passerelle NAT basée sur une instance vers Cloud Nat

Si vous disposez d'une passerelle NAT basée sur une instance mais que vous souhaitez migrer vers Cloud NAT, procédez comme suit :

  1. Configurez Cloud NAT dans la même région que celle hébergeant votre passerelle basée sur une instance.
  2. Supprimez la/les route(s) statique(s) envoyant des paquets à la passerelle NAT basée sur une instance. Notez que votre réseau doit toujours avoir une route de passerelle par défaut.
  3. Le trafic devrait commencer à circuler dans Cloud NAT.
  4. Une fois que vous avez confirmé que tout fonctionne, supprimez vos passerelles NAT basées sur des instances.

Étapes suivantes

  • Consultez la présentation des VPC pour plus d'informations sur les réseaux VPC.
  • Consultez la page Utiliser VPC pour savoir comment créer et modifier des réseaux VPC.
Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…