Почему я не могу заставить Nginx reverse proxy показывать реальный IP клиента/посетителя?

Вопрос или проблема

Я уже несколько недель пытаюсь заставить мой Nginx reverse proxy показывать/передавать реальный IP-адрес посетителя, и я достиг той точки, когда у меня больше нет идей, что попробовать. Конечно, я искал решения в интернете, но безуспешно.

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

Моя настройка

  • Мой сервер работает на собственном хостинге с Proxmox на “голом металле”, и на нем у меня запущена виртуальная машина с Ubuntu 20.04, которая содержит все мои контейнеризированные (докер) приложения.

  • Среди этих контейнеризированных приложений находится Nginx Proxy Manager, который, по сути, представляет собой обратный прокси nginx с удобным веб-интерфейсом.

  • Docker работает в режиме rootless с известными ограничениями. Все привилегированные порты были открыты.

Проблема

Nginx Proxy показывает свой собственный IP в назначенной, пользовательской докерной сети (172.24.0.1) как IP клиента, и, таким образом, я не могу реализовать ограничение доступа на основе IP/подсети.

Что я пробовал до сих пор

  1. Полностью отключил файрвол для Ubuntu VM в Proxmox.
  2. Искал любые правила маскарада в Ubuntu VM с помощью iptables -S -t nat. Правила маскарада отсутствовали.
  3. Входил в контейнер и проверял файл nginx.conf, чтобы убедиться, что настройки real_ip_header X-Forwarded-For; и set_real_ip_from 172.0.0.0/8; были указаны, и они были указаны.
  4. Привязал порты 443 и 80 на контейнере к сети хоста, как описано здесь.

Ресурсы, которые я нашел полезными

https://github.com/nginx-proxy/nginx-proxy/issues/130

https://github.com/nginx-proxy/nginx-proxy/issues/133

Ответ или решение

Проблема отображения реального IP-адреса клиента в Nginx Reverse Proxy может быть довольно сложной, особенно в сложных конфигурациях с использованием контейнеров и технологий виртуализации, таких как Proxmox и Docker. Рассмотрим основные аспекты, которые могут помочь вам в решении данной задачи:

Причины

  1. Неправильная конфигурация Nginx: Nginx может быть настроен неправильно, в результате чего он не учитывает заголовки, в которых передаётся реальный IP-адрес клиента. Это может быть связано с неверными директивами real_ip_header и set_real_ip_from.

  2. Проблемы с сетью Docker: Использование Docker в режиме rootless, а также использование мостовых сетей может привести к тому, что IP-адрес, передаваемый Nginx, является внутренним адресом докер-сети, а не реальным IP клиента.

  3. Ошибки в настройках сети хоста: Возможны ошибки в пробросе портов или конфигурации брандмауэра, которые могут препятствовать правильной передаче заголовков с IP-адресом.

Решения и рекомендации

  1. Проверка конфигурации Nginx:

    • Убедитесь, что в конфигурации Nginx указаны правильные заголовки.
      real_ip_header X-Forwarded-For;
      set_real_ip_from 172.0.0.0/8;
    • Проверьте, чтобы эти настройки были заданы как в основной конфигурации Nginx, так и в конфигурациях виртуальных хостов.
  2. Настройки Docker:

    • Проверьте, чтобы порты 80 и 443 были правильно проброшены и соответствовали настоящим портам на хост-машине.
    • Убедитесь, что Docker-сеть позволяет проброс заголовков. Может быть полезно использовать mode host или другие сетевые решения, которые уменьшают влияние внутренней сети Docker на видимые IP-адреса.
  3. Сетевые настройки хоста:

    • Проверьте правила iptables и убедитесь, что между VM и Docker-контейнерами нет дополнительных преобразований (натинга), которые могут негативно влиять на видимые IP.
    • Примите во внимание, что использование rootless может иметь ограничения, поэтому рассмотрите возможность привилегированного режима запуска в тестовой среде.
  4. Сетевые настройки виртуализации (Proxmox):

    • Убедитесь, что виртуализация или настройка сети в Proxmox не влияет на видимые IP. Возможно, есть необходимость перенастроить некоторые сетевые параметры.
  5. Дополнительные ресурсы:

    • Рассмотрите возможность применения встроенных в Nginx логов для диагностики путём добавления логирования заголовков для детальной отладки проблемы.

Эти шаги должны помочь вам разграничить проблемные участки и определить, где именно в вашей конфигурации происходит потеря операций с заголовками и реальными IP-адресами. Успехов в настройке Nginx!

Оцените материал
Добавить комментарий

Капча загружается...