Configurar el enrutamiento TLS de Gateway

En esta guía se muestra cómo configurar una pasarela de entrada basada en proxy Envoy con recursos Gateway y TLSRoute. También puedes adjuntar un recurso TLSRoute.

La implementación que configures se muestra en el siguiente diagrama. Un balanceador de carga de red de paso a través externo regional dirige el tráfico a los proxies de Envoy que actúan como una pasarela de entrada. Los proxies de Envoy usan el enrutamiento de transferencia de TLS y dirigen el tráfico a los servidores HTTPS que se ejecutan en las instancias de VM de backend.

Transferencia de TLS con una pasarela de entrada
Transferencia de TLS con una pasarela de entrada (haz clic en la imagen para ampliarla)

Antes de empezar

Asegúrate de completar las tareas descritas en el artículo Preparar la configuración con Envoy y cargas de trabajo sin proxy.

Configurar reglas de cortafuegos

En esta sección, creará reglas de cortafuegos para permitir que las conexiones de comprobación del estado entrantes se conecten a las instancias de VM de su red.

  1. Crea una regla de cortafuegos:

    gcloud compute firewall-rules create allow-gateway-health-checks \
     --network=NETWORK_NAME \
     --direction=INGRESS \
     --action=ALLOW \
     --rules=tcp \
     --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \
     --target-tags=gateway-proxy
    
  2. Configura reglas de cortafuegos para permitir el tráfico de cualquier origen. Edita los comandos de tus puertos y los intervalos de direcciones IP de origen:

    gcloud compute firewall-rules create allow-gateway-ingress-traffic \
      --network=NETWORK_NAME \
      --direction=INGRESS \
      --action=ALLOW \
      --rules=tcp:443 \
      --source-ranges="0.0.0.0/0" \
      --target-tags=gateway-proxy
    

Configurar permisos de Gestión de Identidades y Accesos

En esta sección, designa la cuenta de servicio de los proxies de la pasarela y asigna los roles de IAM correctos a la cuenta de servicio.

  1. Crea una identidad de cuenta de servicio para los proxies de la pasarela:

    gcloud iam service-accounts create gateway-proxy
    
  2. Asigna los roles de gestión de identidades y accesos necesarios a la identidad de la cuenta de servicio:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/trafficdirector.client"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

Configurar el recurso Gateway

  1. En un archivo llamado gateway443.yaml, crea la especificación Gateway para el tráfico HTTP:

    name: gateway443
    scope: gateway-proxy
    ports:
    - 443
    type: OPEN_MESH
    
  2. Crea el recurso Gateway con la especificación gateway443.yaml:

    gcloud network-services gateways import gateway443 \
        --source=gateway443.yaml \
        --location=global
    

Crear un grupo de instancias gestionado con proxies de Envoy

En esta sección, creará los proxies de Envoy asociados a la pasarela de entrada.

  1. Crea una plantilla de instancia para una VM que ejecute un proxy de servicio Envoy desplegado automáticamente. Los Embajadores tienen el ámbito definido como gateway-proxy. No envíes el puerto de servicio como parámetro de la marca --service-proxy.

    gcloud beta compute instance-templates create gateway-proxy \
      --machine-type=n1-standard-1 \
      --boot-disk-size=10GB \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=gateway-proxy \
      --network-interface=network=NETWORK_NAME,no-address \
      --service-account="gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --service-proxy=enabled,scope=gateway-proxy
    
  2. Crea un grupo de instancias gestionado regional a partir de la plantilla de instancia:

    gcloud compute instance-groups managed create gateway-proxy \
      --region=REGION \
      --size=1 \
      --template=gateway-proxy
    
  3. Define el nombre del puerto de servicio del grupo de instancias gestionado:

    gcloud compute instance-groups managed set-named-ports gateway-proxy \
      --named-ports=https:443 \
      --region=REGION
    

Configurar el balanceador de carga de red de paso a través externo regional

En esta sección, creará el balanceador de carga de red de paso a través externo.

  1. Crea una dirección IP regional externa estática:

    gcloud compute addresses create xnlb-REGION \
      --region=REGION
    
  2. Obtén la dirección IP reservada para el balanceador de carga externo:

    gcloud compute addresses describe xnlb-REGION \
      --region=REGION --format='value(address)'
    

    Esta dirección IP se usa como variable IP_ADDRESS más adelante en esta guía de configuración.

  3. Crea una comprobación del estado para los proxies de la pasarela:

    gcloud compute health-checks create tcp xnlb-REGION \
      --region=REGION \
      --use-serving-port
    
  4. Crea un servicio de backend para los proxies de la pasarela:

    gcloud compute backend-services create xnlb-REGION \
      --health-checks=xnlb-REGION \
      --health-checks-region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --protocol=TCP \
      --region=REGION \
      --port-name=https
    
  5. Añade el grupo de instancias gestionado como backend:

    gcloud compute backend-services add-backend xnlb-REGION \
      --instance-group=gateway-proxy \
      --instance-group-region=REGION \
      --region=REGION
    
  6. Crea una regla de reenvío para enrutar el tráfico a los proxies de la pasarela:

    gcloud compute forwarding-rules create xnlb-REGION \
      --region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --address=IP_ADDRESS \
      --ip-protocol=TCP \
      --ports=443 \
      --backend-service=xnlb-REGION \
      --backend-service-region=REGION
    

Configurar un grupo de instancias gestionadas que ejecute un servicio HTTPS

Para hacer una demostración, crea un servicio de backend con VMs autoescaladas en un grupo de instancias gestionado. Las VMs devuelven información sobre las solicitudes web mediante el protocolo HTTPS en el puerto 443.

  1. Crea una plantilla de instancia con un servicio HTTPS expuesto en el puerto 443:

    gcloud compute instance-templates create td-https-vm-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=https-td-server \
      --image-family=debian-10 \
      --image-project=debian-cloud \
      --metadata=startup-script='#! /bin/bash
    
    sudo rm -rf /var/lib/apt/lists/*
    sudo apt-get -y clean
    sudo apt-get -y update
    sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    sudo apt-get -y update
    sudo apt-get -y install docker-ce
    sudo which docker
    echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json
    sudo service docker restart
    sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'
    
  2. Crea un grupo de instancias gestionado basado en la plantilla de instancia:

    gcloud compute instance-groups managed create https-td-mig-us-REGION \
      --zone=ZONE \
      --size=2 \
      --template=td-https-vm-template
    
  3. Define el nombre del puerto de servicio del grupo de instancias gestionado:

    gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \
      --named-ports=https:443 \
      --zone=ZONE
    
  4. Crea una comprobación del estado:

    gcloud compute health-checks create https https-helloworld-health-check \
      --port=443
    
  5. Crea una regla de cortafuegos para permitir las conexiones de comprobación del estado entrantes a las instancias de tu red:

    gcloud compute firewall-rules create https-vm-allow-health-checks \
       --network NETWORK_NAME --action allow --direction INGRESS \
       --source-ranges 35.191.0.0/16,130.211.0.0/22 \
       --target-tags https-td-server \
       --rules tcp:443
    
  6. Crea un servicio de backend global con un esquema de balanceo de carga INTERNAL_SELF_MANAGED y añade la comprobación de estado:

    gcloud compute backend-services create https-helloworld-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --port-name=https \
      --health-checks https-helloworld-health-check
    
  7. Añada el grupo de instancias gestionado como backend al servicio de backend:

    gcloud compute backend-services add-backend https-helloworld-service \
      --instance-group=https-td-mig-us-REGION \
      --instance-group-zone=ZONE \
      --global
    

Configurar el enrutamiento con un recurso TLSRoute

En las secciones anteriores, ha configurado un recurso Gateway y un servidor HTTPS. A continuación, conéctalos mediante un recurso TLSRoute que asocie un nombre de host SNI a un servicio de backend.

  1. En un archivo llamado tls_route.yaml, crea la especificación TLSRoute:

    name: helloworld-tls-route
    gateways:
    - projects/PROJECT_NUMBER/locations/global/gateways/gateway443
    rules:
    - matches:
      - sniHost:
        - example.com
        alpn:
        - h2
      action:
       destinations:
       - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/https-helloworld-service
    

    En la instrucción anterior, TLSRoute coincide con example.com como SNI y h2 como ALPN. Si las coincidencias cambian de la siguiente manera, TLSRoute coincide con SNI o ALPN:

    - matches:
      - sniHost:
        - example.com
      - alpn:
        - h2
    
  2. Usa la especificación tls_route.yaml para crear el recurso TLSRoute:

    gcloud network-services tls-routes import helloworld-tls-route \
        --source=tls_route.yaml \
        --location=global
    

Cloud Service Mesh se configura para balancear la carga del tráfico de los servicios especificados en el recurso TLSRoute entre los backends del grupo de instancias gestionado.

Validar la implementación

En esta sección, verificará que puede acceder al servicio desde un cliente externo a través del balanceador de carga de red de pases externo y el recurso Gateway de Cloud Service Mesh.

  1. Ejecuta el siguiente comando curl para verificar la conectividad HTTP con los servicios de prueba que has creado:

    curl https://example.com --resolve example.com:443:IP_ADDRESS -k
    

El comando devuelve una respuesta de una de las VMs del grupo de instancias gestionado. El resultado es el siguiente:

 "path": "/",
  "headers": {
    "host": "example.com",
    "user-agent": "curl/7.81.0",
    "accept": "*/*"
  },
  "method": "GET",
  "body": "",
  "fresh": false,
  "hostname": "example.com",
  "ip": "::ffff:10.142.0.2",
  "ips": [],
  "protocol": "https",
  "query": {},
  "subdomains": [],
  "xhr": false,
  "os": {
    "hostname": "0cd3aec9b351"
  },
  "connection": {
    "servername": "example.com"
  }
}

Verificar con una verificación negativa

También puedes realizar una verificación negativa. Si ejecutas los comandos de esta sección, la solicitud se descartará porque no cumple los criterios de coincidencia de TLSRoute.

En el siguiente comando, el SNI no coincide con example.com, por lo que Gateway rechaza la conexión:

curl https://invalid-server.com --resolve invalid-server.com:443:IP_ADDRESS -k

En el siguiente comando, el ALPN no coincide con h2 (protocolo HTTP2), por lo que Gateway rechaza la conexión:

curl https://example.com --resolve example.com:443:IP_ADDRESS -k --http1.1

En el siguiente comando, el cliente crea una conexión de texto sin formato (sin cifrar), por lo que Gateway rechaza la conexión:

curl example.com:443 --resolve example.com:443:IP_ADDRESS -k

Todos los comandos anteriores devuelven el siguiente error:

curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.

Siguientes pasos

  • Para obtener información sobre cómo enumerar los recursos de ruta asociados a un recurso Mesh o Gateway, consulta Enumerar recursos de Route.