Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Obtenha o IP real do cliente a partir de um cabeçalho http

Última atualização: Sep 18, 2026

Para proteger o gateway de entrada do Alibaba Cloud service Mesh (ASM), obtenha o endereço IP real do cliente. Isso permite criar uma política de autorização que usa uma lista de bloqueios ou de permissões de IP para controlar o acesso. Este tópico descreve como configurar o gateway de entrada para extrair o endereço IP real do cliente de um cabeçalho de solicitação http.

Pré-requisitos

Contexto

Normalmente, os aplicativos dependem de um proxy reverso para encaminhar atributos do cliente nas solicitações, como o cabeçalho X-Forwarded-For. No entanto, o Istio pode ser implantado em várias topologias de rede. Nessas topologias, você pode acessar o gateway de entrada diretamente usando o endereço IP público de um Classic Load Balancer (CLB), por meio de um Web Application Firewall (WAF) ou de outras arquiteturas não especificadas. Para oferecer suporte a essas diversas arquiteturas de implantação, o service Mesh ASM não fornece um valor padrão fixo para encaminhar corretamente os atributos do cliente à carga de trabalho de destino. Como resultado, você não pode obter diretamente o endereço IP real do cliente a partir do cabeçalho X-Forwarded-For.

Para resolver esse problema, defina o parâmetro numTrustedProxies no gateway do ASM como o número de proxies confiáveis implantados à frente do proxy do gateway. Essa configuração controla o valor que o gateway de entrada insere no cabeçalho X-Envoy-External-Address. Dessa forma, os serviços upstream podem usar esse valor para acessar o endereço IP original do cliente.

Procedimento

  1. Implante um aplicativo de exemplo.

    1. Conecte-se ao cluster por meio do kubectl. Para mais informações, consulte Obtain the kubeconfig file of a cluster and use kubectl to connect to the cluster.

    2. Implante o aplicativo httpbin.

      1. crie um arquivo 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: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/httpbin:0.1.0
                imagePullPolicy: IfNotPresent
                name: httpbin
                ports:
                - containerPort: 80
                                                
      2. Execute o comando a seguir para implantar o aplicativo httpbin.

        kubectl apply -f httpbin.yaml
  2. crie um gateway do ASM.

    1. Acesse o console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.

    3. Na página Ingress Gateway, clique em Create e configure as configurações básicas do gateway.

      Defina CLB instance type como Internet Access. Configure outros parâmetros conforme necessário. Para mais informações sobre os parâmetros, consulte crie um service de gateway de entrada.

    4. Clique em Advanced Options, defina External Traffic Policy como Local e, em seguida, clique em Create.

  3. crie um Gateway e um VirtualService.

    1. Use o kubectl para gerencie recursos do Istio no plano de controle. Para mais informações, consulte Use kubectl on the control plane to access Istio resources.

    2. crie um recurso Gateway.

      1. Use o conteúdo a seguir para criar o arquivo 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:
            - "*"
      2. Execute o comando a seguir para criar o recurso Gateway.

        kubectl apply -f httpbin-gateway.yaml
    3. crie um recurso VirtualService.

      1. Use o conteúdo a seguir para criar o arquivo 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
      2. Execute o comando a seguir para criar o recurso VirtualService.

        kubectl apply -f httpbin-virtualservice.yaml
  4. Obtenha o endereço IP do gateway de entrada na porta 80 para o aplicativo httpbin. Para mais informações, consulte crie um service de gateway de entrada.

  5. No Web Application Firewall, adicione o endereço do gateway de entrada obtido na Etapa 4. Para mais informações, consulte WAF tutorial.

  6. Adicione o parâmetro numTrustedProxies ao gateway do ASM.

    1. Acesse o console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Ingress Gateway.

    3. Na página Ingress Gateway, localize o gateway de destino e clique em View YAML.

    4. Na caixa de diálogo Edit, abaixo do parâmetro spec, adicione o seguinte conteúdo e clique em OK.

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

      Defina numTrustedProxies como o número de proxies confiáveis implantados à frente do proxy do gateway, com base na sua topologia real. Se você definir numTrustedProxies como um valor N maior que zero, o endereço de cliente confiável será o (N+1)º endereço da direita para a esquerda no cabeçalho X-Forwarded-For.

  7. Execute o comando a seguir para acessar o aplicativo httpbin e recuperar o endereço IP real do cliente.

    curl http://{IP address of the ingress gateway}/get?show_env=true

    Saída esperada:

    {
      "args": {
        "show_env": "true"
      },
      "headers": {
        "Accept": "*/*",
        ....
        "X-Envoy-Attempt-Count": "1",
        "X-Envoy-External-Address": "106.11.**.**",
        ....
      },
      ....
    }

    O valor de X-Envoy-External-Address é o endereço IP real do cliente.