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 - щоб знайти причину відмови в доступі.

Будь-які пропозиції, що я можу пропустити? Чи існує MOD 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>

Дякую за вашу відповідь! Зауважте, що у моїй версії Apache виникла помилка, тому мені довелося додавати
Лукас Кімон

0

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

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

[Оновлення]

Схоже, Google видалив інструмент IP-адреси (або принаймні посилання, яке вони мають на своєму сайті, порушено), але тут є аналогічний інструмент: http://www.analyticsmarket.com/freetools/ipregex

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.