Com o TLS passthrough, o ingress gateway encaminha o tráfego TLS criptografado diretamente para os serviços de backend sem descriptografá-lo. O serviço de backend termina a sessão TLS em vez do gateway, mantendo-a intacta do cliente ao servidor.
Essa abordagem difere da terminação TLS, em que o gateway descriptografa o tráfego antes de encaminhá-lo:
|
Modo |
Terminação TLS em |
Caso de uso |
|
Terminação TLS |
Ingress gateway |
Proxies sidecar injetados; o tráfego entre o gateway e o sidecar trafega por um túnel mTLS |
|
TLS passthrough |
Serviço de backend |
Proxies sidecar não injetados ou circunstâncias especiais que exigem criptografia de ponta a ponta sem descriptografia intermediária |
Nota: Se houver proxies sidecar injetados, todo o tráfego entre o ingress gateway e esses proxies trafegará por um túnel mutual TLS (mTLS). Nesse caso, configure a terminação TLS no ingress gateway.
O TLS passthrough usa Server Name Indication (SNI) para rotear o tráfego. Os clientes devem oferecer suporte à extensão TLS SNI.
Pré-requisitos
Antes de começar, verifique se você atende aos seguintes requisitos:
Um ingress gateway implantado. Para mais informações, consulte Crie um ingress gateway.
Uma aplicação implantada no cluster associado à instância ASM. Para mais informações, consulte Implantar uma aplicação em um cluster associado ao ASM.
Um nome de domínio com registro ICP (Internet Content Provider). Nas etapas a seguir,
aliyun.comserve como exemplo.kubectl configurado para conectar-se ao cluster que hospeda o ingress gateway.
Etapa 1: Preparar um certificado de servidor e chave privada
Se você já possui um certificado de servidor e uma chave privada para sample.aliyun.com, renomeie-os para sample.aliyun.com.crt e sample.aliyun.com.key e pule para a Etapa 2.
Caso contrário, execute os comandos openssl a seguir para gerar certificados autoassinados para testes.
-
Crie uma autoridade certificadora raiz (CA):
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=mynginx Inc./CN=aliyun.com' \ -keyout aliyun.root.key -out aliyun.root.crt -
Gere um certificado de servidor assinado pela CA raiz:
openssl req -out sample.aliyun.com.csr -newkey rsa:2048 -nodes \ -keyout sample.aliyun.com.key \ -subj "/CN=sample.aliyun.com/O=mynginx sample organization" openssl x509 -req -days 365 \ -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 \ -in sample.aliyun.com.csr -out sample.aliyun.com.crt
Esses comandos geram os seguintes arquivos:
|
Arquivo |
Finalidade |
|
|
Certificado e chave privada da CA raiz |
|
|
Certificado de servidor e chave privada para |
|
|
Solicitação de assinatura de certificado (arquivo intermediário) |
Etapa 2: Implantar um serviço de backend HTTPS
Esta etapa implanta um serviço de backend baseado em NGINX que termina a sessão TLS na porta 443. O ingress gateway repassa o tráfego TLS para esse serviço sem descriptografia.
Crie a configuração do NGINX
Crie um arquivo chamado mynginx.conf com o seguinte conteúdo:
events {
}
http {
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
server {
listen 443 ssl;
server_name www.aliyun.com;
ssl_certificate /etc/nginx-server-certs/tls.crt;
ssl_certificate_key /etc/nginx-server-certs/tls.key;
location / {
return 200 'Welcome to aliyun.com without TLS Termination!';
add_header Content-Type text/plain;
}
}
}
Crie recursos de suporte do Kubernetes
-
Crie um ConfigMap para armazenar a configuração do NGINX:
kubectl create configmap mynginx-configmap --from-file=nginx.conf=./mynginx.conf -
Crie um Secret para armazenar o certificado de servidor e a chave privada:
kubectl create secret tls nginx-server-certs \ --key sample.aliyun.com.key --cert sample.aliyun.com.crt Ative a injeção automática de proxy sidecar para o namespace
default. Para mais informações, consulte Ativar injeção automática de proxy sidecar.
Implantar o serviço NGINX
Crie um arquivo chamado mynginxapp.yaml com o conteúdo abaixo e execute kubectl apply -f mynginxapp.yaml:
Verifique o serviço de backend
Execute o comando a seguir para enviar uma solicitação de teste do proxy sidecar ao servidor NGINX:
kubectl exec -it $(kubectl get pod -l app=mynginxapp -o jsonpath={.items..metadata.name}) \
-c istio-proxy -- curl -v -k --resolve sample.aliyun.com:443:127.0.0.1 https://sample.aliyun.com
Se o servidor NGINX estiver funcionando corretamente, o corpo da resposta conterá:
Welcome to aliyun.com without TLS Termination!
Etapa 3: Crie um Istio gateway com TLS passthrough
Defina um recurso Gateway que escute na porta 443 e encaminhe o tráfego TLS para o backend sem terminação.
Faça login no console do ASM.
No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, localize a instância ASM desejada. Clique em no nome da instância ou em Manage na coluna Actions.
No painel de navegação à esquerda, escolha ASM Gateways > Gateway. Na página exibida, clique em Create from YAML.
-
Selecione o namespace default e cole o YAML a seguir:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-mynginx-customingressgateway spec: selector: istio: ingressgateway # binds to the default ingress gateway servers: - hosts: - 'sample.aliyun.com' port: name: https number: 443 protocol: HTTPS tls: mode: PASSTHROUGH # forward encrypted traffic without termination Clique em Create.
O novo Gateway aparece na página Gateway.
Etapa 4: Crie um virtual service para roteamento TLS
Defina um VirtualService que roteie o tráfego TLS correspondente ao host SNI sample.aliyun.com para o serviço de backend.
Faça login no console do ASM.
No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, localize a instância ASM desejada. Clique em no nome da instância ou em Manage na coluna Actions.
No painel de navegação à esquerda, escolha Traffic Management Center > VirtualService. Na página exibida, clique em Create from YAML.
-
Selecione o namespace default e cole o YAML a seguir:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: istio-mynginx-customvirtualservice spec: hosts: - "sample.aliyun.com" gateways: - istio-mynginx-customingressgateway # reference the Gateway from Step 3 tls: - match: - port: 443 sniHosts: - sample.aliyun.com # route traffic by SNI hostname route: - destination: host: mynginxapp.default.svc.cluster.local # backend service FQDN port: number: 443 Clique em Create.
O novo VirtualService aparece na página VirtualService.
Verifique o resultado
-
Obtenha o endereço IP do ingress gateway por um dos métodos a seguir:
Console do ASM: Consulte a Subetapa 1 da Etapa 3 em Usar recursos do Istio para rotear tráfego para diferentes versões de um serviço.
-
kubectl:
kubectl get svc -n istio-system -l istio=ingressgatewayA coluna
EXTERNAL-IPexibe o endereço IP do gateway.
-
Envie uma solicitação HTTPS pelo ingress gateway. Substitua
<ingress-gateway-ip>pelo endereço IP obtido na etapa anterior:curl -v --cacert aliyun.root.crt \ --resolve sample.aliyun.com:443:<ingress-gateway-ip> \ https://sample.aliyun.comSaída esperada:
Welcome to aliyun.com without TLS Termination!Isso confirma que o tráfego TLS passa pelo ingress gateway até o backend NGINX, o qual termina a sessão TLS e retorna a resposta.
Limpeza
Para remover os recursos criados neste tutorial, execute os comandos a seguir:
kubectl delete gateway istio-mynginx-customingressgateway
kubectl delete virtualservice istio-mynginx-customvirtualservice
kubectl delete service mynginxapp
kubectl delete deployment mynginxapp
kubectl delete secret nginx-server-certs
kubectl delete configmap mynginx-configmap