Настройка Apache2 для логирования реальных IP через реверс прокси

Первый Apache2, который отдаёт сайт и находится в сети 172.16.50.5/24, не имеет доступа в интернет. Второй Apache2, являющийся reverse proxy для первого Apache2, находится в той же сети 172.16.50.100/24, имеет доступ в интернет.

Задача: при обращении к сайту из интернет через reverse proxy отображать в логах первого Apache2 реальный IP адрес клиента. Сейчас в логах присутствует IP адрес reverse proxy.

Для реализации данной задачи необходимо настроить Apache2, стоящий за reverse proxy.

Включить модуль mod_remoteip

sudo a2enmod remoteip

Если такой команды нет, убедитесь, что модуль установлен, и включите его в конфигурационном файле.

Настроить доверенный прокси и заголовок

Создать или отредактировать конфигурационный файл для mod_remoteip. Например, создайте файл /etc/apache2/conf-available/remoteip.conf (или /etc/httpd/conf.d/remoteip.conf для CentOS/RHEL).

Добавьте в него следующие директивы:

# Указываем, откуда брать реальный IP клиента
RemoteIPHeader X-Forwarded-For

# Указываем IP-адрес доверенного прокси-сервера (ваш второй сервер)
RemoteIPTrustedProxy 172.16.50.100
  • RemoteIPHeader X-Forwarded-For: Говорит Apache использовать содержимое заголовка X-Forwarded-For для определения IP-адреса клиента .
  • RemoteIPTrustedProxy 172.16.50.100: Сообщает Apache, что IP-адрес 172.16.50.100 является доверенным прокси, и ему можно верить, когда он передает заголовок X-Forwarded-For Это критически важный шаг для безопасности, чтобы злоумышленники не могли подставить любой IP-адрес.

Если вы используете несколько прокси, их можно перечислить через пробел или указать подсеть:

RemoteIPTrustedProxy 172.16.50.100 192.168.1.10
# или подсеть
RemoteIPInternalProxy 172.16.50.0/24

RemoteIPInternalProxy используется для внутренних прокси (как в вашем случае), а RemoteIPTrustedProxy — для внешних.

После создания файла включить конфигурацию:

sudo a2enconf remoteip

Изменить формат логов (LogFormat)

Теперь нужно изменить формат записи в логах, чтобы вместо IP-адреса прокси (%h) использовался реальный IP-адрес клиента, который теперь сохранен в переменной %a (после работы mod_remoteip).

Откройте основной файл конфигурации Apache (/etc/apache2/apache2.conf или /etc/httpd/conf/httpd.conf) и найдите строки, определяющие формат LogFormat для combined (который обычно используется).

Замените %h на %a. Должно получиться так:

Было:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Стало:
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Директива %a автоматически подставит корректный IP-адрес клиента, который модуль mod_remoteip извлек из заголовка X-Forwarded-For

Перезапустить Apache2

sudo systemctl restart apache2   # Для Debian/Ubuntu
# или
sudo systemctl restart httpd     # Для CentOS/RHEL

Проверка

Можно обратиться к сайту извне, и проверить логи на первом Apache2 сервере, должен отображаться IP адрес клиента, а не reverse proxy

tail -f /var/log/apache/access.log

Таким образом, вы настроили «цепочку доверия»: ваш прокси-сервер помечает реальный IP клиента в заголовке X-Forwarded-For, а ваш основной сервер знает, что этому прокси можно доверять, и использует данные из этого заголовка для логирования.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика