(Reproduzido)
Obtenção e Passagem de IP Real
Ambiente simulado: Cliente-->Nginx1/CDN/Defesa contra DDoS-->Nginx2-->Servidor Backend
Cabeçalhos de Solicitação:
- X-Real-IP é usado para armazenar o IP real do cliente, sendo inicialmente vazio
- X-Forwarded-For é usado para armazenar a cadeia de endereços IP de redirecionamento da solicitação, sendo inicialmente vazio
Variáveis correspondentes:
$remote_addressa variável armazena o IP que iniciou a solicitação HTTP, ou seja, o IP da última conexão$http_x_real_ipessa variável é inicialmente vazia e é usada para passar o IP real do cliente para o backend, correspondente ao cabeçalho
Modificação:
- proxy_set_header este método pode ser usado para modificar os cabeçalhos, com o objetivo de transmitir informações modificadas para o próximo salto
Configuração de referência: Nginx1
proxy_set_header X-Real-IP $remote_addr; # Salva o IP da última conexão em X-Real-IP e pode ser passado adiante
Observação:
Uma vez que Nginx1 modifica o cabeçalho X-Real-IP,
Nginx2 e Servidor podem usar diretamente $http_x_real_ip para obter o IP real, sem necessidade de configurações adicionais
Traçabilidade da Cadeia de Requisição
Introdução das Variáveis:
$http_x_forwarded_foressa variável armazena a cadeia de IPs de redirecionamento da solicitação, correspondente ao cabeçalho X-Forwarded-For A lista X-Forwarded-For contém vários IPs separados por vírgula e espaço, onde o primeiro (client1) é o IP de origem do cliente, cada nível de proxy adiciona o IP do cliente conectado na lista X-Forwarded-For no final.
X-Forwarded-For: clientIP, proxyIP1, proxyIP2, ...
$proxy_add_x_forwarded_foressa variável armazena o valor resultante da adição do IP do próprio proxy à lista X-Forwarded-For.
Configuração de referência: Nginx1/Nginx2
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Se precisar imprimir na log do Nginx, use diretamente $http_x_forwarded_for na log_format.
Prevenção de Falso IP de Origem
Método de Ataque:
As solicitações normais do cliente não devem conter o cabeçalho X-Forwarded-For, mas um atacante pode falsificar um IP nesse cabeçalho: X-Forwarded-For: fakeIP
Simulação de falsificação de IP usando o comando curl:
curl -I -H "X-FORWARDED-FOR:1.2.3.4" http://nginx1/
O serviço de primeira camada de proxy recebe a solicitação, descobre já ter X-Forwarded-For, confunde-se com uma outra camada de proxy, então adiciona "IP de Proxy" (na verdade o IP real do cliente), após várias camadas de proxy, o servidor final obtém o seguinte cabeçalho:
X-Forwarded-For: fakeIP, client, nginx1, nginx2
Solução:
Na camada mais externa de proxy, Nginx1, não confie no X-Forwarded-For do cliente, use diretamente $remote_addr para substituir, não use $proxy_add_x_forwarded_for para adicionar.
Configuração de referência: Nginx1
proxy_set_header X-Forwarded-For $remote_addr;
As configurações intermediárias dos proxies Nginx são:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;