Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Obter o endereço IP real do cliente a partir de cabeçalhos de requisição HTTP

Última atualização: Jun 28, 2026

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 numTrustedProxies**

Apenas CLB

CLB

1

CLB + WAF

CLB, WAF

2

Pré-requisitos

Antes de começar, verifique se você tem:

Etapa 1: Implantar um aplicativo de exemplo

Use o aplicativo HTTPBin para testar a configuração.

  1. Conecte-se ao cluster Container Service for Kubernetes (ACK) com kubectl.

  2. Crie um arquivo chamado httpbin.yaml com o seguinte conteúdo:

    httpbin.yaml

    # httpbin service
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  3. Implante o aplicativo:

    kubectl apply -f httpbin.yaml

Etapa 2: Crie um gateway de entrada

  1. Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. Clique em Create e defina CLB Instance Type como Internet Access. Para outros parâmetros, consulte Criar um gateway de entrada.

  4. 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

  1. Conecte-se à instância ASM com kubectl no plano de controle.

  2. 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:
        - "*"
  3. Aplique o gateway Istio:

    kubectl apply -f httpbin-gateway.yaml
  4. 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
  5. Aplique o serviço virtual:

    kubectl apply -f httpbin-virtualservice.yaml

Etapa 4: Adicionar o endereço IP do gateway de entrada ao WAF

  1. Obtenha o endereço IP do gateway (porta 80) conforme descrito em Criar um gateway de entrada.

  2. Adicione o endereço IP ao WAF. Para mais detalhes, consulte o Tutorial do WAF.

Etapa 5: Configure numTrustedProxies

  1. Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. Localize o gateway de entrada e clique em YAML.

  4. Na caixa de diálogo Edit, adicione o seguinte conteúdo à seção spec e clique em OK:

    podAnnotations:
        proxy.istio.io/config: '{"gatewayTopology" : { "numTrustedProxies": 2 } }'

    Defina o valor de numTrustedProxies para 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.