Настройка Reverse Proxy в Nginx: заголовки X-Real-IP, X-Forwarded-For и real_ip
- Бэкенд (Node.js, PHP-FPM, Python/Django) видит IP-адрес самого балансировщика (127.0.0.1 или внутренний адрес шлюза) вместо реального IP клиента.
- Сбои в работе rate-limit, географических блокировок и систем аудита безопасности на бэкенде.
- Заголовок
X-Forwarded-Forсодержит цепочку некорректных или поддельных (spoofed) адресов.
1. Базовая конфигурация proxy_set_header
Добавьте директивы проброса оригинальных заголовков в блок location:
location / {
proxy_pass http://backend_upstream;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}2. Восстановление реального IP через ngx_http_realip_module
Если Nginx сам находится за Cloudflare или AWS ALB, настройте доверенные прокси-сети в /etc/nginx/conf.d/real_ip.conf:
# Доверенные подсети прокси (например, Cloudflare)
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 10.0.0.0/8;
# Чтение IP из доверенного заголовка
real_ip_header X-Forwarded-For;
real_ip_recursive on;3. Валидация и перезагрузка
nginx -t && systemctl reload nginx Частые вопросы (FAQ)
В чем разница между $remote_addr и $proxy_add_x_forwarded_for?
$remote_addr содержит IP-адрес непосредственного TCP-клиента, установившего соединение. Переменная $proxy_add_x_forwarded_for берет существующий заголовок X-Forwarded-For из входящего запроса и дописывает в конец через запятую текущий $remote_addr.
Зачем нужен параметр real_ip_recursive on?
Директива real_ip_recursive on заставляет Nginx парсить заголовок X-Forwarded-For с конца и отбрасывать все IP-адреса, входящие в доверенный список set_real_ip_from, останавливаясь на первом недоверенном клиентском IP.