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 или заголовок этой страницы).