Apache 2: SetEnvIf “IP Range”

9

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

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

O que eu preferiria é algo assim:

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 fazer uma expressão regular é um desperdício total de recursos.

Eu poderia fazer um

Deny From 194.8.74.0/23

... mas depois eu não obtenho uma variável que eu possa checar na minha página de erro 403 - para encontrar 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"?

    
por BlaM 13.12.2009 / 14:25

4 respostas

3

O que você tem (SetEnvIfNoCase Remote_Addr "^ a.b.c." env_key = env_value) é o melhor que você fará facilmente. Eu vi esse estilo de configuração implementado em um cluster altamente carregado de máquinas, sem qualquer degradação de desempenho perceptível. Eu concordo que usar expressões regulares, quando os intervalos do CIDR são mais apropriados, é irritante. Você poderia 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, o que permitiria / negaria solicitações da maneira que você escolhesse. modperl permite que seu código seja executado em diferentes pontos através de uma solicitação HTTP - mod_perl 2.0 HTTP Request Cycle Phases . PerlAuthzHandler seria o manipulador apropriado para usar.

Lockie

    
por 13.12.2009 / 18:54
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>
    
por 02.05.2011 / 22:08
5

esteja ciente de que as variáveis definidas através de SetEnv não são visíveis em algumas operações (veja a matriz):

ligação

sua solução é

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

ligação

    
por 04.12.2015 / 13:13
0

Esta não é realmente uma solução para ir de RegExp para Intervalos de IP , mas encontrei um script agradável hospedado pelo Google para converter um intervalo de IP em um regexp correspondente. Poderia ser útil para alguns de vocês também ...

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

[Atualização]

Parece que o Google removeu a Ferramenta de endereço IP (ou pelo menos o link que eles têm em seu site está corrompido), mas há uma ferramenta semelhante aqui: link

    
por 24.05.2010 / 13:56