В моей конфигурации 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-адресов»?
Вы можете использовать форматирование CIDR с Apache 2.4, что позволяет <If>
:
<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
SetEnv banned = spammer-ip
</If>
имейте в виду, что переменные, установленные с помощью SetEnv, не отображаются при некоторых операциях (см. матрицу):
ваше решение
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
То, что у вас есть (SetEnvIfNoCase Remote_Addr "^ a.b.c." Env_key = env_value) - лучшее, что вы легко можете сделать. Я видел, как этот стиль конфигурации реализован на сильно загруженном кластере машин без какого-либо заметного снижения производительности. Я согласен с использованием регулярных выражений, когда более подходящие диапазоны CIDR раздражают. Вы можете написать небольшую программу для автоматического создания конфигурации из списка диапазонов CIDR.
Если вы знакомы с Perl, вы можете создать обработчик modperl, который будет разрешать / отклонять запросы любым способом, который вы выберете. modperl позволяет вашему коду запускаться в разных точках HTTP-запроса - mod_perl 2.0 Фазы цикла HTTP-запроса. PerlAuthzHandler будет подходящим обработчиком для использования.
Локки
На самом деле это не выход RegExp к Диапазоны IP, но я нашел хороший скрипт, размещенный в Google, для преобразования диапазона IP-адресов в соответствующее регулярное выражение. Может быть полезно и для некоторых из вас ...
Как мне исключить трафик с диапазона IP-адресов?
[Обновить]
Похоже, что Google удалил инструмент IP Address Tool (или, по крайней мере, ссылка на их сайте не работает), но здесь есть похожий инструмент: http://www.analyticsmarket.com/freetools/ipregex