Установите удаленный ADDR в X-Forwarded-For в apache
в ситуации, когда Apache сидит за обратным прокси (например, Squid), переменная среды cgi REMOTE_ADDR
получает адрес прокси, а не клиента.
однако прокси установит заголовок с именем X-Forwarded-For
чтобы содержать исходный IP-адрес клиента, чтобы Apache мог его видеть.
вопрос в том, как заставить Apache заменить REMOTE_ADDR
со значением X-Forwarded-For
заголовок, чтобы все веб-приложения были прозрачными видите правильный адрес?
7 ответов
для этого вы можете использовать mod_rpaf. http://stderr.net/apache/rpaf/
обратите внимание, что заголовок X-Forwarded-For может содержать список IP-адресов, если запрос прошел более одного представителя. В этом случае обычно требуется самый левый IP-адрес. Вы можете извлечь это с помощью SetEnvIf:
SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=
обратите внимание на использование 1$ чтобы установить переменную среды XFFCLIENTIP для хранения содержимого первой группы в регулярном выражении (в скобках).
затем вы можете использовать значение переменной окружения установить заголовки (или используйте его в форматах журналов Apache, чтобы журналы содержали фактический IP-адрес клиента).
кроме модулем mod_rpaf как упоминалось ранее, похоже, что mod_extract_forwarded будет выполнять данную функцию.
одним из преимуществ mod_extract_forwarded
что это EPEL для серверов RHEL/CentOS тогда как mod_rpaf
нет.
похоже, что ни один из этих двух модулей не позволяет вам внести в белый список всю подсеть прокси-серверов, поэтому люди CloudFlare создали свой собственный плагин: mod_cloudflare, который, следует отметить, составляет не инструмент общего назначения, как и два других; он содержит жестко закодированный список подсетей CloudFlare.
к сожалению,
на момент написания этой статьи ни один из backports и forks на freshports.org, people.apache.org или gist.github.com сработало. Все они были основаны на ранней альфа-версии Apache httpd 2.3, которая не была совместима с текущими версиями 2.2 и 2.4.
поэтому после нескольких часов траты времени, пытаясь настроить backports для создания реального рабочего для httpd 2.2, я решил перейти к httpd 2.4. В httpd 2.4 работает mod_remoteip плавно, даже если балансировщик нагрузки имеет постоянные соединения keepalive, которые он использует для прокси-запросов от разных фактических IP-адресов клиента к бэкэнду. Я не уверен, что другие модули могут справиться с этой ситуацией (изменение IP-адресов на каждый запрос в рамках одного соединения).
Да, мы можем сделать это.
просто добавьте auto_prepend_file в свой PHP.ini нравится auto_prepend_file = "c:/prepend.php"
и в этом файле добавьте следующее:
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
вам нужен MOD_REMOTEIP в Apache width RemoteIPHeader X-Real-IP
.
спасибо,
Guiremach
помните, что это значение может быть подделана. См.http://blog.c22.cc/2011/04/22/surveymonkey-ip-spoofing/ для реального примера с последствиями межсайтовых сценариев.