Apache 2: SetEnvIf "Faixa de IP"

10

Na minha configuração do Apache, quero definir uma variável de ambiente se perceber que o visitante vem de um intervalo de IP específico. Atualmente eu faço desta maneira:

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

O que eu preferiria é algo como isto:

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

... porque acho que converter um endereço IP em uma string e depois fazer uma expressão regular é um total desperdício de recursos.

Eu poderia fazer um

Deny From 194.8.74.0/23

... mas não recebo uma variável que possa verificar na minha página de erro 403 - para descobrir o motivo pelo qual o acesso foi negado.

Alguma sugestão do que eu possa sentir falta? Existe um Apache2 MOD que pode definir variáveis ​​de ambiente com base em "Intervalos de endereços IP"?

BlaM
fonte

Respostas:

4

O que você tem (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) é o melhor que você pode fazer facilmente. Eu já vi esse estilo de configuração implementado em um cluster de máquinas muito carregado, sem nenhuma degradação perceptível no desempenho. Concordo em usar expressões regulares, quando os intervalos CIDR são mais apropriados, é irritante. Você pode escrever um pequeno programa para gerar automaticamente a configuração a partir de uma lista de intervalos CIDR.

Se você estiver familiarizado com o Perl, poderá criar um manipulador modperl, que permita / negue solicitações da maneira que você escolher. O modperl permite que seu código seja executado em pontos diferentes em uma solicitação HTTP - mod_perl 2.0 Fases do ciclo de solicitação HTTP . PerlAuthzHandler seria o manipulador apropriado para usar.

Lockie

Lockie
fonte
8

esteja ciente de que as variáveis ​​definidas por meio do SetEnv não são visíveis em algumas operações (consulte a matriz):

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

sua solução é

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

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

Hans-Joachim Kliemeck
fonte
Esta deve ser a resposta aceita! E o melhor. Também funciona em .htaccess
Jeroen Vermeulen - MageHost
8

Você pode usar a formatação CIDR com o Apache 2.4, que permite <If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Greg
fonte
Obrigado sua resposta! Note-se que houve um erro na minha versão Apache, para que eu tinha para delimitar a faixa de IP entre aspas simples: mail-archives.apache.org/mod_mbox/httpd-docs/201406.mbox/...
Lucas Cimon
0

Essa não é realmente uma solução para ir do RegExp para o intervalo de IP , mas encontrei um bom script hospedado pelo Google para converter um intervalo de IP em um regexp correspondente. Também pode ser útil para alguns de vocês ...

Como excluo o tráfego de um intervalo de endereços IP?

[Atualizar]

Parece que o Google removeu a Ferramenta de Endereço IP (ou pelo menos o link que eles têm no site está quebrado), mas há uma ferramenta semelhante aqui: http://www.analyticsmarket.com/freetools/ipregex

BlaM
fonte