mod_rpaf за Amazon ELB

У меня есть mod_rpaf установлен, чтобы получить IP-адрес пользователя от X-Forwarded-For заголовок в PHP, логи Apache и т. д.

К сожалению, похоже, что я должен явно указать, с каких IP-адресов этот заголовок будет соблюдаться через RPAFproxy_ips установка.

Учитывая, что у ELB нет статического IP, как я могу сказать mod_rpaf принять заголовок с любого IP или даже с любого 10.* IP?

3 ответа

Решение

Вы можете попробовать использовать mod_extract_forwarded вместо mod_rpaf - поддерживает MEFaccept all (и если вы используете RHEL/CentOS/other-clone, пакет уже находится в EPEL). Один недостаток mod_extract_forwarded это то, что X-Forwarded-For а также Forwarded-For Имена заголовков жестко закодированы и не настраиваются, как в mod_rpaf,

Поддержка диапазонов IP не поддерживается даже в mod_extract_forwarded, но вы можете настроить брандмауэр, чтобы разрешить прямой доступ к Apache только с некоторых диапазонов IP-адресов, или проверить MEF_RPROXY_ADDR переменная окружения в mod_rewrite правила.


Подумав немного об этом, я обнаружил проблему с этим mod_extract_forwarded конфиг - пока mod_rpaf не поддерживает цепочки из нескольких прокси и берет только последний адрес из X-Forwarded-For заголовок, mod_extract_forwarded пытается поддерживать это и использует последний адрес, который не принадлежит списку доверенных прокси-серверов (так что если запрос прошел через несколько доверенных прокси-серверов, вместо второго прокси-адреса будет использоваться фактический адрес клиента). К сожалению, используя MEFaccept all Значит это mod_extract_forwarded будет доверять всем прокси, поэтому если ELB прокси просто добавит свои данные в X-Forwarded-For заголовок, и не заменить его полностью, клиенты могут передавать любые поддельные IP, отправляя запросы со своими собственными X-Forwarded-For заголовки.

Тем не менее, я нашел еще один модуль для разбора X-Forwarded-For заголовки. Последние (нестабильные) версии Apache имеют модуль mod_remoteip, который, очевидно, поддерживает маски подсетей для прокси-адресов. Существует обратный порт для Apache 2.2 и файл спецификаций для Fedora; к сожалению, запрос на включение пакета в Fedora застопорился.

Это не похоже на то, как вы можете, из быстрого чтения источника. Вы можете довольно легко взломать код, чтобы просто принять любой источник (с помощью проверки строки в строке 163, которая выглядит как is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1, но это похоже на угрозу безопасности.

Есть ли способ спросить у Amazon, какие балансировщики нагрузки находятся за вами во время выполнения? Если это так, вы можете сгенерировать конфиг на лету...

Я только что обнаружил, что CloudFlare создали свой собственный модуль Apache для таких вещей, и он поддерживает нотацию CIDR для диапазонов.

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

Комментарий в исходном коде указывает, что он был получен из mod_remoteip.c, который доступен в Apache 2.3 (или 2.5, в зависимости от того, смотрите ли вы URL или заголовок этой страницы).

Другие вопросы по тегам