Limitando os bytes xfer'd por visitante com o Apache

1

Ocasionalmente, eu sou visitado por "leechers" fazendo o download de um site inteiro (~ 2 GB) dentro de algumas horas, enquanto o visitante médio fica muito abaixo de 50 MB. Gostaria de configurar um "byte-limite" por visitante (por exemplo, permitir no máximo 100 MB por dia e visitante).

Eu tentei o mod_cband , que vem bem perto do meu objetivo. Infelizmente, consegui apenas estabelecer uma cotação por VHost - ou seja, se a cota foi atingida, todo o VHost será bloqueado. mod_cband também pode gerenciar cotas por IP remoto - mas para isso eu preciso conhecer esses IPs com antecedência, o que eu não faço.

Eu também procurei no mod_evasive , que já uso em contextos ligeiramente diferentes. Mas isso só me permite limitar o número de solicitações e não leva em conta o "volume" (bytes transferidos).

Existe alguma solução "pronta para uso" disponível? Se eu perdi algo com mod_cband , dicas também são bem-vindas. Se uma solução não puder ser vinculada a um VHost (mas se aplicaria em todo o servidor), isso também seria aceitável (embora o VHost seja o preferido).

Note que não quer limitar a largura de banda (ou seja, velocidade), nem limite solicitações simultâneas por IP ; isso não é sobre largura de banda, mas contra "copy-cats".

Edit: Acabei de encontrar Apache :: Quota que parece fazer praticamente o que eu quero. Mas a) requer ter mod_perl em execução (não estou familiarizado com a codificação Perl) eb) parece não ter sido mantido (a versão mais recente é a v0.04, que remonta a 3/2007, e foi planejada para o Apache 1.3 se Eu entendi corretamente).

Edit2: Soluções baseadas em mod_security ou iptables também são bem-vindos. Até agora, tudo o que encontrei nesse contexto foi a aceleração de velocidade ou limitar a quantidade de conexões por IP remoto, que não é o que eu estou procurando.

Edit3: Embora já tenha encontrado uma solução para o problema subjacente (veja minha resposta abaixo), ainda estou interessado em uma solução para estabelecer uma "cota de transferência por visitante e tempo", conforme descrito na minha pergunta - como a minha solução não pode ser aplicada em todos os lugares (ver as "suposições" descritas aqui).

    
por Izzy 21.09.2015 / 19:30

1 resposta

0

Parece que eu toquei na armadilha XY - e perdi completamente um software que já estou usando para outras coisas: Fail2ban . Como a intenção original era parar os lixiviadores, isso é facilmente feito com uma cadeia correspondente.

Suposições

  • o site contém páginas informativas com links para recursos locais (por exemplo, arquivos ZIP ou PDF), que podem ser facilmente correspondidos a partir de QUERY_STRING
  • visitantes "normais" navegam nas páginas, mas escolhem apenas alguns "recursos"
  • um "leecher", processando todas as páginas, naturalmente afetaria mais "arquivos de recursos" em um curto período de tempo do que um "visitante normal" em todo o dia. No meu caso, 50 acertos / d já seriam suficientes para um "visitante normal".

Filtro Fail2Ban

O filtro Fail2Ban faz uso dessas suposições, correspondendo apenas aos recursos. Isso pode ser feito por meio de extensões de arquivo (exemplo acima: .pdf ou .zip ) ou por um caminho (por exemplo, com todos os recursos localizados em /downloads - mas deve se certificar de não coincidir com as "páginas normais". um exemplo de filtro (para ser colocado em /etc/fail2ban/filter.d/apache-leecher.conf ):

[Definition]
# Match all our resources below /downloads:
failregex = ^ -.*"(GET|POST) /download.*"

# Alternatively, match all PDF/ZIP files
# failregex = ^ -.*"(GET|POST) .*\.(zip|pdf)"

(Eu coloquei a variante ZIP / PDF como comentário; você deve ter apenas um failregex no seu arquivo de filtro)

Fail2Ban Jail

Agora, para a cadeia correspondente, configurada em /etc/fail2ban/jail.conf :

[apache-leecher]
# download no more than 100 files per hour, or get blocked for 6h (21600s)
enabled = true
port    = http,https
filter  = apache-leecher
logpath = /var/log/httpd/access_log
maxretry = 100
findtime = 3600
bantime  = 21600

Parece funcionar (já pegou 2 candidatos), mas pode precisar de alguns ajustes. Qualquer pessoa em situação semelhante deve ser capaz de adaptar facilmente os itens acima para corresponder ao site.

    
por 23.09.2015 / 21:57