Configurer des VM pour des cas d'utilisation de mise en réseau

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

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

Configurer une connexion HTTP externe à une VM

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 VM doit disposer d'une adresse IP externe (statique ou éphémère) pour recevoir du trafic provenant de l'extérieur de son réseau VPC.

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

Console

Vous pouvez utiliser Cloud Console pour créer une règle de pare-feu globale couvrant toutes les instances du 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.

console true http,https

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 avec les tags http-server ou https-server. La nouvelle instance est également balisée avec le tag 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 l'option Autoriser le trafic HTTP ou Autoriser le trafic HTTPS sur la page des détails de chacune des 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 l'option Autoriser le trafic HTTP et/ou 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 VM en décochant l'une des cases ou les deux.

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 commune à toutes les instances, Google Cloud 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 des 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. Attribuez un nom à votre règle de pare-feu et ajoutez tcp:80 dans la zone Protocoles et 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 toutes les requêtes HTTP et HTTPS entrantes vers 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 VM 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. Ainsi, 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 votre instance gateway-instance.
  2. Configurez une instance (ou plusieurs) sans adresse IP externe en spécifiant 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, puis configurez-le pour autoriser l'accès aux machines 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, ce qui leur permet de 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 tee -a /etc/squid/squid.conf <<'EOF'
        acl to_metadata dst 169.254.169.254
        http_access deny to_metadata
        EOF
        
        # Start Squid
        user@gateway:~$ sudo service squid start
        
  6. Configurez l'instance hidden-instance pour qu'elle utilise 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 (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 fonctionnerait pas 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 VM en tant que passerelle VPN

Vous pouvez utiliser le logiciel VPN Strongswan pour configurer une passerelle VPN sur l'une de vos instances. Nous recommandons à la plupart des utilisateurs d'utiliser Cloud VPN au lieu de Strongswan. Avec Cloud VPN, vous n'avez pas besoin de créer et de configurer une VM pour exécuter des logiciels 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 de VM 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 de VM 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 une route sur le réseau vpn-network pour acheminer le trafic via la passerelle VPN si celui-ci est destiné à votre réseau sur site.

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

    Dans le 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, créez une copie de votre fichier ipsec.conf et intervertissez les ID et sous-réseaux de gauche et de droite.

  10. Testez votre tunnel VPN en envoyant une requête ping à un ordinateur 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é, démarrez 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 VM 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) capable d'acheminer le trafic depuis des instances de VM uniquement 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. Balisez les instances de machine virtuelle sans adresse IP externe destinées à utiliser l'instance de passerelle avec le tag no-ip, ou créez une machine virtuelle sans adresse IP externe et balisez l'instance avec 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 $(/sbin/ifconfig | head -1 | awk -F: {'print $1'}) -j MASQUERADE
        

    La première commande sudo indique au noyau que vous souhaitez autoriser le transfert IP. La deuxième 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.

Google Cloud 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 à passerelle NAT unique 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

Dans les cas où plusieurs routes ont la même priorité, Google Cloud utilise l'acheminement ECMP pour distribuer le trafic. Dans ce cas, vous créez plusieurs passerelles NAT pour recevoir des parties du trafic via ECMP. Les passerelles NAT transfèrent ensuite le trafic vers des 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. Les passerelles se trouvent dans des groupes d'instances séparés, elles disposent ainsi d'une adresse IP externe statique associée au modèle d'instance. Dans cet exemple, vous avez configuré 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 limitées à 4 Gbit/s de trafic réseau. Si vous devez gérer un volume de trafic plus élevé, vous pouvez choisir une instance 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. Avec Cloud Shell, créez un VPC personnalisé associé à votre projet Google Cloud. Ce VPC vous permet d'utiliser un adressage IP autre que celui par défaut, mais il n'inclut pas de règles 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 plage 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 intitulé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 intitulée nat-2 dans 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 intitulée nat-3 dans 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 de VM 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 compute instance-groups managed update nat-1 \
            --health-check nat-health-check --initial-delay 120 --zone us-east1-b
        nat_1_instance=$(gcloud compute instances list --format='value(name)' --filter='name ~nat-1')
        gcloud compute instance-groups managed update nat-2 \
            --health-check nat-health-check --initial-delay 120 --zone us-east1-c
        nat_2_instance=$(gcloud compute instances list --format='value(name)' --filter='name ~nat-2')
        gcloud compute instance-groups managed update nat-3 \
            --health-check nat-health-check --initial-delay 120 --zone us-east1-d
        nat_3_instance=$(gcloud compute instances list --format='value(name)' --filter='name ~nat-3')
        
  7. Ajoutez à votre réseau VPC des routes par défaut qui s'appliquent aux instances qui utilisent la traduction NAT :

        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 informé des résultats inattendus, utilisez Monitoring pour 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 ou les routes statiques en envoyant des paquets à la passerelle NAT basée sur une instance. Notez que votre réseau doit toujours comporter 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