Apache 2: SetEnvIf „Zakres IP”

10

W mojej konfiguracji Apache chcę ustawić zmienną środowiskową, jeśli widzę, że użytkownik pochodzi z określonego zakresu adresów IP. Obecnie robię to w ten sposób:

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

Wolałbym coś takiego:

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

... ponieważ myślę, że konwersja adresu IP na ciąg znaków, a następnie wykonanie wyrażenia regularnego, jest całkowitą stratą zasobów.

Mógłbym zrobić

Deny From 194.8.74.0/23

... ale potem nie otrzymuję zmiennej, którą mogę sprawdzić na stronie błędu 403 - aby znaleźć przyczynę odmowy dostępu.

Jakieś sugestie, co mogę przegapić? Czy istnieje moduł Apache2 MOD, który może ustawiać zmienne środowiskowe na podstawie „Zakresów adresów IP”?

BlaM
źródło

Odpowiedzi:

4

To, co masz (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) to najlepsze, co możesz łatwo zrobić. Widziałem ten styl konfiguracji wdrożony na mocno obciążonym klastrze komputerów, bez zauważalnego spadku wydajności. Zgadzam się na używanie wyrażeń regularnych, gdy zakresy CIDR są bardziej odpowiednie, jest denerwujące. Możesz napisać mały program do automatycznego generowania konfiguracji z listy zakresów CIDR.

Jeśli znasz Perla, możesz utworzyć moduł obsługi, który zezwalałby / odrzucał żądania w dowolny sposób. modperl pozwala na uruchamianie kodu w różnych punktach w trakcie żądania HTTP - Fazy ​​cyklu żądań HTTP mod_perl 2.0 . PerlAuthzHandler byłby odpowiednim programem do obsługi.

Lockie

Lockie
źródło
8

pamiętaj, że zmienne ustawione przez SetEnv nie są widoczne w niektórych operacjach (patrz macierz):

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

twoje rozwiązanie jest

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

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

Hans-Joachim Kliemeck
źródło
To powinna być zaakceptowana odpowiedź! To jest najlepsze. Działa również w .htaccess
Jeroen Vermeulen - MageHost
8

Możesz używać formatowania CIDR z Apache 2.4, który pozwala <If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Greg
źródło
Dziękuję za odpowiedź! Zauważ, że w mojej wersji Apache wystąpił błąd, dlatego musiałem zawrzeć
Lucas Cimon
0

To nie jest tak naprawdę rozwiązanie, aby przejść z RegExp na zakresy adresów IP , ale znalazłem fajny skrypt obsługiwany przez Google do konwersji zakresu adresów IP na pasujące wyrażenie regularne. Może być przydatny także dla niektórych z was ...

Jak wykluczyć ruch z zakresu adresów IP?

[Aktualizacja]

Wygląda na to, że Google usunęło narzędzie adresu IP (lub przynajmniej łącze, które mają na swojej stronie, jest zepsute), ale istnieje podobne narzędzie tutaj: http://www.analyticsmarket.com/freetools/ipregex

BlaM
źródło