Nginx Linux (Nginx)

Nginx — при работе за обратным прокси теряется исходный адрес клиента

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

Когда Nginx стоит за CDN, балансировщиком или другим прокси, $remote_addr может содержать адрес промежуточного узла, а не посетителя. Корректировать его разрешается только по заголовкам от доверенных источников: иначе злоумышленник подставит любой IP и обойдёт ограничения.

В этой статье
  1. Симптом и границы применимости
  2. Возможные причины и как их отличить
  3. Пошаговая диагностика и исправление
  4. Как проверить результат
  5. Если проблема не устранена

#Симптом и границы применимости

Когда Nginx стоит за CDN, балансировщиком или другим прокси, $remote_addr может содержать адрес промежуточного узла, а не посетителя. Корректировать его разрешается только по заголовкам от доверенных источников: иначе злоумышленник подставит любой IP и обойдёт ограничения.

#Возможные причины и как их отличить

Возможная причинаКак узнатьЧто делать
Не включён realip или выбран неверный заголовокБез настройки Nginx логирует адрес прямого TCP-партнёра.Все записи содержат IP прокси, X-Forwarded-For приходит корректноНастроить модуль только для IP доверенных прокси
Прокси не передаёт исходный адресNginx не может восстановить IP, которого нет в переданных данных.На внутреннем прокси заголовок отсутствуетПроверить конфигурацию первого промежуточного узла
Цепочка доверия задана слишком широкоДоверие произвольным адресам открывает путь подмены.В конфигурации set_real_ip_from 0.0.0.0/0Сузить доверие до реальных сетей прокси

#Пошаговая диагностика и исправление

  1. Нарисуйте фактическую цепочку сетиВ панели CDN/балансировщика зафиксируйте, кто напрямую соединяется с Nginx, и как передаётся IP: X-Forwarded-For, X-Real-IP или PROXY protocol. Не объединяйте эти способы: для PROXY protocol необходима специальная поддержка на обоих концах.
  1. Проверьте модуль и конфигурациюПо 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"
  1. Выясните адреса доверенных промежуточных узловВозьмите актуальные диапазоны именно вашего CDN/балансировщика из его официального интерфейса или документации. IP из журнала служит подсказкой, но не гарантирует принадлежности прокси. Если доступ к origin открыт снаружи, один лишь заголовок не подтверждает источник.
  1. Добавьте адреса доверенных прокси в конфигурациюСохраните копию конфигурации. Пример ниже показывает синтаксис для частного доверенного узла 192.0.2.10 (документационный адрес); подставьте проверенный IP, а не используйте пример на рабочем сервере. real_ip_recursive on полезен для цепочки доверенных прокси, если используется X-Forwarded-For.
  2. Фрагмент конфигурационного файла, НЕ запускать в терминале
    Nginx
    Фрагмент конфигурационного файла, НЕ запускать в терминале. Фрагмент файла nginx.conf внутри http/server; это не команда оболочки! В рабочей настройке использовать реальный проверенный IP.
    set_real_ip_from 192.0.2.10;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
  1. Проверьте синтаксис и перечитайте конфигурациюВ SSH выполните тест. Если сообщение test is successful отсутствует, не применяйте правку. При успешном тесте перечитайте настройки и проверьте подключение к сайту с двух внешних адресов. Обязательно проверьте, что поддельный X-Forwarded-For при прямом подключении к origin не меняет адрес.
  2. Понадобятся права sudo; восстановите копию, если после правки нарушился доступ
    Linux · Терминал (Bash)С осторожностьюНужен sudo
    Понадобятся права sudo; восстановите копию, если после правки нарушился доступ.
    sudo nginx -t && sudo systemctl reload nginx

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. Проверьте журналы и ограничения запросовСравните $remote_addr и при необходимости отдельный $realip_remote_addr (первоначальный адрес TCP-партнёра) в диагностическом формате журнала. Если защита limit_req раньше считала всех клиентов за один IP, пересмотрите ключ ограничителя только после подтверждения правильности реальных адресов.

#Как проверить результат

В журнале новых запросов отображается реальный IP посетителя с доверенного прокси, а при прямом соединении поддельный заголовок игнорируется. Проверьте блокировки, учёт посещений и отсутствие IP-утечки через публичные ответы.

#Если проблема не устранена

Если IP не меняется, проверьте, пришёл ли заголовок и включён ли модуль. Если IP подделывается, немедленно верните прежнюю конфигурацию и сократите список доверенных адресов.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.