Configura il routing TLS del gateway

Questa guida illustra come configurare un gateway in entrata basato su proxy Envoy con risorse Gateway e TLSRoute. Puoi anche collegare una risorsa TLSRoute.

Il deployment che configuri è illustrato nel seguente diagramma. Un bilanciatore del carico di rete passthrough esterno regionale indirizza il traffico ai proxy Envoy che fungono da gateway in entrata. I proxy Envoy utilizzano il routing passthrough TLS e indirizzano il traffico ai server HTTPS in esecuzione sulle istanze VM di backend.

Passthrough TLS con un gateway in entrata
Passthrough TLS con un gateway in entrata (fai clic per ingrandire)

Prima di iniziare

Assicurati di completare le attività descritte in Prepararsi alla configurazione con Envoy e carichi di lavoro senza proxy.

Configura le regole firewall

In questa sezione creerai le regole firewall per consentire le connessioni in entrata del controllo di integrità alle istanze VM nella tua rete.

  1. Crea una regola 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. Configura le regole del firewall per consentire il traffico da qualsiasi origine. Modifica i comandi per le porte e gli intervalli di indirizzi IP di origine:

    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
    

Configurazione delle autorizzazioni per Identity and Access Management

In questa sezione, definirai l'account di servizio per i proxy gateway e assegni i ruoli IAM corretti all'account di servizio.

  1. Crea un'identità dell'account di servizio per i proxy gateway:

    gcloud iam service-accounts create gateway-proxy
    
  2. Assegna i ruoli IAM richiesti all'identità dell'account di servizio:

    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"
    

Configurazione della risorsa Gateway

  1. In un file denominato gateway443.yaml, crea la specifica Gateway per il traffico HTTP:

    name: gateway443
    scope: gateway-proxy
    ports:
    - 443
    type: OPEN_MESH
    
  2. Crea la risorsa Gateway usando la specifica gateway443.yaml:

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

Creazione di un gruppo di istanze gestite con proxy Envoy

In questa sezione creerai i proxy Envoy associati al gateway in entrata.

  1. Creare un modello di istanza per una VM che esegue un proxy di servizio Envoy automaticamente distribuito. L'ambito degli Envoy è impostato su gateway-proxy. Non passare la porta di servizio come parametro del 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. Crea un gruppo di istanze gestite a livello di regione dal modello di istanza:

    gcloud compute instance-groups managed create gateway-proxy \
      --region=REGION \
      --size=1 \
      --template=gateway-proxy
    
  3. Imposta il nome della porta di gestione per il gruppo di istanze gestite:

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

Configura il bilanciatore del carico di rete passthrough esterno regionale

In questa sezione creerai il bilanciatore del carico di rete passthrough esterno.

  1. Crea un indirizzo IP esterno statico a livello di regione:

    gcloud compute addresses create xnlb-REGION \
      --region=REGION
    
  2. Ottieni l'indirizzo IP riservato per il bilanciatore del carico esterno:

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

    Questo indirizzo IP viene utilizzato come variabile IP_ADDRESS più avanti in questa guida alla configurazione.

  3. Crea un controllo di integrità per i proxy gateway:

    gcloud compute health-checks create tcp xnlb-REGION \
      --region=REGION \
      --use-serving-port
    
  4. Crea un servizio di backend per i proxy 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. Aggiungi il gruppo di istanze gestite come backend:

    gcloud compute backend-services add-backend xnlb-REGION \
      --instance-group=gateway-proxy \
      --instance-group-region=REGION \
      --region=REGION
    
  6. Crea una regola di forwarding per instradare il traffico ai proxy 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
    

Configura un gruppo di istanze gestite che esegue un servizio HTTPS

A scopo dimostrativo, crea un servizio di backend con VM con scalabilità automatica in un gruppo di istanze gestite. Le VM eseguono il controllo dei dettagli delle richieste web utilizzando il protocollo HTTPS sulla porta 443.

  1. Crea un modello di istanza con un servizio HTTPS esposto sulla 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. Crea un gruppo di istanze gestite basato sul modello di istanza:

    gcloud compute instance-groups managed create https-td-mig-us-REGION \
      --zone=ZONE \
      --size=2 \
      --template=td-https-vm-template
    
  3. Imposta il nome della porta di gestione per il gruppo di istanze gestite:

    gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \
      --named-ports=https:443 \
      --zone=ZONE
    
  4. Crea un controllo di integrità:

    gcloud compute health-checks create https https-helloworld-health-check \
      --port=443
    
  5. Crea una regola firewall per consentire le connessioni del controllo di integrità in entrata alle istanze nella tua rete:

    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 servizio di backend globale con uno schema di bilanciamento del carico di INTERNAL_SELF_MANAGED e aggiungi il controllo di integrità:

    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. Aggiungi il gruppo di istanze gestite come backend del servizio di backend:

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

Configura il routing con una risorsa TLSRoute

Nelle sezioni precedenti hai configurato una risorsa Gateway e un server HTTPS. Successivamente, connettili utilizzando una risorsa TLSRoute che associa un nome host SNI a un servizio di backend.

  1. In un file denominato tls_route.yaml, crea la specifica 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
    

    Nell'istruzione precedente, TLSRoute corrisponde a example.com come SNI e h2 come ALPN. Se le corrispondenze vengono modificate come segue, TLSRoute corrisponde a SNI o ALPN:

    - matches:
      - sniHost:
        - example.com
      - alpn:
        - h2
    
  2. Usa la specifica tls_route.yaml per creare la risorsa TLSRoute:

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

Cloud Service Mesh è configurato per bilanciare il carico del traffico per i servizi specificati nella risorsa TLSRoute tra i backend nel gruppo di istanze gestite.

Convalida il deployment

In questa sezione verificherai di poter accedere al servizio da un client esterno tramite il bilanciatore del carico di rete passthrough esterno e la risorsa Gateway Cloud Service Mesh.

  1. Esegui questo comando curl per verificare la connettività HTTP ai servizi di test che hai creato:

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

Il comando restituisce una risposta da una delle VM nel gruppo di istanze gestite. L'output è il seguente:

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

Esegui la verifica con una verifica negativa

Puoi anche eseguire una verifica negativa. Se esegui i comandi in questa sezione, la richiesta viene eliminata perché non corrisponde ai criteri di corrispondenza di TLSRoute.

Nel comando seguente, l'SNI non corrisponde a example.com, quindi Gateway rifiuta la connessione:

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

Nel seguente comando, l'ALPN non corrisponde a h2 (protocollo HTTP2), pertanto Gateway rifiuta la connessione:

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

Nel comando seguente, il client sta creando una connessione in testo normale (non criptato), quindi Gateway la rifiuta:

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

Tutti i comandi precedenti restituiscono il seguente errore:

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

Passaggi successivi

  • Per informazioni su come elencare le risorse di route associate a una risorsa Mesh o Gateway, consulta Elencare le risorse di Route. Questa funzionalità è in anteprima.