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.
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.
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
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.
Crie uma identidade de conta de serviço para os proxies de gateway:
gcloud iam service-accounts create gateway-proxy
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
Num ficheiro denominado
gateway443.yaml
, crie a especificaçãoGateway
para tráfego HTTP:name: gateway443 scope: gateway-proxy ports: - 443 type: OPEN_MESH
Crie o recurso
Gateway
com a especificaçãogateway443.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.
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
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
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.
Crie um endereço IP regional externo estático:
gcloud compute addresses create xnlb-REGION \ --region=REGION
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.Crie uma verificação de funcionamento para os proxies de gateway:
gcloud compute health-checks create tcp xnlb-REGION \ --region=REGION \ --use-serving-port
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
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
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
.
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'
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
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
Crie uma verificação de funcionamento:
gcloud compute health-checks create https https-helloworld-health-check \ --port=443
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
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
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.
Num ficheiro denominado
tls_route.yaml
, crie a especificaçãoTLSRoute
: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 aexample.com
como SNI eh2
como ALPN. Se as correspondências forem alteradas da seguinte forma,TLSRoute
corresponde ao SNI ou ALPN:- matches: - sniHost: - example.com - alpn: - h2
Use a especificação
tls_route.yaml
para criar o recursoTLSRoute
: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.
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
ouGateway
, consulte o artigo Liste recursosRoute
.