у меня есть mod_rpaf
установлен, чтобы получить IP-адрес пользователя из X-Forwarded-For
заголовок в PHP, журналах Apache и т. д.
К сожалению, похоже, что я должен явно указать, с каких IP-адресов этот заголовок будет соблюдаться через RPAFproxy_ips
настройка.
Учитывая, что у ELB нет статического IP, как я могу определить mod_rpaf
принимать заголовок с любого IP, а то и с любого 10. * IP?
Вы можете попробовать использовать 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
config - пока 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 модуль, который, очевидно, поддерживает маски подсети для адресов прокси. Eсть обратный перенос на Apache 2.2 и spec-файл для 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 или заголовок этой страницы.).