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
A injeção automática de sidecar está ativada para o namespace. Para mais informações, consulte ative a injeção automática.
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
-
Implante um aplicativo de exemplo.
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.
-
Implante o aplicativo httpbin.
-
crie um arquivo httpbin.yaml com o seguinte conteúdo.
-
Execute o comando a seguir para implantar o aplicativo httpbin.
kubectl apply -f httpbin.yaml
-
-
crie um gateway do ASM.
Acesse o console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha .
-
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.
Clique em Advanced Options, defina External Traffic Policy como Local e, em seguida, clique em Create.
-
crie um Gateway e um VirtualService.
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.
-
crie um recurso Gateway.
-
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: - "*" -
Execute o comando a seguir para criar o recurso Gateway.
kubectl apply -f httpbin-gateway.yaml
-
-
crie um recurso VirtualService.
-
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 -
Execute o comando a seguir para criar o recurso VirtualService.
kubectl apply -f httpbin-virtualservice.yaml
-
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.
No Web Application Firewall, adicione o endereço do gateway de entrada obtido na Etapa 4. Para mais informações, consulte WAF tutorial.
-
Adicione o parâmetro numTrustedProxies ao gateway do ASM.
Acesse o console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância do ASM. No painel de navegação à esquerda, escolha .
Na página Ingress Gateway, localize o gateway de destino e clique em View YAML.
-
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.
-
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=trueSaí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.