Apache 2: SetEnvIf «IP Range»

10

Dans ma configuration Apache, je veux définir une variable d'environnement si je vois que le visiteur provient d'une plage IP spécifique. Actuellement, je le fais de cette façon:

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

Ce que je préférerais, c'est quelque chose comme ceci:

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

... parce que je pense que convertir une adresse IP en une chaîne puis faire une expression régulière est un gaspillage total de ressources.

Je pourrais faire un

Deny From 194.8.74.0/23

... mais je n'ai pas de variable que je peux vérifier dans ma page d'erreur 403 - pour trouver la raison pour laquelle l'accès a été refusé.

Toutes les suggestions que je pourrais manquer? Existe-t-il un Apache2 MOD qui peut définir des variables d'environnement basées sur des "plages d'adresses IP"?

BlaM
la source

Réponses:

4

Ce que vous avez (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) est le meilleur que vous ferez facilement. J'ai vu ce style de configuration implémenté sur un cluster de machines lourdement chargé, sans dégradation notable des performances. J'accepte l'utilisation d'expressions régulières, lorsque les plages CIDR sont plus appropriées, c'est ennuyeux. Vous pouvez écrire un petit programme pour générer automatiquement la configuration à partir d'une liste de plages CIDR.

Si vous connaissez Perl, vous pouvez créer un gestionnaire modperl, qui autoriserait / refuserait les demandes de la manière que vous choisiriez. modperl permet à votre code de s'exécuter à différents points d'une requête HTTP - Phases du cycle de requête HTTP mod_perl 2.0 . PerlAuthzHandler serait le gestionnaire approprié à utiliser.

Lockie

Lockie
la source
8

sachez que les variables définies via SetEnv ne sont pas visibles sur certaines opérations (voir matrice):

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

votre solution est

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

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

Hans-Joachim Kliemeck
la source
Cela devrait être la réponse acceptée! C'est le meilleur. Il fonctionne également en .htaccess
Jeroen Vermeulen - MageHost
8

Vous pouvez utiliser le formatage CIDR avec Apache 2.4 qui permet <If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Greg
la source
Merci votre réponse! Notez qu'il y avait un bug dans ma version Apache, donc j'ai dû mettre la plage IP entre guillemets simples: mail-archives.apache.org/mod_mbox/httpd-docs/201406.mbox/…
Lucas Cimon
0

Ce n'est pas vraiment une solution pour passer de RegExp aux plages IP , mais j'ai trouvé un joli script hébergé par Google pour convertir une plage IP en expression rationnelle correspondante. Cela pourrait aussi être utile à certains d'entre vous ...

Comment exclure le trafic d'une plage d'adresses IP?

[Mise à jour]

Il semble que Google ait supprimé l'outil d'adresse IP (ou au moins le lien qu'ils ont sur leur site est rompu), mais il existe un outil similaire ici: http://www.analyticsmarket.com/freetools/ipregex

BlaM
la source