Obtenha o endereço IP do cliente no cabeçalho HTTP X-Forwarded-For ao usar um listener de Camada 7 do CLB.
Como funciona
Os listeners de Camada 7 do CLB (HTTP/HTTPS) preservam o endereço IP do cliente no cabeçalho HTTP X-Forwarded-For. Os servidores de backend podem recuperar esse IP após a configuração.
O campo X-Forwarded-For tem o seguinte formato:
X-Forwarded-For: <client IP address, proxy-server-1-IP, proxy-server-2-IP, ...>
Nesse método, o endereço IP mais à esquerda na lista corresponde ao IP do cliente.
O CLB encerra a conexão HTTPS e se comunica com os servidores de backend via HTTP. Configure os servidores de backend apenas para HTTP, mesmo ao usar um listener HTTPS.
Procedimento
Pré-requisitos
Você criou uma instância de CLB com um listener de Camada 7. Este tópico usa um listener HTTP na porta 80. Crie e gerencie instâncias de CLB. Add an HTTP listener.
Você adicionou um grupo de servidores com servidores de backend à instância de CLB. Este tópico usa um grupo vServer com protocolo HTTP, instâncias ECS e porta 80. Crie e gerencie grupos vServer.
Etapa 1: Verificar se o listener usa X-Forwarded-For
Faça login no console do Classic Load Balancer (CLB).
Na barra de navegação superior, selecione a região onde a instância está implantada.
Na página Instances, localize a instância desejada e clique em seu ID.
Na página Instance Details, clique na aba Listener, encontre o listener de Camada 7 desejado e clique em seu ID.
-
Na página de detalhes do listener, verifique se a seção Custom HTTP Header inclui X-Forwarded-For: Retrieve Client IP.
Por padrão, os listeners de Camada 7 do CLB usam o cabeçalho X-Forwarded-For para obter o endereço IP do cliente. Não é possível desativar esse recurso.
Etapa 2: Configurar os servidores de backend
Esta seção descreve como registrar o endereço IP do cliente nos logs de acesso do servidor de backend (por meio do campo
X-Forwarded-For). As variáveis da camada de conexão (como$remote_addrdo Nginx) continuam exibindo o IP de encaminhamento do CLB e não são afetadas.Para substituir a variável da camada de conexão (como
$remote_addr) pelo IP real do cliente e permitir que formatos de log existentes, controles de acesso e regras de limitação de taxa funcionem sem modificações, consulte Replace connection-layer addresses with client IPs (Nginx and Apache).
Servidor Nginx
Ambiente de exemplo: CentOS 7.9 com Nginx 1.20.1. Sua configuração pode ser diferente.
-
Execute
nginx -V | grep http_realip_modulepara verificar se o http_realip_module está instalado. O Nginx usa esse módulo para analisar registros X-Forwarded-For.Se a saída incluir
--with-http_realip_module, o módulo está instalado. Prossiga para a próxima etapa.O http_realip_module está disponível desde o Nginx 1.0.4 (2011). Se você usa uma versão anterior, faça backup da sua configuração e atualize o Nginx.
Caso o http_realip_module não esteja instalado, recompile o Nginx com o módulo ou reinstale-o usando um gerenciador de pacotes como yum.
-
Edite o arquivo de configuração do Nginx. Execute
nginx -tpara localizar o caminho do arquivo. O padrão é/etc/nginx/nginx.conf.http { # Make sure that the log_format includes $http_x_forwarded_for. This variable records the value of X-Forwarded-For. log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ... } Execute o comando
sudo nginx -s reloadpara recarregar a configuração do Nginx.
Servidor Apache
Ambiente de exemplo: CentOS 7.9 com Apache 2.4.6. Sua configuração pode ser diferente.
-
Execute
httpd -M | grep remoteip_modulepara verificar se o remoteip_module está instalado. O Apache usa esse módulo para analisar registros X-Forwarded-For.Se a saída incluir
remoteip_module (shared), o módulo está instalado. Prossiga para a próxima etapa.O remoteip_module está disponível desde o Apache 2.4.0 (2012). Se você usa uma versão anterior, faça backup da sua configuração e atualize o Apache.
Caso o remoteip_module não esteja instalado, recompile o Apache com o módulo ou reinstale-o usando um gerenciador de pacotes como yum.
-
Edite o arquivo de configuração do Apache. O caminho padrão é
/etc/httpd/conf/httpd.conf.# ... <IfModule log_config_module> # Add %{X-Forwarded-For}i to record X-Forwarded-For information. LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common #... </IfModule> # ... Execute o comando
sudo systemctl restart httpdpara reiniciar o service do Apache.
Servidor IIS
Ambiente de exemplo: Windows Server 2016. Sua configuração pode ser diferente.
Baixe e descompacte o arquivo F5XForwardedFor.
De acordo com a arquitetura do seu sistema operacional, copie
F5XFFHttpModule.dlleF5XFFHttpModule.inido diretóriox86\oux64\para um local com permissões de leitura do IIS.No Server Manager, abra o IIS Manager.
-
Selecione o servidor e clique duas vezes em Modules.

-
Clique em Configure Native Modules e, em seguida, clique em Register.

-
Adicione o arquivo .dll baixado.
Insira o nome do arquivo, selecione o caminho e clique em OK.

O sistema seleciona automaticamente o módulo recém-registrado. Clique em OK.

-
Retorne à home do servidor e clique duas vezes no módulo Logging. Configure o formato de log para registrar o campo
X-Forwarded-For.-
Clique em Select Fields.

-
No canto inferior esquerdo, clique em Add Field, adicione o campo de log e clique em OK.

No canto superior direito, clique em Apply para salvar as alterações.
-
Reinicie o servidor IIS para que a configuração entre em vigor.
Etapa 3: Verificar a obtenção do IP do cliente
Siga as etapas correspondentes ao seu tipo de servidor.
Servidor Nginx
Verifique o log de acesso do Nginx para confirmar a obtenção do IP do cliente.
O caminho padrão para o log de acesso do Nginx é /var/log/nginx/access.log.
O IP mais à esquerda no campo $http_x_forwarded_for é o endereço IP do cliente.

Servidor Apache
Verifique o log de acesso do Apache para confirmar a obtenção do IP do cliente.
O caminho padrão para o log de acesso do Apache é /var/log/httpd/access_log.
O IP mais à esquerda no campo %{X-Forwarded-For}i é o endereço IP do cliente.

Servidor IIS
Verifique o log do IIS para confirmar a obtenção do IP do cliente.
Localize o caminho do arquivo de log no módulo Logging.

O IP mais à esquerda no campo X-Forwarded-For é o endereço IP do cliente.

Perguntas frequentes
Acesso frequente de IPs iniciados com 100
O sistema CLB encaminha solicitações externas para instâncias ECS de backend e realiza verificações de integridade. Ambos os tipos de solicitação têm origem no próprio sistema.
O sistema CLB usa o bloco CIDR reservado 100.64.0.0/10. Esse bloco é exclusivo da Alibaba Cloud e não representa riscos de segurança, mas explica o acesso frequente de IPs iniciados com 100.
Certifique-se de que o iptables e outros softwares de segurança em seus servidores não bloqueiem esse bloco CIDR.
Obtenção de IPs de cliente com WAF, CDN e GA
Se o tráfego passar por WAF, CDN ou Global Accelerator (GA) antes de chegar ao CLB, você ainda poderá usar o X-Forwarded-For para obter o IP do cliente. Esses serviços repassam o X-Forwarded-For por padrão, sem necessidade de configuração adicional.
Para evitar falsificação do X-Forwarded-For, use um cabeçalho personalizado para registrar o IP do cliente. Por exemplo, em uma arquitetura cliente > CDN > WAF > CLB > ECS, o CDN pode repassar o cabeçalho Ali-Cdn-Real-Ip. No WAF, selecione Specify header field como método de determinação do IP do cliente e defina o cabeçalho como Ali-Cdn-Real-Ip. Defina a variável de log do Nginx como $http_Ali_Cdn_Real_Ip.
Medidas adicionais de segurança:
Valide e filtre o cabeçalho XFF nos servidores de backend. Verifique o formato e os endereços IP e rejeite valores inválidos ou suspeitos.
Use firewalls e ACLs entre o CLB e os servidores de backend para filtrar solicitações maliciosas direcionadas ao cabeçalho XFF.
Use criptografia SSL/TLS para proteger as comunicações, incluindo a transmissão do cabeçalho XFF, contra ataques man-in-the-middle.
Obtenção de IPs de cliente em um ambiente ACK
Em um cluster do Container Service for Kubernetes (ACK), o método é o mesmo, mas alguns detalhes operacionais diferem. Network management FAQ.
Listener de Camada 4 vs Camada 7: comportamento do IP de source
Quando uma solicitação de cliente passa pelo CLB, o IP de source visível para os servidores de backend depende do tipo de listener:
|
Tipo de listener |
Tratamento do IP de source |
remote_addr visto pelo servidor de backend |
|
Camada 4 (TCP/UDP) |
O CLB repassa diretamente o IP de source do cliente |
Endereço IP de source do cliente |
|
Camada 7 (HTTP/HTTPS) |
O CLB atua como proxy reverso e estabelece uma nova conexão TCP com o servidor de backend |
IP de encaminhamento interno do CLB (faixa 100.64.0.0/10) |
Com listeners de Camada 7, o CLB adiciona automaticamente o cabeçalho de solicitação HTTP X-Forwarded-For para transportar o endereço IP de source do cliente. Se $remote_addr no seu log de acesso do Nginx exibir um IP de encaminhamento interno do CLB na faixa 100.64.0.0/10 em vez do IP do cliente, trata-se de um comportamento esperado.
Substituir endereços da camada de conexão por IPs de cliente (Nginx e Apache)
Nginx
Por padrão, $remote_addr nos logs do Nginx registra o IP de encaminhamento interno do CLB (faixa 100.64.0.0/10). Para substituí-lo pelo IP real do cliente e permitir que formatos de log existentes, controles de acesso e regras de limitação de taxa funcionem sem modificações, use o módulo ngx_http_realip_module:
Execute
nginx -V | grep http_realip_modulepara verificar se o módulo está instalado.-
Adicione o seguinte ao bloco
httpno arquivo de configuração (padrão:/etc/nginx/nginx.conf):set_real_ip_from 100.64.0.0/10; real_ip_header X-Forwarded-For; real_ip_recursive on; Execute
sudo nginx -tpara validar a configuração e, em seguida, executesudo nginx -s reloadpara recarregá-la.
Após a configuração entrar em vigor, verifique o log de acesso (padrão:/var/log/nginx/access.log) para confirmar que$remote_addragora exibe o IP real do cliente.
Se o tráfego passar por múltiplos proxies, como WAF ou CDN, adicione as faixas de IP de source de cada camada de proxy a set_real_ip_from .
As solicitações de verificação de integridade (HEAD, semX-Forwarded-For) continuarão exibindo$remote_addrcomo100.64.0.0/10, o que é esperado.
Apache
Por padrão, %h nos logs do Apache registra o IP de encaminhamento interno do CLB. Para substituí-lo pelo IP real do cliente e permitir que formatos de log existentes e regras de controle de acesso Require ip funcionem sem modificações, use o módulo integrado mod_remoteip do Apache 2.4:
Execute
httpd -M | grep remoteip_modulepara verificar se o módulo está instalado.-
Adicione o seguinte ao arquivo de configuração (padrão:
/etc/httpd/conf/httpd.conf):RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 100.64.0.0/10 Execute
sudo systemctl restart httpdpara reiniciar o service do Apache.
Após a configuração entrar em vigor, verifique o log de acesso (padrão:/var/log/httpd/access_log) para confirmar que%hagora exibe o IP real do cliente.
Se o tráfego passar por múltiplos proxies, como WAF ou CDN, adicione as faixas de IP de source de cada camada de proxy a RemoteIPTrustedProxy .
As solicitações de verificação de integridade (HEAD, semX-Forwarded-For) continuarão exibindo%hcomo100.64.0.0/10, o que é esperado.
Documentos relacionados
Outros tipos de balanceador de carga usam métodos diferentes:
Application Load Balancer (ALB): usa X-Forwarded-For. Retrieve client IP addresses by using an ALB.
Network Load Balancer (NLB): usa grupos de servidores ou protocolo Proxy. Retrieve client IP addresses by using an NLB.
Listener de Camada 4 do CLB: obtém diretamente ou usa protocolo Proxy. Retrieve client IP addresses by using a CLB Layer 4 listener.