Установите удаленный 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/ для реального примера с последствиями межсайтовых сценариев.


вы можете установить модуль mod_extract_forwarded и set MEFaccept