Apache 2: SetEnvIf «Диапазон IP»

10

В моей конфигурации Apache я хочу установить переменную окружения, если я вижу, что посетитель приходит с определенного диапазона IP. В настоящее время я делаю это так:

SetEnvIfNoCase Remote_Addr "^194\.8\.7[45]\." banned=spammer-ip
SetEnvIfNoCase Remote_Addr "^212\.156\.170\." banned=spammer-ip

Я бы предпочел что-то вроде этого:

SetEnvIfIpRange 194.8.74.0/23 banned=spammer-ip
SetEnvIfIpRange 212.156.170.0/24 banned=spammer-ip

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

Я мог бы сделать

Deny From 194.8.74.0/23

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

Любые предложения, что я мог бы пропустить? Существует ли мод Apache2, который может устанавливать переменные среды на основе «диапазонов IP-адресов»?

Бламу
источник

Ответы:

4

То, что у вас есть (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) - это лучшее, что вы легко сделаете. Я видел этот стиль конфигурации, реализованный на сильно загруженном кластере машин, без какого-либо заметного снижения производительности. Я согласен с использованием регулярных выражений, когда диапазоны CIDR более уместны, это раздражает. Вы можете написать небольшую программу для автоматического создания конфигурации из списка диапазонов CIDR.

Если вы знакомы с Perl, вы можете создать обработчик modperl, который будет разрешать / отклонять запросы любым способом, который вы выберете. modperl позволяет вашему коду выполняться в разных точках HTTP-запроса - mod_perl 2.0 Фазы HTTP-запроса . PerlAuthzHandler будет подходящим обработчиком для использования.

Локи

Локи
источник
8

Имейте в виду, что переменные, установленные через SetEnv, не видны в некоторых операциях (см. матрицу):

http://www.onlinesmartketer.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

ваше решение

SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918

см. https://httpd.apache.org/docs/trunk/mod/mod_setenvif.html#SetEnvIfExpr

Ханс-Йоахим Климек
источник
Это должен быть принятый ответ! Это лучшее. Это также работает в .htaccess
Jeroen Vermeulen - MageHost
8

Вы можете использовать форматирование CIDR с Apache 2.4, который позволяет <If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Greg
источник
Спасибо за ваш ответ! Обратите внимание, что в моей версии Apache была ошибка, поэтому мне пришлось заключить диапазон IP в одинарные кавычки: mail-archives.apache.org/mod_mbox/httpd-docs/201406.mbox/…
Lucas Cimon
0

Это не совсем решение для перехода от RegExp к диапазонам IP , но я нашел хороший скрипт, размещенный в Google для преобразования диапазона IP в соответствующее регулярное выражение. Может быть полезно и для некоторых из вас ...

Как исключить трафик из диапазона IP-адресов?

[Обновить]

Похоже, что Google удалил IP Address Tool (или, по крайней мере, ссылка на их сайт не работает), но здесь есть похожий инструмент: http://www.analyticsmarket.com/freetools/ipregex

Бламу
источник