#Симптом и границы применимости
Apache за Nginx, CDN или балансировщиком может логировать IP прокси вместо IP посетителя. Для безопасной замены адреса используется mod_remoteip, но заголовок X-Forwarded-For следует принимать только от конкретных доверенных промежуточных узлов; иначе ограничения доступа можно обойти подделкой заголовка.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Модуль remoteip не настроенБез RemoteIPHeader Apache видит непосредственное TCP-соединение. | В CustomLog повторяется адрес внутреннего Nginx | Установить доверенную цепочку и корректный заголовок |
| Первый прокси не передаёт IP клиентаНевозможно восстановить не переданный клиентский адрес. | В proxy заголовок отсутствует или содержит только адрес балансировщика | Проверить передачу заголовка на внешнем узле |
| Доверие слишком широкоеБез границ доверия любой отправитель способен подставить адрес. | RemoteIPHeader задан без доверенных прокси либо с произвольными адресами | Сузить список RemoteIPTrustedProxy/RemoteIPInternalProxy |
#Пошаговая диагностика и исправление
- Запишите схему подключенияИз панели хостинга или конфигурации выясните, кто напрямую подключается к Apache: Nginx на 127.0.0.1, балансировщик в частной сети либо внешний CDN. Найдите их фактические адреса и официальный заголовок для исходного IP; PROXY Protocol и X-Forwarded-For — разные механизмы.
- Проверьте активный модуль и журналПо SSH посмотрите apache2ctl -M и конфигурацию VirtualHost. Ищите remoteip_module, LogFormat и CustomLog; %a в журнале означает адрес клиента после обработки remoteip, %{c}a — адрес самого соединения. Логи с пользовательскими IP — конфиденциальные сведения.Linux · Терминал (Bash)КомандаНужен sudoDebian-пути примерные; модуль и конфигурация могут управляться панелью.
sudo apache2ctl -M | grep remoteip; sudo grep -R -nE "RemoteIP|LogFormat|CustomLog" /etc/apache2
- Настройте список доверенных узловСкопируйте исходный файл конфигурации. Если Apache получает X-Forwarded-For от конкретного прокси, укажите RemoteIPHeader X-Forwarded-For и RemoteIPTrustedProxy с реальным IP этого прокси. Для доверенных внутренних адресов, которые могут передавать приватный IP клиента, документация предусматривает RemoteIPInternalProxy. Не задавайте эти директивы без доверенных адресов.
- Используйте пример только как образец записиВиртуальный хост либо общесерверная конфигурация Apache 2.4 допускают следующие директивы. Адрес 192.0.2.10 принадлежит диапазону для документации и не является адресом вашего прокси. Вставлять строки нужно в файл конфигурации, а не в терминал.
- Пример КОНФИГУРАЦИИ Apache; позже преобразуется в блок code, не является командой shellТекстПример КОНФИГУРАЦИИ Apache; позже преобразуется в блок code, не является командой shell.
RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 192.0.2.10
- Примените и проверьте отсутствие подделкиПосле изменения выполните configtest, только потом reload. С контролируемого внешнего подключения отправьте обычный запрос и сравните исходный IP с журналом. Отдельно убедитесь, что запрос напрямую к origin с поддельным X-Forwarded-For (если такой доступ возможен) не изменяет логируемый адрес клиента.
- Делайте после сохранения копии и согласования правил доступа; пример DebianLinux · Терминал (Bash)С осторожностьюНужен sudoДелайте после сохранения копии и согласования правил доступа; пример Debian.
sudo apache2ctl configtest && sudo systemctl reload apache2Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
В CustomLog отражается настоящий клиентский адрес только через доверенный прокси; прямой запрос с подменённым заголовком не может сменить IP. Проверьте также фильтрацию по адресам и статистику.
#Если проблема не устранена
Если IP не восстанавливается, проверьте, что заголовок доходит до Apache и от какого узла поступает TCP-соединение. Если возможна подделка, немедленно откатите изменения; нельзя доверять всем сетям.