Usa el reenvío de protocolos

Compute Engine es compatible con el reenvío de protocolos, que te permite crear objetos de regla de reenvío que pueden enviar paquetes a una instancia de destino sin NAT. Cada instancia de destino contiene una única instancia de máquina virtual (VM) que recibe y maneja el tráfico de las reglas de reenvío correspondientes.

El reenvío de protocolos puede usarse en varias situaciones, incluidas las siguientes:

Para el hosting virtual por IP, las redes privadas virtuales (VPN) y el balanceo de cargas, Compute Engine admite el reenvío de los protocolos siguientes:

Para las VIP privadas, solo se admiten TCP y UDP:

El reenvío de protocolos se cobra con las mismas tarifas que el servicio de balanceo de cargas. Para obtener más información, consulta la página de precios.

Permisos

Asegúrate de tener una función de Identity and Access Management (IAM) que te permita crear reglas de reenvío externas. Para obtener más información, consulta la sección de permisos en el documento sobre reglas de reenvío.

Guía de inicio rápido

En esta guía de inicio rápido, se supone que ya sabes usar bash.

Para crear una regla de reenvío que envíe tráfico a una sola instancia, debes seguir estos pasos:

  1. Crea una instancia de destino.

    Tu instancia de destino es una única instancia de VM, pero esta puede existir en el momento en que creas la instancia de destino o puede crearse después.

  2. Crea una regla de reenvío.

    La instancia de destino debe existir antes de crear una regla de reenvío. Si los paquetes entrantes coinciden con la IP, el protocolo y (si corresponde) el rango de puertos que entrega la regla de reenvío, la regla de reenvío dirige ese tráfico a tu instancia de destino.

En el resto de esta guía de inicio rápido, se demuestran los pasos anteriores en detalle de la siguiente manera:

  1. Configura un servidor Apache en una instancia de VM.
  2. Crea una instancia de destino y las reglas de reenvío correspondientes.
  3. Envía tráfico a una sola instancia de destino.

Al final de esta guía de inicio rápido, sabrás cómo configurar el reenvío de protocolos de varias reglas de reenvío a una sola instancia de destino.

Configura una instancia de VM y, luego, instala Apache

Para crear una única instancia de VM con Apache instalado, haz lo siguiente:

  1. Crea algunas secuencias de comandos de inicio para tu nueva instancia.

    Según el sistema operativo, el contenido de la secuencia de comandos de inicio puede ser distinto.

    • Si planeas usar una imagen de Debian en la instancia, ejecuta el siguiente comando:

      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 planeas usar una imagen de CentOS en la instancia, ejecuta el siguiente comando:

      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. Crea un rótulo identificador para tu futura VM a fin de facilitar la aplicación de un firewall más adelante:

    me@local:~$ TAG="www-tag"
    
  3. Crea una instancia de VM a fin de manejar el tráfico para tus reglas de reenvío:

    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. Crea una regla de firewall para permitir el tráfico externo a esta instancia de VM:

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

Configuraste con éxito una instancia de VM. Ahora puedes empezar con la configuración de reenvío de protocolos.

Crea una instancia de destino y reglas de reenvío correspondientes

  1. Crea una instancia de destino.

    Las instancias de destino contienen una única instancia de VM que recibe y maneja el tráfico de una regla de reenvío. Las instancias de destino no tienen una política NAT, así que puedes usarlas para configurar tus propias conexiones VPN con protocolos IPsec de forma directa.

    Debes crear una instancia de destino antes de poder crear un objeto de regla de reenvío porque las reglas de reenvío deben hacer referencia a un recurso de destino existente. No puedes crear una regla de reenvío que dirija el tráfico a un recurso de destino no existente. Por ejemplo, crea una instancia de destino de la siguiente manera:

    gcloud compute target-instances create pf-target-instance --instance pf-instance
    
  2. Crea objetos de regla de reenvío.

    Un objeto de regla de reenvío dirige el tráfico que hace coincidir el puerto y el protocolo IP con una instancia de destino especificada. Para obtener más información, revisa la documentación de reglas de reenvío.

    Para este ejemplo, los siguientes comandos crean tres reglas de reenvío, cada una con una dirección IP efímera que reenvía el tráfico de TCP a tu instancia de destino. De forma opcional, si tienes algunas direcciones IP externas estáticas, puedes usarlas con estas reglas de reenvío mediante la determinación de la marca --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
    

Puedes empezar a enviar tráfico a la instancia de destino.

Envía tráfico a tu instancia

  1. Obtén las direcciones IP externas de tus nuevas reglas de reenvío.

    Ejecuta gcloud compute forwarding-rules list para obtener las direcciones IP externas de tus reglas de reenvío. Por ejemplo, en la siguiente tabla, se enumeran las direcciones IP efímeras que se asignan para las reglas de reenvío que se crearon antes.

    Si elegiste usar direcciones IP reservadas, se enumeran aquí en lugar de las direcciones IP efímeras.

    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

    Toma nota de las direcciones IP para el siguiente paso.

  2. Configura los hosts virtuales Apache de la instancia de VM para entregar información diferente según la URL de destino.

    Primero, conéctate a tu instancia:

    gcloud compute ssh pf-instance
    

    Luego, edita el archivo /etc/apache2/sites-enabled/000-default.conf y agrega las siguientes líneas. Para las líneas VirtualHostcd .., usa las direcciones IP que viste cuando ejecutaste el paso anterior.

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

    Por último, reinicia Apache:

    user@myinst:~$ sudo /etc/init.d/apache2 restart
    
  3. Intenta enviar tráfico a la instancia.

    En tu máquina local, realiza una solicitud a las direcciones IP externas que entregan las reglas de reenvío que creaste.

    Usa curl para enviar tráfico a las direcciones IP. La respuesta muestra w1, w2 o w3, según la dirección IP.

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

    Tu configuración de reenvío de protocolo está lista.

Reglas de reenvío

Las reglas de reenvío funcionan junto con instancias de destino para admitir funciones de reenvío de protocolos. Si bien las reglas de reenvío también se usan con otros productos, como Cloud Load Balancing, en esta sección solo se abarcan las reglas de reenvío como parte del reenvío de protocolos a una VM individual.

Los recursos de reglas de reenvío se encuentran en el grupo de reglas de reenvío. Cada regla de reenvío coincide con una dirección IP específica, un protocolo y, opcionalmente, un rango de puertos en una sola instancia de destino. Cuando el tráfico se envía a una dirección IP externa entregada por una regla de reenvío, esta dirige ese tráfico a la instancia de destino.

Los siguientes son algunos puntos a tener en cuenta cuando se trabaja con reglas de reenvío:

  • El nombre de una regla de reenvío debe ser único en este proyecto, debe tener de 1 a 63 caracteres de longitud y coincidir con la expresión regular [a-z]([-a-z0-9]*[a-z0-9])?, lo que significa que el primer carácter debe ser una letra minúscula y todos los caracteres siguientes deben ser rayas, letras minúsculas o dígitos, excepto el último carácter, que no puede ser una raya.

  • Si no especificas un protocolo de reglas de reenvío, se usa el TCP predeterminado. Otros protocolos compatibles son UDP ESP, AH, SCTP, ICMP y L3_DEFAULT (actualmente en Vista previa).

    Los balanceadores de cargas de red basados en servicios de backend usan el protocolo de reglas de reenvío L3_DEFAULT para balancear las cargas del tráfico de TCP, UDP, ICMP y ESP. L3_DEFAULT solo es compatible cuando el esquema de balanceo de cargas es EXTERNAL.

  • Los rangos de puertos solo se pueden especificar para protocolos TCPUDP y SCTP.

  • Todos los puertos se deben configurar en los siguientes casos:

    • Estás usando reglas de reenvío L3_DEFAULT.

    • Esperas paquetes UDP fragmentados. Usa una sola regla de reenvío de UDP por destino y configúrala para aceptar tráfico en todos los puertos. Esto garantiza que todos los fragmentos lleguen a la misma regla de reenvío, incluso si no tienen el mismo puerto de destino.

    Para configurar todos los puertos, configura --ports=ALL mediante gcloud o allPorts en True mediante la API.

Agrega una regla de reenvío

Para agregar una nueva regla de reenvío, puedes usar el comando gcloud compute forwarding-rules create o crear una solicitud HTTP POST a la colección de reglas de reenvío.

gcloud

Para agregar una nueva regla de reenvío con gcloud, haz lo siguiente:

gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
    --load-balancing-scheme SCHEME \
    --region REGION \
    --target-instance-zone ZONE \
    --ip-protocol PROTOCOL \
    --ports PORTS \
    --target-instance TARGET_INSTANCE_NAME

Si omites la marca --target-instance-zone, la herramienta de línea de comandos de gcloud te solicitará que elijas una zona si no configuraste la propiedad compute/zone con gcloud config set compute/zone. Para obtener más información, consulta Establece propiedades predeterminadas.

Si omites la marca --region, la herramienta de línea de comandos de gcloud te solicita que elijas una región si no configuraste la propiedad compute/region con gcloud config set compute/region. Para obtener más información, consulta Establece propiedades predeterminadas.

Para obtener una descripción completa de las marcas que puedes usar, consulta el comando create de las reglas de reenvío o escribe gcloud compute forwarding-rules create --help.

API

Para agregar una regla de reenvío con la API, realiza una solicitud HTTP POST al siguiente URI:

https://compute.googleapis.com/compute/v1/projects/[project ID]/regions/us-central1/forwardingRules

El cuerpo de la solicitud debe contener los siguientes campos:

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

Si deseas aprender a enumerar reglas de reenvío, borrarlas y obtener información sobre una de ellas, consulta las páginas de referencia de la API y del SDK de gcloud:

Instancias de destino

Un recurso de instancia de destino contiene una instancia de VM que controla el tráfico de una o más reglas de reenvío y es ideal para reenviar ciertos tipos de tráfico de protocolo que debe administrar una sola fuente (p. ej., ESP y AH), pero también puedes usar una instancia de destino para los protocolos TCP y UDP. Las instancias de destino no tienen una política de NAT aplicada, por lo que se pueden usar cuando se requiere tráfico de IPsec sin NAT para redes privadas virtuales (VPN).

Las instancias de destino deben estar en la misma región que la regla de reenvío. Las instancias de destino también deben estar en la misma zona que la instancia de VM. Por ejemplo, si tu regla de reenvío está en us-central1 y la instancia que deseas usar está en us-central1-a, la instancia de destino debe estar en us-central1-a. Si la instancia está en us-central1-b, la instancia de destino también debe estar en us-central1-b.

Agrega una instancia de destino

Para agregar una nueva instancia de destino, puedes usar el comando gcloud compute target-instances o crear una solicitud HTTP POST a la colección targetInstances. No puedes crear recursos de instancia de destino con Cloud Console. En el siguiente ejemplo, se muestra cómo crear una instancia de destino con la herramienta de línea de comandos de gcloud:

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

Si omites la marca --zone, la herramienta de línea de comandos de gcloud te solicitará que elijas una zona si no configuraste la propiedad compute/zone con gcloud config set compute/zone. Para obtener más información, consulta Establece propiedades predeterminadas.

Para obtener una descripción completa de las marcas que puedes usar, consulta el comando create o escribe gcloud compute target-instances create --help.

En la API, realiza una solicitud HTTP POST al siguiente URI:

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

Con el siguiente cuerpo de solicitud:

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

Si deseas aprender a enumerar instancias de destino, borrarlas y obtener información sobre una de ellas, consulta las páginas de referencia de la API y del SDK de gcloud:

Reenvío de protocolos para VIP privadas

El reenvío de protocolos se puede usar para reglas de reenvío regionales privadas. Usa esta característica para configurar reglas de reenvío privadas que envían tráfico de TCP o UDP a una instancia de destino en la misma región. También puedes cambiar con facilidad las reglas de reenvío regionales privadas para usar instancias de destino o servicios de backend.

Una instancia de destino contiene una instancia de backend que maneja el tráfico de una o más reglas de reenvío. Solo puedes configurar una regla de reenvío privada para apuntar a cada instancia de destino.

Regla de reenvío privada con instancia de destino (haz clic para agrandar).
Regla de reenvío privada con una instancia de destino (haz clic para agrandar)

Usa el reenvío de protocolos con reglas de reenvío privadas en las siguientes circunstancias:

  • Deseas implementar una sola instancia de backend para tu servicio y quieres administrar las verificaciones de estado y otros aspectos por tu cuenta.
  • Deseas conservar una dirección IP privada de la regla de reenvío y quieres cambiar la instancia de destino a la que apunta la regla de reenvío.
  • Deseas mantener estable la implementación con la capacidad de mover con facilidad varias instancias de backend (servicio de backend) de una sola instancia (instancia de destino) sin cambiar la dirección IP de la regla de reenvío privada.

Transición entre una instancia de destino y un servicio de backend

Puedes actualizar una regla de reenvío privada que dirige tráfico a una instancia de destino con una sola instancia de VM para que dirija tráfico a un servicio de backend o viceversa. Cuando actualizas una regla de reenvío privada de esta manera, se conserva la dirección IP de la regla de reenvío. Es posible que se interrumpan las conexiones existentes durante esta transición, ya que el cambio habilita o inhabilita el balanceo de cargas para instancias de servicios de backend.

Transición de un servicio de backend a una instancia de destino (haz clic para agrandar).
Transición de un servicio de backend a una instancia de destino (haz clic para agrandar)

Puedes hacer una transición entre una instancia de destino y un servicio de backend solo con reglas de reenvío privadas. No puedes hacer esto con reenvíos de protocolo que usan reglas de reenvío externas.

Actualiza el destino de una regla de reenvío privada

Si tu regla de reenvío es privada, puedes pasar de apuntar a una instancia de destino a apuntar a un servicio de backend:

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

Entonces, puedes volver a una instancia de destino:

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

Aplica la configuración de reenvío de protocolos en un proyecto, una carpeta o una organización

Usa una política de la organización para restringir los tipos de reenvío de protocolos que se pueden crear en tu organización. Establece la siguiente restricción de política de la organización:

constraints/compute.restrictProtocolForwardingCreationForTypes

Cuando estableces la restricción compute.restrictProtocolForwardingCreationForTypes, especificas los tipos de reenvío de protocolos que no están permitidos. Para obtener una lista de los tipos disponibles, consulta Restringe la creación de reenvíos de protocolos.

Configura una política de la organización

Console

Para establecer una política de la organización de reenvío de protocolos desde la consola, completa los siguientes pasos:

  1. En Google Cloud Console, ve a la página Políticas de la organización.

    Ir a la página Políticas de la organización

  2. En el campo Filtrar, escribe protocol y selecciona constraints/compute.restrictProtocolForwardingCreationForTypes.
  3. Haz clic en Restrict Protocol Forwarding Based on type of IP Address.
  4. Haz clic en Editar para editar las restricciones de política de reenvío de protocolos existentes.
  5. Para crear una política personalizada, selecciona Personalizar.
  6. Después de realizar cualquier cambio, haz clic en Guardar para aplicar la configuración de la restricción.

gcloud

Para establecer una política de la organización de reenvío de protocolos, usa el comando gcloud resource-manager org-policies enable-enforce.

  1. Busca el ID de tu organización.

    gcloud organizations list
  2. Crea el archivo de política, como se muestra en los siguientes ejemplos.

    Enumera los valores que se inhabilitarán

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

    Permite las reglas de reenvío internas

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

    Inhabilita todas las reglas de reenvío

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
      "listPolicy": {
        "allValues": "DENY"
      }
    }
    
  3. Establece la restricción en la organización. Reemplaza ORGANIZATION_ID por el ID de tu organización.

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

    También puedes aplicar una política de la organización de reenvío de protocolos a una carpeta o un proyecto con las marcas --folder o --project, y el ID de la carpeta y del proyecto, respectivamente.

    Para las carpetas, ejecuta el siguiente comando:

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

    Para los proyectos, ejecuta el siguiente comando:

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

    Reemplaza los siguientes valores:

Después de configurar la política, esta se aplica cuando se agregan las reglas de reenvío correspondientes de Google Cloud.

La restricción no se aplica en las opciones de configuración de reenvío de protocolos existentes.

Si intentas crear un reenvío de protocolos de un tipo que infringe la restricción, el intento falla y se genera un mensaje de error. El mensaje de error tiene el siguiente formato:

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 configuras varias restricciones restrictProtocolForwardingCreationForTypes en diferentes niveles de recursos y si estableces el campo inheritFromParent en true, las restricciones se aplicarán de manera jerárquica.

Para obtener más información sobre la configuración de políticas de la organización, incluidas las descripciones de las opciones disponibles, consulta Crea y administra políticas de la organización y Usa restricciones.

Restricciones

  • Cuando usas las instancias de destino con reglas de reenvío privadas, los únicos protocolos compatibles son TCP y UDP.

Límites

  • Puedes configurar 100 reglas de reenvío privadas que apunten a instancias de destino por red.

  • Puedes tener 5 puertos por regla de reenvío privada.

Próximos pasos