К содержимому
DDoS·Protect
База знаний

Как передать реальный IP посетителя в Apache: mod_remoteip

В Apache настоящий адрес посетителя восстанавливает модуль mod_remoteip. Он особенно важен в связке nginx + Apache, как в BitrixVM и многих панелях управления хостингом.

Включение модуля

Модуль mod_remoteip входит в стандартную поставку Apache 2.4. В Debian и Ubuntu он включается командой a2enmod remoteip, в CentOS, AlmaLinux и других RHEL-подобных системах обычно уже подключён строкой LoadModule remoteip_module в /etc/httpd/conf.modules.d/. Проверить можно так:

apachectl -M 2>/dev/null | grep remoteip   # Debian/Ubuntu: apache2ctl -M

Настройка

# /etc/apache2/conf-available/remoteip.conf (Debian/Ubuntu)
# или /etc/httpd/conf.d/remoteip.conf (RHEL)
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 203.0.113.0/24   # узлы фильтрации (условные адреса)
RemoteIPTrustedProxy 127.0.0.1         # nginx на том же сервере

# В формате журнала используйте %a вместо %h
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_realip
CustomLog ${APACHE_LOG_DIR}/access.log combined_realip

Что означают директивы

  • RemoteIPHeader — заголовок, из которого берётся адрес клиента. Должен совпадать с тем, что передаёт фильтр или nginx перед Apache.
  • RemoteIPTrustedProxy — адреса прокси, которым разрешено сообщать адрес клиента. Модуль идёт по цепочке справа налево, пропускает доверенные адреса и останавливается на первом недоверенном — он и становится адресом клиента.
  • RemoteIPInternalProxy — то же, но для прокси во внутренней сети; в отличие от TrustedProxy, позволяет принимать из заголовка и частные адреса (10.x, 192.168.x).
  • %a в LogFormat — адрес клиента после обработки модулем. %h остаётся адресом соединения, то есть адресом прокси.

Связка nginx + Apache

Если перед Apache стоит nginx на том же сервере, адрес нужно восстановить в обоих: nginx принимает его от фильтра (см. real_ip в nginx) и передаёт Apache в заголовке, Apache доверяет nginx как прокси. Ошибка в одном звене — и приложение увидит 127.0.0.1 вместо посетителя.

# nginx перед Apache
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:8080;

В BitrixVM и панелях вроде ISPmanager похожая настройка обычно уже есть, но она доверяет только nginx на 127.0.0.1. После подключения фильтра адреса узлов нужно добавить в set_real_ip_from на стороне nginx; подробнее — на странице о защите 1С-Битрикс.

Проверка

  1. Проверьте синтаксис: apachectl configtest, затем перезагрузите Apache.
  2. Откройте сайт и найдите свой запрос в access.log: в первой колонке должен быть ваш адрес.
  3. Создайте временный PHP-файл, выводящий $_SERVER['REMOTE_ADDR'], откройте его и удалите после проверки.

Вопросы и ответы

Видит ли PHP настоящий адрес после настройки?

Да. mod_remoteip подменяет адрес клиента до передачи запроса обработчику, поэтому REMOTE_ADDR в PHP, mod_php и PHP-FPM через proxy_fcgi содержит адрес посетителя.

Работают ли после этого правила Require ip?

Да, они проверяют уже восстановленный адрес. Поэтому так важно доверять только своим прокси: иначе правило можно обойти поддельным заголовком.

Что делать со старым модулем mod_rpaf?

В Apache 2.4 его лучше заменить на mod_remoteip и не включать оба одновременно, иначе адрес может обрабатываться дважды и непредсказуемо.

Ранний доступ

Подключим ваш сайт одним из первых

Сервис готовится к запуску. Оставьте заявку: проверим, от чего нужно защищать ваш проект, и подключим его в числе первых на условиях раннего доступа.