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.
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.
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
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.
Crea una identidad de cuenta de servicio para los proxies de la pasarela:
gcloud iam service-accounts create gateway-proxy
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
En un archivo llamado
gateway443.yaml
, crea la especificaciónGateway
para el tráfico HTTP:name: gateway443 scope: gateway-proxy ports: - 443 type: OPEN_MESH
Crea el recurso
Gateway
con la especificacióngateway443.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.
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
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
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.
Crea una dirección IP regional externa estática:
gcloud compute addresses create xnlb-REGION \ --region=REGION
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.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
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
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
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
.
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'
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
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
Crea una comprobación del estado:
gcloud compute health-checks create https https-helloworld-health-check \ --port=443
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
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
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.
En un archivo llamado
tls_route.yaml
, crea la especificaciónTLSRoute
: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 conexample.com
como SNI yh2
como ALPN. Si las coincidencias cambian de la siguiente manera,TLSRoute
coincide con SNI o ALPN:- matches: - sniHost: - example.com - alpn: - h2
Usa la especificación
tls_route.yaml
para crear el recursoTLSRoute
: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.
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
oGateway
, consulta Enumerar recursos deRoute
.