Первый 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, а ваш основной сервер знает, что этому прокси можно доверять, и использует данные из этого заголовка для логирования.