Configure o encaminhamento de TLS do gateway

Este guia demonstra como configurar um gateway de entrada baseado no proxy Envoy com recursos Gateway e TLSRoute. Também pode anexar um recurso TLSRoute.

A implementação que configurar é ilustrada no diagrama seguinte. Um balanceador de carga de rede de encaminhamento externo regional direciona o tráfego para proxies Envoy que atuam como um gateway de entrada. Os proxies Envoy usam o encaminhamento de passagem de TLS e direcionam o tráfego para servidores HTTPS executados nas instâncias de VMs de back-end.

Passagem direta de TLS com um gateway de entrada
Passagem direta de TLS com um gateway de entrada (clique para aumentar)

Antes de começar

Certifique-se de que conclui as tarefas descritas no artigo Prepare-se para a configuração com o Envoy e cargas de trabalho sem proxy.

Configure regras de firewall

Nesta secção, cria regras de firewall para permitir ligações de verificações de estado de funcionamento recebidas a instâncias de VMs na sua rede.

  1. Crie uma regra de firewall:

    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. Configure regras de firewall para permitir tráfego de qualquer origem. Edite os comandos para as suas portas e intervalos de endereços IP de origem:

    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
    

Configure as autorizações da gestão de identidade e de acesso

Nesta secção, designa a conta de serviço para os proxies de gateway e atribui as funções do IAM corretas à conta de serviço.

  1. Crie uma identidade de conta de serviço para os proxies de gateway:

    gcloud iam service-accounts create gateway-proxy
    
  2. Atribua as funções IAM necessárias à identidade da conta de serviço:

    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"
    

Configure o recurso Gateway

  1. Num ficheiro denominado gateway443.yaml, crie a especificação Gateway para tráfego HTTP:

    name: gateway443
    scope: gateway-proxy
    ports:
    - 443
    type: OPEN_MESH
    
  2. Crie o recurso Gateway com a especificação gateway443.yaml:

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

Crie um grupo de instâncias geridas com proxies Envoy

Nesta secção, cria os proxies do Envoy associados ao gateway de entrada.

  1. Crie um modelo de instância para uma VM que execute um proxy de serviço Envoy implementado automaticamente. Os Envoys têm o âmbito definido como gateway-proxy. Não transmita a porta de publicação como um parâmetro da flag --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. Crie um grupo de instâncias geridas regional a partir do modelo de instância:

    gcloud compute instance-groups managed create gateway-proxy \
      --region=REGION \
      --size=1 \
      --template=gateway-proxy
    
  3. Defina o nome da porta de publicação para o grupo de instâncias geridas:

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

Configure o Network Load Balancer de passagem externo regional

Nesta secção, cria o balanceador de carga de rede de encaminhamento externo.

  1. Crie um endereço IP regional externo estático:

    gcloud compute addresses create xnlb-REGION \
      --region=REGION
    
  2. Obtenha o endereço IP reservado para o balanceador de carga externo:

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

    Este endereço IP é usado como a variável IP_ADDRESS mais tarde neste guia de configuração.

  3. Crie uma verificação de funcionamento para os proxies de gateway:

    gcloud compute health-checks create tcp xnlb-REGION \
      --region=REGION \
      --use-serving-port
    
  4. Crie um serviço de back-end para os proxies de gateway:

    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. Adicione o grupo de instâncias geridas como um back-end:

    gcloud compute backend-services add-backend xnlb-REGION \
      --instance-group=gateway-proxy \
      --instance-group-region=REGION \
      --region=REGION
    
  6. Crie uma regra de encaminhamento para encaminhar o tráfego para os proxies de gateway:

    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
    

Configure um grupo de instâncias geridas que execute um serviço HTTPS

Para fins de demonstração, crie um serviço de back-end com VMs com escalamento automático num grupo de instâncias gerido. As VMs repetem os detalhes sobre os pedidos Web através do protocolo HTTPS na porta 443.

  1. Crie um modelo de instância com um serviço HTTPS exposto na porta 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. Crie um grupo de instâncias geridas com base no modelo de instância:

    gcloud compute instance-groups managed create https-td-mig-us-REGION \
      --zone=ZONE \
      --size=2 \
      --template=td-https-vm-template
    
  3. Defina o nome da porta de publicação para o grupo de instâncias geridas:

    gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \
      --named-ports=https:443 \
      --zone=ZONE
    
  4. Crie uma verificação de funcionamento:

    gcloud compute health-checks create https https-helloworld-health-check \
      --port=443
    
  5. Crie uma regra de firewall para permitir ligações de verificações de estado de funcionamento de entrada a instâncias na sua rede:

    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. Crie um serviço de back-end global com um esquema de balanceamento de carga de INTERNAL_SELF_MANAGED e adicione a verificação 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. Adicione o grupo de instâncias geridas como back-end ao serviço de back-end:

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

Configure o encaminhamento com um recurso TLSRoute

Nas secções anteriores, configurou um recurso Gateway e um servidor HTTPS. Em seguida, associe-os através de um recurso TLSRoute que associa um nome de anfitrião SNI a um serviço de back-end.

  1. Num ficheiro denominado tls_route.yaml, crie a especificação 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
    

    Na instrução anterior, TLSRoute corresponde a example.com como SNI e h2 como ALPN. Se as correspondências forem alteradas da seguinte forma, TLSRoutecorresponde ao SNI ou ALPN:

    - matches:
      - sniHost:
        - example.com
      - alpn:
        - h2
    
  2. Use a especificação tls_route.yaml para criar o recurso TLSRoute:

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

O Cloud Service Mesh está configurado para equilibrar a carga do tráfego para os serviços especificados no recurso TLSRoute nos back-ends no grupo de instâncias gerido.

Valide a implementação

Nesta secção, vai validar se consegue aceder ao serviço a partir de um cliente externo através do Network Load Balancer de passagem externo e do recurso Gateway Cloud Service Mesh.

  1. Execute o seguinte comando curl para validar a conetividade HTTP aos serviços de teste que criou:

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

O comando devolve uma resposta de uma das VMs no grupo de instâncias gerido. O resultado é o seguinte:

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

Faça a validação com uma validação negativa

Também pode executar uma validação negativa. Se executar os comandos nesta secção, o pedido é ignorado porque não corresponde aos critérios de correspondência TLSRoute.

No comando seguinte, o SNI não corresponde a example.com, pelo que o Gateway rejeita a ligação:

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

No comando seguinte, o ALPN não corresponde a h2 (protocolo HTTP2), pelo que o Gateway rejeita a ligação:

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

No comando seguinte, o cliente está a criar uma ligação de texto simples (não encriptada), pelo que o Gateway rejeita a ligação:

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

Todos os comandos anteriores devolvem o seguinte erro:

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

O que se segue?

  • Para informações sobre como listar recursos de trajetos associados a um recurso Mesh ou Gateway, consulte o artigo Liste recursos Route.