Apache 2: SetEnvIf "IP Range"

10

En mi configuración de Apache, quiero establecer una variable de entorno si veo que el visitante proviene de un rango de IP específico. Actualmente lo hago de esta manera:

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

Lo que preferiría es algo como esto:

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

... porque creo que convertir una dirección IP en una cadena y luego hacer una expresión regular es un desperdicio total de recursos.

Podría hacer un

Deny From 194.8.74.0/23

... pero luego no obtengo una variable que pueda verificar en mi página de error 403, para encontrar la razón por la que se ha denegado el acceso.

¿Alguna sugerencia de lo que podría extrañar? ¿Existe un MOD de Apache2 que puede establecer variables de entorno basadas en "Rangos de direcciones IP"?

BlaM
fuente

Respuestas:

4

Lo que tienes (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) es lo mejor que harás fácilmente. He visto este estilo de configuración implementado en un grupo de máquinas muy cargado, sin ninguna degradación notable del rendimiento. Estoy de acuerdo con el uso de expresiones regulares, cuando los rangos CIDR son más apropiados es molesto. Podría escribir un pequeño programa para generar automáticamente la configuración a partir de una lista de rangos CIDR.

Si está familiarizado con Perl, podría crear un controlador modperl, que permitiría / denegaría las solicitudes de la forma que elija. modperl permite que su código se ejecute en diferentes puntos a lo largo de una solicitud HTTP: mod_perl 2.0 HTTP Request Cycle Phases . PerlAuthzHandler sería el controlador apropiado para usar.

Lockie

Lockie
fuente
8

Tenga en cuenta que las variables establecidas a través de SetEnv no son visibles en algunas operaciones (ver matriz):

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

tu solución es

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

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

Hans-Joachim Kliemeck
fuente
¡Esta debería ser la respuesta aceptada! Es lo mejor. También funciona en .htaccess
Jeroen Vermeulen - MageHost
8

Puede usar el formato CIDR con Apache 2.4 que permite <If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Greg
fuente
Gracias tu respuesta! Tenga en cuenta que hubo un error en mi versión de Apache, por lo que tuve que incluir el rango de IP entre comillas simples: mail-archives.apache.org/mod_mbox/httpd-docs/201406.mbox/…
Lucas Cimon
0

Esta no es realmente una solución para pasar de RegExp a Rangos de IP , pero encontré un buen script alojado por Google para convertir un rango de IP en una expresión regular coincidente. También podría ser útil para algunos de ustedes ...

¿Cómo excluyo el tráfico de un rango de direcciones IP?

[Actualizar]

Parece que Google ha eliminado la herramienta de dirección IP (o al menos el enlace que tienen en su sitio está roto), pero hay una herramienta similar aquí: http://www.analyticsmarket.com/freetools/ipregex

BlaM
fuente