Quando as requisições passam por proxies, balanceadores de carga ou nós de CDN antes de chegar ao gateway do ASM, o gateway identifica apenas o endereço IP do último proxy. O cabeçalho X-Forwarded-For (XFF) preserva o IP original do cliente e registra o endereço de cada salto conforme a requisição percorre a cadeia de proxies. Configure o gateway do ASM para extrair o IP correto do cliente desse cabeçalho. Isso fortalece a segurança, otimiza a experiência do usuário e atende a requisitos de conformidade em cenários de marketing, auditoria e antifraude.
O ASM oferece dois métodos de extração: contagem de proxies confiáveis para topologias fixas e exclusão por CIDR confiável para topologias variáveis.
Este recurso exige a versão 1.24.6.83 ou posterior do ASM. Caso sua instância utilize uma versão anterior, atualize sua instância do ASM primeiro.
Funcionamento do XFF
Cada proxy no caminho da requisição adiciona o endereço IP do cliente conectado ao cabeçalho XFF. Ao chegar ao gateway do ASM, o cabeçalho contém uma lista separada por vírgulas:
X-Forwarded-For: <client IP>, <proxy 1 IP>, <proxy 2 IP>, ...
Geralmente, o endereço mais à esquerda corresponde ao IP original do cliente. Para extrair o valor correto, o gateway precisa distinguir os endereços dos clientes dos endereços dos proxies. O ASM oferece duas abordagens:
|
Abordagem |
Indicada quando |
Chave de configuração |
|
Contagem de proxies confiáveis |
Todas as requisições passam pelo mesmo número de proxies (topologia fixa) |
|
|
Exclusão por CIDR confiável |
Diferentes clientes passam por quantidades distintas de proxies (topologia variável) |
|
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM executando a versão 1.24.6.83 ou posterior
kubectl configurado com o kubeconfig do ASM e conectividade com o plano de controle do ASM
Conhecimento sobre a topologia da cadeia de proxies entre seus clientes e o gateway do ASM
Configurar a contagem de proxies confiáveis (topologia fixa)
Use este método quando todas as requisições passarem pelo mesmo número de proxies antes de alcançar o gateway do ASM.
Como funciona a contagem
O gateway conta retroativamente a partir da extremidade direita da lista XFF, avança numTrustedProxies posições e considera o próximo endereço como o IP do cliente.
Exemplo: Existem três proxies entre o cliente e o gateway. Defina numTrustedProxies como 2 (total de proxies menos 1).
XFF before gateway processing: [1.1.1.1, 2.2.2.2, 3.3.3.3]
^ client ^ proxy 1 ^ proxy 2
numTrustedProxies: 2 -> skip 2 from the right -> client IP = 1.1.1.1
Etapas
-
Edite o resource do gateway do ASM:
kubectl -n istio-system edit istiogateway <gateway-name> -
Adicione a anotação
numTrustedProxiesà especificação do pod do gateway. Substitua<proxy-count-minus-1>pelo número total de proxies na cadeia menos 1. Para três proxies, defina este valor como2.AvisoEssa alteração aciona uma reinicialização gradual dos pods do gateway. Aplique-a fora dos horários de pico.
spec: podAnnotations: proxy.istio.io/config: | gatewayTopology: numTrustedProxies: <proxy-count-minus-1> Salve o arquivo. Os pods do gateway reiniciam automaticamente e aplicam a nova configuração.
Comportamento em casos extremos
|
Cenário |
Entrada XFF |
** |
IP do cliente extraído |
Explicação |
|
Normal (3 proxies) |
|
|
|
Ignora 2 da direita e usa o próximo |
|
Valor igual ao tamanho do XFF |
|
|
|
Usa o endereço mais à direita como fallback |
|
Valor excede o tamanho do XFF |
|
|
|
Usa o endereço mais à direita como fallback |
Mantenha numTrustedProxies menor que o número de entradas no cabeçalho XFF. Se o valor for maior ou igual à quantidade de entradas, o gateway usará o endereço mais à direita (último), que é um IP de proxy, e não o IP do cliente.
Comportamento do log de acesso
O gateway anexa o IP do proxy downstream ao cabeçalho XFF após extrair o IP do cliente. No exemplo de três proxies, o log de acesso mostra uma entrada adicional (4.4.4.4, o IP do último proxy conectado ao gateway). Essa entrada extra não afeta a extração do IP do cliente.
Configurar exclusão por CIDR confiável (topologia variável)
Use este método quando diferentes clientes chegarem ao gateway passando por quantidades variadas de proxies.
Funcionamento da exclusão por CIDR
Em vez de contar saltos, o gateway varre a lista XFF da direita para a esquerda e ignora qualquer endereço que corresponda a um bloco CIDR confiável. O primeiro endereço que não corresponder será tratado como o IP do cliente.
Exemplo: O Cliente1 conecta-se via Proxy1 e Proxy3, enquanto o Cliente2 conecta-se via Proxy2, Proxy3 e Proxy4. Uma contagem fixa de saltos não consegue lidar com ambos os caminhos. Adicione todos os IPs dos proxies à lista de CIDRs confiáveis para que o gateway os ignore e encontre o IP correto do cliente, independentemente do tamanho do caminho.
Etapas
-
Edite o resource do gateway do ASM:
kubectl -n istio-system edit istiogateway <gateway-name> -
Adicione a anotação
xffTrustedCidrsà especificação do pod do gateway com todos os endereços de proxy conhecidos. Substitua os CIDRs de exemplo pelos endereços IP ou intervalos CIDR reais dos proxies à frente do seu gateway.AvisoEssa alteração aciona uma reinicialização gradual dos pods do gateway. Aplique-a fora dos horários de pico.
NotaSomente a notação CIDR é compatível. Endereços IP individuais devem usar o sufixo
/32.spec: podAnnotations: proxy.istio.io/config: | gatewayTopology: xffTrustedCidrs: - 2.2.2.2/32 - 3.3.3.3/32 - 4.4.4.4/32 - 5.5.5.5/32 Salve o arquivo. Os pods do gateway reiniciam automaticamente e aplicam a nova configuração.
Referência de parâmetros
|
Parâmetro |
Tipo |
Descrição |
Restrições |
|
|
Inteiro |
Número de saltos de proxies confiáveis a ignorar a partir da extremidade direita da lista XFF. |
Deve ser menor que o número de entradas XFF. Use apenas para implantações de topologia fixa. |
|
|
Lista de strings CIDR |
Endereços IP ou intervalos de proxy a excluir ao varrer a lista XFF da direita para a esquerda. |
Use notação CIDR. IPs únicos exigem o sufixo |
Defina ambos os parâmetros em gatewayTopology na anotação de pod proxy.istio.io/config do resource do gateway do ASM (istiogateway).