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 adresses 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. Vous pouvez l'utiliser dans des scénarios dans lesquels vous souhaitez exposer 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 configurer l'hébergement virtuel SSL.

  • Réseaux privés virtuels (VPN)

    Consultez les sections :

  • Adresses IP virtuelles privées

    Vous pouvez utiliser le transfert de protocole pour les règles de transfert régional privées avec des plages de sous-réseaux VPC. 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 section Concepts des règles de transfert pour en savoir plus sur le transfert du trafic vers un équilibreur de charge.

Pour l'hébergement virtuel par adresses IP, les réseaux privés virtuels (VPN) et l'équilibrage de charge, Compute Engine accepte le transfert de protocole des protocoles suivants :

Pour les adresses IP virtuelles 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.

Avant de commencer

Pour en savoir plus, consultez la page Présentation du contrôle des accès.

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, mais cette instance peut exister au moment où vous créez l'instance cible, ou elle peut être créée par la suite.

  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 desservie 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 update && sudo apt -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. Vous ne pouvez pas 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 transmet le trafic TCP à votre instance cible. Si vous disposez d'adresses IP externes statiques, vous pouvez les utiliser avec ces règles de transfert grâce à 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 en fonction de 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). Vous ne pouvez pas 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 avec 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. Vous ne pouvez pas 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. Voici un exemple de 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, l'outil de ligne de commande gcloud vous invite à choisir une zone si vous n'avez pas défini la propriété compute/zone avec gcloud config set compute/zone. Pour en savoir plus, consultez la section Définir les propriétés 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, l'outil de ligne de commande gcloud vous invite à choisir une zone si vous n'avez pas défini la propriété compute/region avec gcloud config set compute/region. Pour en savoir plus, consultez la section Définir les propriétés par défaut.

Pour obtenir une description complète des options que vous pouvez utiliser, consultez la section 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. Elle est idéale pour transférer certains types de trafic 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 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 dans la collection targetInstances. Vous ne pouvez pas 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, l'outil de ligne de commande gcloud vous invite à choisir une zone si vous n'avez pas défini la propriété compute/zone avec gcloud config set compute/zone. Pour en savoir plus, consultez la section Définir les propriétés 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 privées. 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 revenir à une instance cible :

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

Appliquer des paramètres de transfert de protocole à un projet, un dossier ou une organisation

Utilisez une règle d'administration pour limiter les types de transfert de protocole pouvant être créés dans votre organisation. Définissez la contrainte de règle d'administration suivante :

constraints/compute.restrictProtocolForwardingCreationForTypes

Lorsque vous définissez la contrainte compute.restrictProtocolForwardingCreationForTypes, vous spécifiez les types de transfert de protocole non autorisés. Pour obtenir la liste des types disponibles, consultez la section décrivant les restrictions sur la création de transfert de protocole.

Configurer une règle d'administration

Console

Pour définir une règle d'administration de transfert de protocole à partir de la console, procédez comme suit :

  1. Dans Google Cloud Console, accédez à la page Règles d'administration.

    Accéder à la page "Règles d'administration"

  2. Dans le champ Filtre, saisissez protocol et sélectionnez constraints/compute.restrictProtocolForwardingCreationForTypes.
  3. Cliquez sur Restreindre le transfert de protocole en fonction du type d'adresse IP.
  4. Cliquez sur Modifier pour modifier vos contraintes de règle de transfert de protocole existantes.
  5. Pour créer une règle personnalisée, sélectionnez Personnaliser.
  6. Une fois les modifications effectuées, cliquez sur Enregistrer pour appliquer les paramètres de contrainte.

gcloud

Pour définir une règle d'administration de transfert de protocole, utilisez la commande gcloud resource-manager org-policies enable-enforce.

  1. Trouvez l'ID de votre organisation.

    gcloud organizations list
  2. Créez le fichier de règle, comme indiqué dans les exemples suivants.

    Répertorier les valeurs à refuser

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
       "listPolicy": {
         "deniedValues": [
           "INTERNAL",
           "EXTERNAL"
         ]
       }
     }
     

    Autoriser les règles de transfert internes

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
       "listPolicy": {
         "deniedValues": [
           "EXTERNAL"
         ]
       }
     }
     

    Refuser toutes les règles de transfert

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
      "listPolicy": {
        "allValues": "DENY"
      }
    }
    
  3. Définissez la contrainte dans votre organisation. Remplacez ORGANIZATION_ID par votre ID d'organisation.

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --organization=ORGANIZATION_ID
    

    Vous pouvez également appliquer une règle d'administration de transfert de protocole à un dossier ou à un projet avec les options --folder ou --project, associées respectivement à l'ID du dossier et l'ID du projet.

    Pour les dossiers, exécutez la commande suivante :

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --folder=FOLDER_ID
    

    Pour les projets, exécutez la commande suivante :

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --project=PROJECT_ID
    

    Remplacez les éléments suivants :

Une fois la règle définie, elle est appliquée lorsque vous ajoutez les règles de transfert Google Cloud correspondantes.

La contrainte n'est pas appliquée aux configurations de transfert de protocole existantes.

Si vous tentez de créer un transfert de protocole d'un type qui ne respecte pas la contrainte, la tentative échoue et un message d'erreur est généré. Le message d'erreur s'affiche au format suivant :

Constraint constraints/compute.restrictProtocolForwardingCreationForTypes
violated for projects/PROJECT_NAME. Forwarding Rule projects/PROJECT_NAME/region/REGION/forwardingRules/FORWARDING_RULE_NAME
of type SCHEME is not allowed.

Si vous définissez plusieurs contraintes restrictProtocolForwardingCreationForTypes à différents niveaux de ressources et que vous définissez le champ inheritFromParent sur true, les contraintes sont appliquées de manière hiérarchique.

Pour en savoir plus sur la définition des règles d'administration, y compris la description des options disponibles, consultez les pages Créer et gérer des règles d'administration et Utiliser des contraintes.

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, vous essayez peut-être de configurer deux règles de transfert pointant vers la même instance cible. Il est impossible que plusieurs règles de transfert ciblent la même instance.

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 jusqu'à 5 ports par règle de transfert privée.