Apache 2: SetEnvIf "IP-Bereich"

10

In meiner Apache-Konfiguration möchte ich eine Umgebungsvariable festlegen, wenn ich sehe, dass der Besucher aus einem bestimmten IP-Bereich stammt. Derzeit mache ich es so:

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

Was ich bevorzugen würde, ist so etwas:

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

... weil ich denke, dass das Konvertieren einer IP-Adresse in einen String und das anschließende Ausführen eines regulären Ausdrucks eine völlige Verschwendung von Ressourcen ist.

Ich könnte eine machen

Deny From 194.8.74.0/23

... aber dann bekomme ich keine Variable, die ich auf meiner 403-Fehlerseite überprüfen kann - um den Grund zu finden, warum der Zugriff verweigert wurde.

Irgendwelche Vorschläge, was ich vermissen könnte? Gibt es einen Apache2-MOD, der Umgebungsvariablen basierend auf "IP-Adressbereichen" festlegen kann?

BlaM
quelle

Antworten:

4

Was Sie haben (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value), ist das Beste, was Sie leicht tun können. Ich habe gesehen, dass dieser Konfigurationsstil auf einem stark ausgelasteten Cluster von Computern implementiert wurde, ohne dass ein merklicher Leistungsabfall auftrat. Ich bin damit einverstanden, reguläre Ausdrücke zu verwenden, wenn CIDR-Bereiche angemessener sind, ist ärgerlich. Sie können ein kleines Programm schreiben, um die Konfiguration automatisch aus einer Liste von CIDR-Bereichen zu generieren.

Wenn Sie mit Perl vertraut sind, können Sie einen Modperl-Handler erstellen, der Anforderungen auf jede von Ihnen gewählte Weise zulässt / ablehnt. Mit modperl kann Ihr Code während einer HTTP-Anforderung an verschiedenen Punkten ausgeführt werden - mod_perl 2.0 HTTP-Anforderungszyklusphasen . PerlAuthzHandler wäre der geeignete Handler.

Lockie

Lockie
quelle
8

Beachten Sie, dass über SetEnv festgelegte Variablen bei einigen Operationen nicht sichtbar sind (siehe Matrix):

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

Ihre Lösung ist

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

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

Hans-Joachim Kliemeck
quelle
Dies sollte die akzeptierte Antwort sein! Es ist das Beste. Es funktioniert auch in .htaccess
Jeroen Vermeulen - MageHost
8

Sie können die CIDR-Formatierung mit Apache 2.4 verwenden, die Folgendes ermöglicht <If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Greg
quelle
Danke deine Antwort! Beachten Sie, dass in meiner Apache-Version ein Fehler aufgetreten ist
Lucas Cimon
0

Das ist nicht wirklich eine Lösung aus gehen RegExp zu IP - Bereichen , aber ich fand ein schönes Skript von Google gehostet einen IP - Bereich zu einem passenden regulären Ausdruck zu konvertieren. Könnte auch für einige von Ihnen von Nutzen sein ...

Wie schließe ich Datenverkehr aus einem Bereich von IP-Adressen aus?

[Aktualisieren]

Es sieht so aus, als hätte Google das IP-Adress-Tool entfernt (oder zumindest der Link auf seiner Website ist defekt), aber hier gibt es ein ähnliches Tool: http://www.analyticsmarket.com/freetools/ipregex

BlaM
quelle