Ao usar a integração CNAME com o Web Application Firewall (WAF), o endereço IP de origem das requisições recebidas pelo servidor de origem corresponde ao IP do proxy do último salto, e não ao IP real do cliente. O WAF adiciona o cabeçalho de requisição HTTP X-Forwarded-For para transmitir o IP real do cliente ao servidor. Este tópico descreve como configurar os servidores web de backend para extrair o IP do cliente desse cabeçalho, garantindo o funcionamento correto dos logs e das auditorias de segurança.
Como funciona
Após conectar o domínio ao WAF usando acesso CNAME, as requisições dos clientes passam primeiro pelo WAF e, possivelmente, por outros proxies intermediários (como CDN ou Anti-DDoS Pro) antes de chegar ao servidor de origem. Nesse ponto, o endereço IP de origem da conexão TCP recebida pelo servidor de origem é o endereço IP do proxy do último salto, e não o endereço IP real do cliente.
Quando o WAF encaminha requisições HTTP, ele adiciona automaticamente o campo de cabeçalho X-Forwarded-For. O valor inicial desse campo é o endereço IP do cliente. Cada vez que a requisição passa por um nó de proxy, o endereço IP desse nó é anexado ao final do campo no seguinte formato:
X-Forwarded-For: client IP, proxy 1 IP, proxy 2 IP, …
Portanto, configure o servidor web de backend para extrair o endereço IP mais à esquerda do cabeçalho X-Forwarded-For, pois este corresponde ao endereço IP original do cliente. As seções a seguir descrevem os métodos de configuração para diferentes plataformas.
Etapa 1: Obter os intervalos de IP de back-to-origin do WAF
Faça login no console do Web Application Firewall. Na barra de navegação superior, selecione o grupo de recursos e a região da sua instância do WAF (Chinese Mainland ou Outside Chinese Mainland). Em seguida, clique em e anote todos os intervalos de IP de back-to-origin do WAF para uso na configuração posterior.
Etapa 2: Configurar o servidor de origem
Antes de configurar o servidor de origem, faça backup do ambiente criando snapshots do ECS ou copiando os arquivos de configuração para evitar perda de dados.
Configurar o Nginx
O Nginx utiliza o módulo http_realip_module para analisar o X-Forwarded-For. Siga as etapas abaixo para modificar a configuração do Nginx.
Verificar se o http_realip_module está instalado
Acesse o servidor e execute o seguinte comando:
nginx -V 2>&1 | grep -o with-http_realip_module
Se a saída contiver
with-http_realip_module, o módulo já está instalado. Pule para Configure Nginx to trust WAF back-to-origin IP ranges.Caso nenhum resultado seja retornado, a versão atual do Nginx não possui esse módulo compilado. Prossiga para Add the realip module.
Versões instaladas via yum install nginx ou apt install nginx geralmente incluem este módulo. Versões compiladas personalizadas ou imagens mínimas de contêiner podem não incluí-lo.
Adicionar o módulo realip (apenas se estiver ausente)
Método 1: Reinstalar usando o gerenciador de pacotes do sistema
# For Alibaba Cloud Linux / CentOS / RHEL
sudo yum reinstall nginx -y
# For Ubuntu / Debian
sudo apt install --reinstall nginx-core nginx-full
Método 2: Compilar a partir do código-fonte
-
Instale as dependências.
# For Alibaba Cloud Linux / CentOS / RHEL sudo yum install -y gcc pcre-devel zlib-devel openssl-devel # For Ubuntu / Debian sudo apt update sudo apt install -y build-essential libpcre3-dev zlib1g-dev libssl-dev -
Verifique a versão do Nginx instalada.
# Check the version to download the matching source code. nginx -v # Check the current configure arguments. nginx -V 2>&1 | grep 'configure arguments' | sed 's/configure arguments: //'Anote a saída, por exemplo,
--prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module. -
Baixe o código-fonte do Nginx correspondente à versão identificada. Substitua o número da versão pelo valor real.
cd /tmp wget http://nginx.org/download/nginx-1.26.0.tar.gz tar zxvf nginx-1.26.0.tar.gz cd nginx-1.26.0 -
Configure os argumentos de compilação. Copie os argumentos originais da Etapa 2 e adicione
--with-http_realip_moduleao final../configure \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module -
Compile e atualize o service.
make # The make command creates a new nginx binary in the objs/ directory. # Back up the old binary. sudo mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old # Replace the old binary with the new one. sudo cp objs/nginx /usr/local/nginx/sbin/nginx # Get the PID of the old master process. OLD_PID=$(pgrep -f 'nginx: master' | head -1) # Start the new master process. sudo kill -USR2 $OLD_PID # Wait for the new process to start. sleep 2 # Gracefully shut down the old worker processes. sudo kill -QUIT $OLD_PID
Configurar o Nginx para confiar nos intervalos de IP de back-to-origin do WAF
-
Edite o arquivo de configuração principal
nginx.conf(localização padrão:/etc/nginx/nginx.conf) e adicione o conteúdo abaixo ao blocohttp {}.http { # Trust the X-Forwarded-For header from requests sent by WAF. # Replace the following placeholders with the WAF back-to-origin IP ranges you obtained from the console. # You must add all IP ranges. If any are missing, some requests might still log the WAF IP instead of the real client IP. set_real_ip_from <ip_range1>; set_real_ip_from <ip_range2>; ... set_real_ip_from <ip_rangex>; # Tell Nginx to use the X-Forwarded-For header to find the real client IP. real_ip_header X-Forwarded-For; } -
Recarregue a configuração do Nginx:
nginx -t && nginx -s reload
Verificar a configuração
-
Acesse o site. Substitua
http://your-domain.com/pelo nome de domínio conectado ao WAF.curl http://your-domain.com/ -
Visualize os logs de acesso do Nginx. O endereço IP real do cliente deve ser exibido.
tail -f /var/log/nginx/access.log
Configurar o IIS 7 (aplicável ao IIS 7 e versões posteriores)
Quando o WAF atua como proxy reverso, o campo c-ip nos logs padrão do IIS registra o IP de back-to-origin do WAF em vez do IP real do cliente. Utilize o recurso de campos de log personalizados W3C no IIS para gravar o cabeçalho de requisição X-Forwarded-For nos logs, facilitando auditorias e solução de problemas.
Abra o Gerenciador do IIS. Na árvore de Conexões à esquerda, expanda o nó do servidor e selecione o site desejado (por exemplo,
Default Web Site).No painel Features View à direita, dê um clique duplo no ícone Logging.
Na seção Log Files, confirme se o Format está definido como W3C (valor padrão). Caso outro formato esteja selecionado, altere-o para W3C.
Ainda na seção Log Files, clique em Select Fields....
Na parte inferior da caixa de diálogo exibida, clique em Add Field....
-
Na caixa de diálogo Add Custom Field, insira as informações abaixo e clique em OK.
Parâmetro
Descrição
Field Name
Insira
X-FORWARDED-FORSource Type
Selecione
Request Headersource
Insira
X-Forwarded-For Clique em OK para salvar o campo personalizado.
Clique em OK novamente para fechar a janela de campos de log e, em seguida, clique em Apply no painel Ações para salvar as alterações.
Reinicie o IIS para que as alterações entrem em vigor.
Acesse o site para validar a configuração e visualize os logs de acesso (caminho padrão:
C:\inetpub\logs\LogFiles\W3SVC1\). O endereço IP real do cliente deverá aparecer.
Configurar o Apache
O Apache 2.4 e versões posteriores incluem o remoteip_module (mod_remoteip.so), que permite obter o endereço IP real do cliente.
Alibaba Cloud Linux / CentOS / RHEL
-
Edite o arquivo de configuração principal do Apache.
sudo vim /etc/httpd/conf/httpd.conf -
Adicione o conteúdo a seguir ao final do arquivo.
# Enable mod_remoteip. LoadModule remoteip_module modules/mod_remoteip.so # Specify that the real client IP is passed in the X-Forwarded-For header. RemoteIPHeader X-Forwarded-For # Add the WAF back-to-origin IP ranges as trusted proxies. # Replace these with your actual IP ranges. RemoteIPTrustedProxy 100.xx.xx.0/10 RemoteIPTrustedProxy 11.xx.xx.0/13 RemoteIPTrustedProxy 112.xx.xx.0/16 -
Localize a seção de formato de log no arquivo de configuração e altere
%hpara%a. O parâmetro%arepresenta o endereço IP remoto da conexão (o IP real do cliente corrigido pelomod_remoteip), enquanto%hindica o endereço IP original da conexão (o IP do nó do WAF). Veja abaixo um exemplo da configuração modificada.<IfModule log_config_module> # # The following directives define some format nicknames for use with # a CustomLog directive (see below). # LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%a %l %u %t \"%r\" %>s %b" common <IfModule logio_module> # You need to enable mod_logio.c to use %I and %O LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> # # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a <VirtualHost> # container, they will be logged here. Contrariwise, if you *do* # define per-<VirtualHost> access logfiles, transactions will be # logged therein and *not* in this file. # #CustomLog "logs/access_log" common # # If you prefer a logfile with access, agent, and referer information # (Combined Logfile Format) you can use the following directive. # CustomLog "logs/access_log" combined </IfModule> -
Reinicie o Apache para aplicar as alterações.
sudo systemctl restart httpd -
Acesse o site para validar a configuração e visualize os logs de acesso. O endereço IP real do cliente deverá aparecer.
tail -f /var/log/httpd/access_log
Ubuntu / Debian
-
Ative o módulo
remoteip.sudo a2enmod remoteip -
Edite o arquivo de configuração principal do Apache.
sudo vim /etc/apache2/apache2.conf -
Adicione o conteúdo a seguir ao final do arquivo.
# Specify that the real client IP is passed in the X-Forwarded-For header. RemoteIPHeader X-Forwarded-For # Add the WAF back-to-origin IP ranges as trusted proxies. # Replace these with your actual IP ranges. RemoteIPTrustedProxy 100.xx.xx.0/10 RemoteIPTrustedProxy 11.xx.xx.0/13 RemoteIPTrustedProxy 112.xx.xx.0/16 -
Localize a seção de formato de log no arquivo de configuração e altere
%hpara%a. O parâmetro%arepresenta o endereço IP real do cliente corrigido pelomod_remoteip, enquanto%hindica o endereço IP original da conexão (o IP do nó do WAF). Veja abaixo um exemplo da configuração modificada.# LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%a %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent -
Reinicie o Apache para aplicar as alterações.
sudo systemctl restart apache2 -
Acesse o site para validar a configuração e visualize os logs de acesso. O endereço IP real do cliente deverá aparecer.
tail -f /var/log/apache2/access.log
Configurar o Tomcat
O Tomcat pode obter o endereço IP real do cliente ativando o recurso X-Forwarded-For.
Acesse o diretório de instalação do Tomcat e abra o arquivo de configuração
tomcat/conf/server.xml.-
Modifique a configuração de log do AccessLogValve conforme o exemplo abaixo:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/> -
Reinicie o Tomcat.
sudo systemctl restart tomcat -
Acesse o site para validar a configuração e visualize os logs de acesso. O endereço IP real do cliente deverá aparecer.
# Replace the following command with the actual Tomcat installation directory path and the actual log file tail -f /opt/tomcat/logs/localhost_access_log.2026-01-01.txt
Configurar um cluster Kubernetes
Quando um cluster Kubernetes que utiliza o Nginx Ingress Controller é conectado ao WAF, o WAF adiciona o endereço IP real do cliente ao cabeçalho de requisição X-Forwarded-For. Por padrão, o Nginx Ingress Controller não confia nesse campo, impedindo que os contêineres de aplicação obtenham o IP real do cliente.
Siga as etapas abaixo para configurar o Nginx Ingress Controller.
-
Edite o ConfigMap do Ingress Controller:
kubectl -n kube-system edit cm nginx-configuration -
Adicione os seguintes itens de configuração ao campo
data:compute-full-forwarded-for: "true" forwarded-for-header: "X-Forwarded-For" use-forwarded-headers: "true" -
Salve e saia. A configuração entra em vigor automaticamente, sem necessidade de reiniciar os pods.
Após concluir a configuração, o Ingress Controller identifica o primeiro endereço IP em
X-Forwarded-Forcomo o IP real do cliente e mantém esse valor ao encaminhar requisições.
Otimização avançada: Transmitir o IP real usando um cabeçalho personalizado
Em arquiteturas de rede complexas, depender exclusivamente do cabeçalho padrão X-Forwarded-For (XFF) traz riscos como falsificação e confusão de IPs em múltiplas camadas de proxy. Utilizar um cabeçalho HTTP personalizado para transmitir o IP real do cliente aumenta a segurança e o controle.
O exemplo a seguir demonstra como usar um cabeçalho personalizado para recuperar o IP real do cliente.
-
Configurar o CDN
Por padrão, o CDN inclui o cabeçalho de requisição HTTP
Ali-Cdn-Real-Ipnas requisições de back-to-origin, indicando o IP real do cliente no momento da conexão com o nó do CDN. Use Add a custom outbound request header para transmitir esse endereço IP ao WAF. A tabela abaixo mostra um exemplo de configuração no console do CDN.Parâmetro
Exemplo
Operation
Add
Request Header
Custom back-to-origin request header
Header Name
Insira um nome personalizado, por exemplo,
TrueIPHeader Value
$http_Ali_Cdn_Real_IpAllow Duplicates
Not Allowed
Rule Condition
Não utilizado
-
Configurar o WAF
Execute as duas configurações abaixo no console do WAF:
Is a Layer 7 proxy such as Anti-DDoS Proxy or CDN deployed in front of WAF: Ative esta opção para que o WAF identifique corretamente o endereço IP real do cliente.
Enable Traffic Tagging: Ative esta opção para permitir que o servidor de origem obtenha o endereço IP real do cliente.
Para mais detalhes sobre como configurar essas opções, consulte Real client information.
Parâmetro
Exemplo
Is a Layer 7 proxy such as Anti-DDoS Proxy or CDN deployed in front of WAF
Selecione Yes e, em seguida, escolha [Recommended] Use the First IP Address in Specified Header Field as Actual IP Address of Client to Prevent X-Forwarded-For Forgery. Insira o Header Name definido na configuração do CDN, por exemplo,
TrueIP.Enable Traffic Tagging
Selecione Originating IP Address e insira o Header Name definido na configuração do CDN, por exemplo,
TrueIP. -
Configurar o servidor de origem
Tomando o Nginx como exemplo, edite o arquivo de configuração principal
nginx.confe adicione o conteúdo abaixo ao blocohttp {}. Para mais informações, consulte Configure Nginx.http { # Trust request headers from the WAF back-to-origin IP addresses. # Replace the following placeholders with the WAF back-to-origin IP ranges you obtained from the console. # You must add all IP ranges. If any are missing, some requests might still log the WAF IP instead of the real client IP. set_real_ip_from <ip_range1>; set_real_ip_from <ip_range2>; ... set_real_ip_from <ip_rangex>; # Tell Nginx to get the real IP from your custom header, TrueIP in this example. real_ip_header TrueIP; }Recomendamos configurar o grupo de segurança do servidor de origem para permitir apenas tráfego proveniente dos intervalos de IP de back-to-origin do WAF. Isso garante que somente o WAF possa se comunicar com o servidor de origem, evitando que atacantes contornem o WAF e acessem diretamente o endereço IP público do servidor.
Perguntas frequentes
Qual a diferença entre a configuração de IP real no servidor de origem (descrita neste tópico) e a opção Is a Layer 7 proxy such as Anti-DDoS Proxy or CDN deployed in front of WAF no console do WAF?
-
Configuração de IP real no servidor de origem (descrita neste tópico)
Finalidade: Após conectar seu domínio ao WAF via integração CNAME, esta configuração permite que o servidor de origem (como o Nginx) registre o endereço IP real do cliente em seus logs de acesso (como
access.log) em vez do IP de back-to-origin do WAF.Necessidade: Obrigatória apenas se você precisar visualizar ou processar o endereço IP real do cliente no servidor de origem.
-
A opção Is a Layer 7 proxy such as Anti-DDoS Proxy or CDN deployed in front of WAF no console do WAF
Cenário aplicável: Outros proxies de camada 7 (como CDN ou Anti-DDoS Pro) estão implantados à frente do WAF.
Finalidade: Instrui o WAF a extrair o endereço IP real do cliente de um cabeçalho de requisição HTTP específico (como
Ali-Cdn-Real-IpouX-Forwarded-For) para garantir que relatórios de segurança e identificação de ataques baseiem-se no IP de origem real.Necessidade: Obrigatória apenas se houver um proxy de camada 7 implantado à frente do WAF. Se não existir nenhum proxy frontal, mantenha o valor padrão No.
O que é falsificação de X-Forwarded-For e como evitá-la?
A falsificação de X-Forwarded-For (XFF) refere-se a um ataque no qual o invasor constrói ou adultera o cabeçalho de requisição X-Forwarded-For em uma requisição HTTP para injetar um endereço IP de cliente falso, com o objetivo de contornar controles de acesso baseados em IP, auditoria de logs ou políticas de segurança. O X-Forwarded-For é um cabeçalho de requisição não padronizado que pode ser definido arbitrariamente pelos clientes. Se um service de backend confiar diretamente nesse campo sem validação, surgem riscos de segurança.
Exemplo: Comando de ataque de falsificação de XFF Um atacante pode usar o comando curl para forjar um cabeçalho X-Forwarded-For, falsificando o endereço IP como 1.2.3.4:
curl -H "X-Forwarded-For: 1.2.3.4" https://example.com/
Para evitar a falsificação de XFF, utilize um cabeçalho de requisição confiável personalizado para transmitir o IP real: Configure o CDN ou o WAF para usar um cabeçalho de requisição HTTP personalizado predefinido ao enviar requisições de volta ao servidor de origem. O servidor de origem então analisa apenas esse cabeçalho personalizado. Como esse cabeçalho é injetado por middleware confiável (como o WAF) e não pode ser controlado diretamente pelos clientes, a falsificação é efetivamente evitada.