#Симптом и границы применимости
Когда Nginx стоит за CDN, балансировщиком или другим прокси, $remote_addr может содержать адрес промежуточного узла, а не посетителя. Корректировать его разрешается только по заголовкам от доверенных источников: иначе злоумышленник подставит любой IP и обойдёт ограничения.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Не включён realip или выбран неверный заголовокБез настройки Nginx логирует адрес прямого TCP-партнёра. | Все записи содержат IP прокси, X-Forwarded-For приходит корректно | Настроить модуль только для IP доверенных прокси |
| Прокси не передаёт исходный адресNginx не может восстановить IP, которого нет в переданных данных. | На внутреннем прокси заголовок отсутствует | Проверить конфигурацию первого промежуточного узла |
| Цепочка доверия задана слишком широкоДоверие произвольным адресам открывает путь подмены. | В конфигурации set_real_ip_from 0.0.0.0/0 | Сузить доверие до реальных сетей прокси |
#Пошаговая диагностика и исправление
- Нарисуйте фактическую цепочку сетиВ панели CDN/балансировщика зафиксируйте, кто напрямую соединяется с Nginx, и как передаётся IP: X-Forwarded-For, X-Real-IP или PROXY protocol. Не объединяйте эти способы: для PROXY protocol необходима специальная поддержка на обоих концах.
- Проверьте модуль и конфигурациюПо SSH на узле Nginx узнайте, загружен ли ngx_http_realip_module (в сборке он может быть статическим или динамическим). Найдите все set_real_ip_from, real_ip_header, real_ip_recursive. Если есть широкая доверенная сеть 0.0.0.0/0, это опасный признак, а не решение.Linux · Терминал (Bash)КомандаНужен sudoТолько чтение; не публикуйте вывод конфигурации целиком.
nginx -V 2>&1; sudo nginx -T 2>&1 | grep -nE "real_ip_|set_real_ip_from|log_format"
- Выясните адреса доверенных промежуточных узловВозьмите актуальные диапазоны именно вашего CDN/балансировщика из его официального интерфейса или документации. IP из журнала служит подсказкой, но не гарантирует принадлежности прокси. Если доступ к origin открыт снаружи, один лишь заголовок не подтверждает источник.
- Добавьте адреса доверенных прокси в конфигурациюСохраните копию конфигурации. Пример ниже показывает синтаксис для частного доверенного узла 192.0.2.10 (документационный адрес); подставьте проверенный IP, а не используйте пример на рабочем сервере. real_ip_recursive on полезен для цепочки доверенных прокси, если используется X-Forwarded-For.
- Фрагмент конфигурационного файла, НЕ запускать в терминалеNginxФрагмент конфигурационного файла, НЕ запускать в терминале. Фрагмент файла nginx.conf внутри http/server; это не команда оболочки! В рабочей настройке использовать реальный проверенный IP.
set_real_ip_from 192.0.2.10; real_ip_header X-Forwarded-For; real_ip_recursive on;
- Проверьте синтаксис и перечитайте конфигурациюВ SSH выполните тест. Если сообщение test is successful отсутствует, не применяйте правку. При успешном тесте перечитайте настройки и проверьте подключение к сайту с двух внешних адресов. Обязательно проверьте, что поддельный X-Forwarded-For при прямом подключении к origin не меняет адрес.
- Понадобятся права sudo; восстановите копию, если после правки нарушился доступLinux · Терминал (Bash)С осторожностьюНужен sudoПонадобятся права sudo; восстановите копию, если после правки нарушился доступ.
sudo nginx -t && sudo systemctl reload nginxКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Проверьте журналы и ограничения запросовСравните $remote_addr и при необходимости отдельный $realip_remote_addr (первоначальный адрес TCP-партнёра) в диагностическом формате журнала. Если защита limit_req раньше считала всех клиентов за один IP, пересмотрите ключ ограничителя только после подтверждения правильности реальных адресов.
#Как проверить результат
В журнале новых запросов отображается реальный IP посетителя с доверенного прокси, а при прямом соединении поддельный заголовок игнорируется. Проверьте блокировки, учёт посещений и отсутствие IP-утечки через публичные ответы.
#Если проблема не устранена
Если IP не меняется, проверьте, пришёл ли заголовок и включён ли модуль. Если IP подделывается, немедленно верните прежнюю конфигурацию и сократите список доверенных адресов.