Quando as requisições passam por proxies reversos, como Classic Load Balancer (CLB) e Web Application Firewall (WAF), antes de chegar ao gateway de entrada do Alibaba Cloud Service Mesh (ASM), cada proxy adiciona seu próprio endereço ao cabeçalho X-Forwarded-For (XFF). Isso torna o IP original do cliente inacessível diretamente. Defina o parâmetro numTrustedProxies no gateway de entrada para que ele extraia o IP real do cliente e o encaminhe aos serviços de backend no cabeçalho X-Envoy-External-Address. Em seguida, use esse IP para aplicar controle de acesso baseado em endereços, criando uma política de autorização que negue ou permita requisições por meio de uma lista de bloqueios ou de permissões de IPs.
Como funciona
Cada proxy reverso no caminho da requisição acrescenta o endereço IP downstream ao cabeçalho XFF. Quando a requisição chega ao gateway de entrada, o cabeçalho XFF contém uma cadeia de endereços IP — um para cada salto.
O parâmetro numTrustedProxies informa ao gateway de entrada quantos proxies à sua frente são confiáveis. O gateway extrai o IP real do cliente contando de trás para frente a partir do final da cadeia XFF: ele seleciona o endereço na posição (N+1) da direita para a esquerda, onde N é o valor de numTrustedProxies.
Exemplo: CLB + WAF à frente do gateway de entrada
Um cliente com o IP 203.0.113.50 envia uma requisição que passa por um CLB (10.0.0.1) e pelo WAF (10.0.0.2) antes de alcançar o gateway de entrada. O cabeçalho XFF chega da seguinte forma:
X-Forwarded-For: 203.0.113.50, 10.0.0.1, 10.0.0.2
Com numTrustedProxies: 2 (CLB + WAF), o gateway conta 2+1 posições da direita para a esquerda e seleciona 203.0.113.50. Em seguida, define:
X-Envoy-External-Address: 203.0.113.50
Os serviços de backend leem o IP real do cliente no cabeçalho X-Envoy-External-Address.
Exemplo: Apenas CLB (sem WAF)
Se houver apenas um CLB à frente do gateway, o cabeçalho XFF chegará assim:
X-Forwarded-For: 203.0.113.50, 10.0.0.1
Defina numTrustedProxies: 1. O gateway selecionará o endereço na posição (1+1) = 2º da direita para a esquerda: 203.0.113.50.
Topologias comuns
|
Topologia de rede |
Proxies antes do gateway |
**Valor de |
|
Apenas CLB |
CLB |
1 |
|
CLB + WAF |
CLB, WAF |
2 |
Pré-requisitos
Antes de começar, verifique se você tem:
A injeção automática de proxy sidecar ativada para o namespace de destino
Etapa 1: Implantar um aplicativo de exemplo
Use o aplicativo HTTPBin para testar a configuração.
Conecte-se ao cluster Container Service for Kubernetes (ACK) com kubectl.
-
Crie um arquivo chamado
httpbin.yamlcom o seguinte conteúdo: -
Implante o aplicativo:
kubectl apply -f httpbin.yaml
Etapa 2: Crie um gateway de entrada
Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em no nome da sua instância ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.
Clique em Create e defina CLB Instance Type como Internet Access. Para outros parâmetros, consulte Criar um gateway de entrada.
Clique em Advanced Options, defina External Traffic Policy como Local e clique em Create.
Etapa 3: Crie um gateway Istio e um serviço virtual
Conecte-se à instância ASM com kubectl no plano de controle.
-
Crie um arquivo chamado
httpbin-gateway.yaml:apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" -
Aplique o gateway Istio:
kubectl apply -f httpbin-gateway.yaml -
Crie um arquivo chamado
httpbin-virtualservice.yaml:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: httpbin spec: hosts: - "*" gateways: - httpbin-gateway http: - route: - destination: host: httpbin port: number: 8000 -
Aplique o serviço virtual:
kubectl apply -f httpbin-virtualservice.yaml
Etapa 4: Adicionar o endereço IP do gateway de entrada ao WAF
Obtenha o endereço IP do gateway (porta 80) conforme descrito em Criar um gateway de entrada.
Adicione o endereço IP ao WAF. Para mais detalhes, consulte o Tutorial do WAF.
Etapa 5: Configure numTrustedProxies
Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em no nome da sua instância ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.
Localize o gateway de entrada e clique em YAML.
-
Na caixa de diálogo Edit, adicione o seguinte conteúdo à seção
spece clique em OK:podAnnotations: proxy.istio.io/config: '{"gatewayTopology" : { "numTrustedProxies": 2 } }'Defina o valor de
numTrustedProxiespara corresponder ao número de proxies confiáveis implantados à frente do gateway de entrada. Consulte a tabela de Topologias comuns para obter orientação.
Etapa 6: Verifique a configuração
Envie uma requisição ao aplicativo HTTPBin pelo gateway de entrada:
curl http://<ingress-gateway-ip>/get?show_env=true
Substitua <ingress-gateway-ip> pelo endereço IP público do seu gateway de entrada.
Saída esperada:
{
"args": {
"show_env": "true"
},
"headers": {
"Accept": "*/*",
...
"X-Envoy-Attempt-Count": "1",
"X-Envoy-External-Address": "106.11.**.**",
...
},
...
}
O cabeçalho X-Envoy-External-Address contém o endereço IP real do cliente. Se o valor corresponder ao IP esperado do cliente, a configuração está correta.