Установите для REMOTE_ADDR значение X-Forwarded-For в apache - PullRequest
13 голосов
/ 11 февраля 2010

В ситуации, когда Apache сидит за обратным прокси-сервером (например, Squid), переменная среды cgi REMOTE_ADDR получает адрес прокси, а не клиента.

Однако прокси установит заголовок с именем X-Forwarded-For, который будет содержать исходный IP-адрес клиента, чтобы Apache мог его увидеть.

Вопрос в том, как заставить Apache заменить REMOTE_ADDR значением в заголовке X-Forwarded-For, чтобы все веб-приложения прозрачно увидели правильный адрес?

Ответы [ 8 ]

14 голосов
/ 06 августа 2010

Для этого вы можете использовать mod_rpaf. http://stderr.net/apache/rpaf/

6 голосов
/ 27 апреля 2012

Обратите внимание, что заголовок X-Forwarded-For может содержать список IP-адресов, если запрос прошел более одного прокси. В этом случае вам обычно нужен самый левый IP. Вы можете извлечь это с помощью SetEnvIf:

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1

Обратите внимание на использование $ 1 для установки переменной среды XFFCLIENTIP для хранения содержимого первой группы в регулярном выражении (в скобках).

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

4 голосов
/ 27 апреля 2012

В дополнение к mod_rpaf , как упоминалось ранее, похоже, что mod_extract_forwarded также будет выполнять эту функцию.

Одним из преимуществ mod_extract_forwarded является то, что он доступен из EPEL для серверов RHEL / CentOS, тогда как mod_rpaf - нет.

Похоже, что ни один из этих двух модулей не позволяет вам внести в белый список всю подсеть прокси-серверов, поэтому люди CloudFlare создали свой собственный плагин: mod_cloudflare , который, следует отметить, равен не инструмент общего назначения, как два других; он содержит жестко закодированный список подсетей CloudFlare.

3 голосов
/ 26 мая 2012

Да, мы можем сделать это.

Просто добавьте файл 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 RemoteIPHeader X-Real-IP.

Приветствия

Guiremach

2 голосов
/ 18 марта 2019

В настоящее время для этого рекомендуется использовать модуль apache mod_remoteip; rpaf не был надежно поддержан и может вызвать проблемы.

2 голосов
/ 27 августа 2012

К сожалению,

на момент написания этой статьи ни один из бэкпортов и вилок на freshports.org, people.apache.org или gist.github.com не работал. Все они были основаны на ранней альфа-версии apache httpd 2.3, которая не была совместима ни с текущими версиями 2.2, ни с 2.4.

Итак, после нескольких часов напрасной траты времени на попытки настроить бэкпорты для создания реально работающего для httpd 2.2, я решил перейти на httpd 2.4. В httpd 2.4 mod_remoteip работает бесперебойно, даже если у балансировщика нагрузки есть постоянные соединения keepalive, которые он использует для прокси-запросов от разных реальных ip-адресов клиента к бэкэнду. Я не уверен, что другие модули могут справиться с этой ситуацией (изменение IP-адресов клиентов при каждом запросе в пределах одного и того же соединения).

1 голос
/ 23 апреля 2011

Помните, что это значение может быть подделано. См. http://blog.c22.cc/2011/04/22/surveymonkey-ip-spoofing/ для реального примера с последствиями межсайтового скриптинга.

0 голосов
/ 22 мая 2015

Вы можете установить модуль mod_extract_forwarded и установить для параметра MEFaccept значение all.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...