Utiliser le transfert de protocole

Compute Engine accepte le transfert de protocole, qui vous permet de créer des objets de règle de transfert capables d'envoyer des paquets à une instance cible non NAT. Chaque instance cible contient une seule instance de machine virtuelle (VM). Celle-ci reçoit et gère le trafic à partir des règles de transfert correspondantes.

Le transfert de protocole peut être utilisé dans plusieurs cas, par exemple :

  • Hébergement virtuel par IP

    Vous pouvez configurer plusieurs règles de transfert pour qu'elles pointent vers une seule instance cible, ce qui vous permet d'utiliser plusieurs adresses   IP externes avec une seule instance de VM. Cette configuration est utilisable dans des scénarios où vous souhaitez diffuser des données à partir d'une seule instance de VM, mais via différentes adresses IP externes. Cela se révèle particulièrement utile pour mettre en place un hébergement virtuel avec SSL.

  • Réseaux privés virtuels (VPN)

    Consultez les sections :

  • Adresses IP virtuelles privées

    Vous pouvez utiliser le transfert de protocole pour règles de transfert régional privé avec des adresses privées (RFC 1918). Utilisez cette fonctionnalité pour configurer des règles de transfert privées qui envoient le trafic TCP ou UDP à une instance cible dans la même région. Les règles de transfert privées au sein d'une région peuvent pointer vers des instances cibles ou des services de backend, et vous pouvez passer de l'un à l'autre à volonté.

  • Équilibrage de charge

    Consultez la page de présentation des règles de transfert pour en savoir plus sur le transfert du trafic vers un équilibreur de charge.

Pour l'hébergement virtuel fondé sur l'adresse IP, les réseaux privés virtuels (VPN) et l'équilibrage de charge, Compute Engine prend en charge le transfert des protocoles suivants :

Pour les VIP privées, seuls les protocoles TCP et UDP sont pris en charge :

Le transfert de protocole est facturé aux mêmes tarifs que le service d'équilibrage de charge. Pour plus d'informations, consultez la page Tarifs.

Guide de démarrage rapide

Dans ce guide, nous partons du principe que vous maîtrisez bash.

Pour créer une règle de transfert envoyant du trafic vers une seule instance, procédez comme suit :

  1. Créez une instance cible.

    Votre instance cible est une instance de VM unique, qui peut être créée avant ou après l'instance cible.

  2. Créez une règle de transfert.

    Votre instance cible doit exister avant de créer une règle de transfert. Si les paquets entrants correspondent à l'adresse IP, au protocole et (le cas échéant) à la plage de ports autorisée par votre règle de transfert, la règle de transfert dirigera ce trafic vers votre instance cible.

Le reste de ce guide décrit les étapes ci-dessus de manière exhaustive :

  1. Configuration d'un serveur Apache sur une instance de VM
  2. Création d'une instance cible et des règles de transfert correspondantes
  3. Envoi du trafic vers une seule instance cible

À la fin de ce guide de démarrage rapide, vous saurez comment configurer le transfert de protocole et vous aurez mis en place plusieurs règles de transfert pointant vers une seule instance cible.

Configurer une instance de VM et installer Apache

Pour créer une instance de VM unique avec Apache, procédez comme suit :

  1. Créez des scripts de démarrage pour votre nouvelle instance.

    Selon votre système d'exploitation, le contenu de votre script de démarrage peut différer :

    • Si vous prévoyez d'utiliser une image Debian sur votre instance, exécutez la commande suivante :

          me@local:~$ echo "sudo apt-get update && sudo apt-get -y install apache2 && mkdir -p /var/www1 &&
          mkdir -p /var/www2 && mkdir -p /var/www3 && hostname > /var/www/html/index.html &&
          echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

    • Si vous prévoyez d'utiliser une image CentOS sur votre instance, exécutez la commande suivante :

          me@local:~$ echo "sudo yum -y install httpd && sudo service httpd restart && mkdir -p /var/www1 &&
          mkdir -p /var/www2 && mkdir /var/www3 && hostname > /var/www/html/index.html &&
          echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

  2. Créez un tag pour votre future VM afin de pouvoir ultérieurement lui appliquer un pare-feu :

        me@local:~$ TAG="www-tag"
        
  3. Créez une instance de VM pour gérer le trafic de vos règles de transfert :

    gcloud compute instances create pf-instance \
            --image-project debian-cloud --image-family debian-9 --tags $TAG \
            --metadata-from-file startup-script=$HOME/pf_startup.sh
        
  4. Créez une règle de pare-feu pour autoriser le trafic externe vers cette instance de VM :

    gcloud compute firewall-rules create www-firewall --target-tags $TAG --allow tcp
        

Vous avez correctement configuré une instance de VM. Vous pouvez maintenant commencer la configuration du transfert de protocole.

Créer une instance cible et les règles de transfert correspondantes

  1. Créez une instance cible.

    Les instances cibles contiennent une seule instance de VM, qui reçoit et gère le trafic provenant d'une règle de transfert. Les instances cibles ne disposent pas de règles NAT. Vous pouvez donc les utiliser pour configurer directement vos connexions VPN à l'aide de protocoles IPsec.

    Vous devez créer une instance cible avant de pouvoir créer un objet de règle de transfert, car les règles de transfert doivent faire référence à une ressource cible existante. Il est impossible de créer une règle de transfert qui dirige le trafic vers une ressource cible non existante. Dans cet exemple, nous allons créer une instance cible comme suit :

    gcloud compute target-instances create pf-target-instance --instance pf-instance
        
  2. Créez des objets de règle de transfert.

    Un objet de règle de transfert dirige le trafic correspondant au protocole IP et au port vers une instance cible spécifiée. Pour plus d'informations, consultez la documentation relative aux règles de transfert.

    Dans cet exemple, les commandes suivantes créent trois règles de transfert, chacune avec une adresse  IP éphémère qui transfère le trafic TCP vers votre instance cible. Si vous disposez d'adresses IP externes statiques, vous pouvez les utiliser avec ces règles de transfert en spécifiant l'option --address IP-ADDRESS.

    gcloud compute forwarding-rules create pf-rule1 --ip-protocol TCP \
            --ports 80 --target-instance pf-target-instance
        
    gcloud compute forwarding-rules create pf-rule2 --ip-protocol TCP \
            --ports 80 --target-instance pf-target-instance
        
    gcloud compute forwarding-rules create pf-rule3 --ip-protocol TCP \
            --ports 80 --target-instance pf-target-instance
        

Vous pouvez maintenant commencer à envoyer du trafic vers votre instance cible.

Envoyer du trafic vers une instance

  1. Obtenez les adresses IP externes de vos nouvelles règles de transfert.

    Exécutez gcloud compute forwarding-rules list pour obtenir les adresses  IP externes de vos règles de transfert. Par exemple, le tableau suivant répertorie les adresses  IP éphémères qui sont attribuées aux règles de transfert créées précédemment.

    Si vous avez choisi d'utiliser des adresses IP réservées, elles seront listées ici à la place des adresses IP éphémères.

    gcloud compute forwarding-rules list
        
        NAME     REGION      IP_ADDRESS     IP_PROTOCOL TARGET
        pf-rule1 us-central1 [ADDRESS_1]    TCP         us-central1-a/targetInstances/pf-target-instance
        pf-rule2 us-central1 [ADDRESS_2]    TCP         us-central1-a/targetInstances/pf-target-instance
        pf-rule3 us-central1 [ADDRESS_3]    TCP         us-central1-a/targetInstances/pf-target-instance

    Notez ces adresses IP pour l'étape suivante.

  2. Configurez les hôtes virtuels Apache de l'instance de VM pour diffuser différentes informations en fonction de l'URL de destination.

    Commencez par vous connecter à votre instance :

    gcloud compute ssh pf-instance
        

    Ensuite, modifiez le fichier /etc/apache2/sites-enabled/000-default.conf et ajoutez les lignes suivantes. Pour les lignes VirtualHostcd .., utilisez les adresses IP notées à l'étape précédente.

    <VirtualHost [ADDRESS_1]>
         DocumentRoot /var/www1
         <Directory /var/www1>
          Require all granted
         </Directory>
        </VirtualHost>
        <VirtualHost [ADDRESS_2]>
         DocumentRoot /var/www2
         <Directory /var/www2>
          Require all granted
         </Directory>
        </VirtualHost>
        <VirtualHost [ADDRESS_3]>
         DocumentRoot /var/www3
         <Directory /var/www3>
          Require all granted
         </Directory>
        </VirtualHost>
        

    Enfin, redémarrez Apache :

        user@myinst:~$ sudo /etc/init.d/apache2 restart
        
  3. Essayez d'envoyer du trafic vers votre instance.

    Sur votre ordinateur local, envoyez une requête aux adresses IP externes desservies par les règles de transfert que vous avez créées.

    Utilisez curl pour envoyer le trafic vers les adresses IP. La réponse renvoie w1, w2 ou w3 selon l'adresse IP.

        me@local:~$curl [ADDRESS_1]
        w1
        
        me@local:~$ curl [ADDRESS_2]
        w2
        
        me@local:~$ curl [ADDRESS_3]
        w3
        

    La configuration de votre transfert de protocole est prête.

Règles de transfert

Les règles de transfert fonctionnent conjointement avec les pools cibles et les instances cibles pour prendre en charge les fonctionnalités d'équilibrage de charge et de transfert de protocole. Pour utiliser l'équilibrage de charge ou le transfert de protocole, vous devez créer une règle de transfert qui dirige du trafic vers des pools cibles spécifiques (pour l'équilibrage de charge) ou des instances cibles (pour le transfert de protocole). Il est impossible d'utiliser ces fonctionnalités sans recourir à des règles de transfert.

Les ressources des règles de transfert sont stockées dans la collection "Règles de transfert". Chaque règle de transfert fait correspondre une adresse IP, un protocole et, le cas échéant, une plage de ports spécifiques à un pool ou une instance cible unique. Lorsque du trafic est envoyé à une adresse IP externe desservie par une règle de transfert, celle-ci dirige ce trafic vers le pool ou les instances cibles correspondants. Vous pouvez créer jusqu'à 50 objets de règle de transfert par projet.

Voici quelques éléments à garder à l'esprit lorsque vous utilisez des règles de transfert :

  • Le nom d'une règle de transfert doit être unique au sein du projet, comporter de 1 à 63 caractères et correspondre à l'expression régulière [a-z]([-a-z0-9]*[a-z0-9])?. Le premier caractère doit donc être une minuscule et tous les caractères suivants doivent être soit un tiret, soit une lettre minuscule, soit un chiffre, à l'exception du dernier caractère, qui ne peut pas être un tiret.

  • Si vous ne spécifiez pas de protocole de règle de transfert, TCP est utilisé par défaut. Notez également que certains protocoles ne peuvent être utilisés qu'avec des pools cibles ou avec des instances cibles :

    • Si vous utilisez les protocoles ESP, AH, SCTP ou ICMP, vous devez spécifier une instance cible. Il n'est pas possible de spécifier un pool cible lorsque vous utilisez ces protocoles.
    • Si vous utilisez les protocoles TCP ou UDP, vous pouvez spécifier un pool cible ou une instance cible.
  • Il n'est possible de spécifier des plages de ports qu'avec les protocoles TCP, UDP et SCTP.

Ajouter une règle de transfert

Pour ajouter une règle de transfert, vous pouvez utiliser la commande gcloud compute forwarding-rules create ou créer une requête HTTP POST pour la collection "Règles de transfert". L'exemple suivant illustre la création d'une règle de transfert vers une instance cible à l'aide de l'outil de ligne de commande gcloud :

gcloud compute forwarding-rules create [FORWARDING_RULE] \
        --load-balancing-scheme internal | external \
        --region [REGION] \
        [--target-instance-zone [ZONE]] \
        --ip-protocol TCP --ports 80 \
        --target-instance [TARGET_INSTANCE]
    

Si vous omettez l'option --target-instance-zone et que vous n'avez pas défini la propriété compute/zone avec gcloud config set compute/zone, l'outil de ligne de commande gcloud vous invite à choisir une zone. Pour plus d'informations, consultez la section Définir une zone ou une région par défaut.

La commande gcloud compute forwarding-rules create permet de définir une instance cible en tant que cible lorsque le schéma d'équilibrage de charge est interne.

L'exemple suivant illustre la création d'une règle de transfert vers un pool cible :

gcloud compute forwarding-rules create [FORWARDING_RULE] \
        --target-pool [TARGET_POOL] \
        [--region [REGION]]
    

Si vous omettez l'option --region et que vous n'avez pas défini la propriété compute/region avec gcloud config set compute/region, l'outil de ligne de commande gcloud vous invite à choisir une zone. Pour plus d'informations, consultez la section Définir une zone ou une région par défaut.

Pour obtenir une description complète des options que vous pouvez utiliser, consultez la page concernant la commande create des règles de transfert ou saisissez gcloud compute forwarding-rules create --help.

Pour ajouter une règle de transfert à l'aide de l'API, envoyez une requête HTTP POST à l'URI suivant :

https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-central1/forwardingRules
    

Le corps de votre requête doit contenir les champs suivants :

{
     "name": "example-forwarding-rule",
     "IPAddress": "`10.1.1.1",
     "IPProtocol": "TCP",
     "portRange": "80",
     "target": "zones/us-central1-f/targetInstances/example-target-instances"
    }
    

Pour savoir comment répertorier des règles de transfert, obtenir des informations sur une règle de transfert spécifique ou supprimer des règles de transfert, consultez les pages suivantes de la documentation de référence sur le SDK gcloud et l'API :

Instances cibles

Une ressource "instance cible" contient une instance de VM qui gère le trafic provenant d'une ou plusieurs règles de transfert. C'est la configuration idéale pour transférer certains types de trafic de protocole gérés par une source unique (par exemple, ESP et AH), mais vous pouvez également utiliser une instance cible pour les protocoles TCP et UDP. Les instances cibles ne sont pas associées à une règle NAT. Elles peuvent donc être utilisées pour le trafic nécessitant un trafic IPsec non NAT pour les réseaux privés virtuels (VPN).

Les instances cibles doivent se trouver dans la même région que la règle de transfert. Les instances cibles doivent également se trouver dans la même zone que l'instance de VM. Par exemple, si votre règle de transfert est dans us-central1 et que l'instance que vous souhaitez utiliser est dans us-central1-a, l'instance cible doit être dans us-central1-a. Si l'instance se trouve dans us-central1-b, l'instance cible doit également être dans us-central1-b.

Ajouter une instance cible

Pour ajouter une instance cible, vous pouvez utiliser la commande gcloud compute target-instances ou créer des requêtes HTTP POST pour la collection "targetInstances". Il n'est pas possible de créer des ressources d'instance cible à l'aide de Cloud Console. L'exemple suivant illustre la création d'une instance cible à l'aide de l'outil de ligne de commande gcloud :

gcloud compute target-instances create [TARGET_INSTANCE] --instance INSTANCE
    

Si vous omettez l'option --zone et que vous n'avez pas défini la propriété compute/zone avec gcloud config set compute/zone, l'outil de ligne de commande gcloud vous invite à choisir une zone. Pour plus d'informations, consultez la section Définir une zone ou une région par défaut.

Pour obtenir une description complète des options que vous pouvez utiliser, consultez la commande create ou saisissez gcloud compute target-instances create --help.

Dans l'API, envoyez une requête HTTP POST à l'adresse URI suivante :

https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances
    

Avec le corps de requête suivant :

body = {
      "name": "example-target-instance",
      "instance": "zones/us-central1-f/instances/example-instance"
    }
    

Pour savoir comment répertorier les instances cibles, obtenir des informations sur une instance cible spécifique ou supprimer une instance cible, consultez les pages suivantes de la documentation de référence sur le SDK gcloud et l'API :

Transfert de protocole pour adresses IP virtuelles privées

Le transfert de protocole peut être utilisé pour des règles de transfert régional impliquant des adresses privées (RFC 1918). Utilisez cette fonctionnalité pour configurer des règles de transfert privées qui envoient le trafic TCP ou UDP à une instance cible dans la même région. Les règles de transfert régional privé peuvent utiliser les instances cibles ou les services de backend, et vous pouvez passer de l'un à l'autre à volonté.

Chaque instance cible contient une seule instance backend. Celle-ci gère le trafic en se basant sur les règles de transfert correspondantes. Pour chaque instance cible, il n'est possible de configurer qu'une seule règle de transfert privée.

Règle de transfert privée avec instance cible (cliquez pour agrandir)
Règle de transfert privée avec instance cible (cliquez pour agrandir)

Le transfert de protocole avec règles de transfert privées est indiqué dans les cas suivants :

  • Vous souhaitez déployer une seule instance backend pour votre service et gérer vous-même les vérifications d'état et autres aspects.
  • Vous souhaitez conserver l'adresse IP privée d'une règle de transfert et souhaitez en modifier l'instance cible.
  • Vous souhaitez assurer la stabilité de votre déploiement en ayant la possibilité de passer facilement à plusieurs instances backend (service de backend) à partir d'une seule instance (instance cible), et ce, sans modifier l'adresse IP de votre règle de transfert privée.

Transition entre instance cible et service de backend

Vous pouvez mettre à jour une règle de transfert privée dirigeant du trafic vers une instance cible avec une seule instance de VM afin qu'elle dirige le trafic vers un service de backend, ou inversement. Lors de cette modification, l'adresse IP de la règle de transfert privée est conservée. Les connexions existantes peuvent être interrompues lors de la transition, car cette modification peut activer ou désactiver l'équilibrage de charge pour les instances de service de backend.

Transition d'un service de backend vers une instance cible (cliquez pour agrandir)
Transition d'un service de backend vers une instance cible (cliquez pour agrandir)

Vous pouvez effectuer une transition entre une instance cible et un service de backend uniquement avec des règles de transfert privées. Cela n'est pas possible avec le transfert de protocole qui utilise des règles de transfert externes.

Mettre à jour la cible d'une règle de transfert privée

Si votre règle de transfert est privée, vous pouvez modifier sa cible pour qu'elle cesse de désigner une instance cible au profit d'un service de backend :

    gcloud compute forwarding-rules set-target my-forwarding-rule
            --backend-service my-backend-service
    

Vous pouvez ensuite procéder ainsi pour revenir à une instance cible :

    gcloud compute forwarding-rules set-target my-forwarding-rule
            --target-instance my-target-instance
    

Résoudre les problèmes de transfert de protocole pour les règles de transfert privées

Restriction régionale

Le transfert de protocole pour règles de transfert privées est une fonctionnalité régionale. Tous les clients et les instances de VM cibles doivent être dans la même région.

Message d'erreur : "An internal target instance can only be the target of one forwarding rule" (Une instance cible interne ne peut être la cible que d'une règle de transfert)

Si le message d'erreur An internal target instance can only be the target of one forwarding rule s'affiche, c'est peut-être parce que vous essayez de configurer deux règles de transfert pointant vers la même instance cible. Il est impossible de faire pointer plusieurs règles de transfert vers la même instance cible.

Restrictions

  • Pour les instances cibles avec règles de transfert privées, les seuls protocoles compatibles sont TCP et UDP.

Limites

  • Vous pouvez configurer jusqu'à 100 règles de transfert privées pointant vers des instances cibles par réseau.

  • Vous pouvez avoir 5 ports par règle de transfert privée.