A melhor maneira de usar uma lista negra de IPs grandes para negar acesso a um servidor web?

4

Existe uma maneira eficiente e fácil de usar a lista negra de IP ( como esta , mas talvez 2 -3 vezes maior, o que não pode ser muito simplificado para os CIDRs) para negar acesso a um servidor web (lighttpd ou Apache) usando software padrão / userspace (sem recompilação de kernel) em Linux ?

As regras do AFAIK Deny na configuração do Apache e iptables têm tempo de pesquisa linear. Existem módulos do kernel que lidam eficientemente com grandes listas de IPs, mas a instalação desses requer o patch do kernel.

    
por Kornel 31.05.2009 / 01:36

5 respostas

9

Você pode tentar usar moblock (google it - não é possível adicionar links ainda, novo usuário). Desative todas as listas de bloqueio baixadas e use apenas uma lista de bloqueios local que você gerar. Pode ser necessário adicionar suporte ao NFQUEUE (fila de netlink) ao seu kernel, mas ele pode estar lá por padrão.

A configuração geral é: para todos os pacotes SYN nas portas que você deseja filtrar, use a ação NFQUEUE do netfilter para empurrá-los para o moblock, no espaço do usuário. O Moblock faz uma correspondência eficiente e envia de volta uma resposta ACCEPT ou DROP ao netlink.

O formato de arquivo de configuração do moblock é bastante simples: em cada linha, forneça um nome e um intervalo de IP, no formato 123.123.123.42-123.123.124.56. Quando o moblock carrega os intervalos, ele cria uma estrutura de dados eficiente para corresponder a esses intervalos. Quando um pacote é descartado por causa de uma correspondência, o nome do intervalo e o IP da fonte real são registrados (ou não, se você desabilitar o registro de correspondências).

Eu usei o moblock em sua configuração padrão (listas de bloqueio baixadas) com cerca de 230000 IP ranges , e não vi nenhum desempenho perceptível (filtrar apenas o pacote SYN é importante para manter o tráfego do kernel / userspace para baixo embora).

Uma ressalva: se o moblock não estiver em execução, acredito que a ação padrão do NFQUEUE é DROP, resultando em uma negação de serviço do seu aplicativo. Dito isto, eu tive o moblock funcionando continuamente sem nenhum problema por mais de 6 meses. Ainda assim, talvez você queira configurar um probe de monitoramento que avise se um IP em bom estado não puder mais se conectar a: 80 em seu servidor. Você definitivamente não quer usar o moblock para filtrar o ssh, a menos que tenha listado explicitamente alguns IPs confiáveis no netfilter para recuperar.

    
por 31.05.2009 / 01:59
4

AFAIK Deny rules in Apache config and iptables have linear lookup time.

Classificar de. Você pode usar cadeias em IPTables para desmembrá-lo, ou seja, uma abordagem simplista seria ter uma cadeia para cada bloco de endereços de classe A (por exemplo, 1.0.0.0/8, 2.0.0.0/8, etc.) e as regras para isso bloqueia dentro da cadeia, reduzindo significativamente o tempo de pesquisa (ou seja, o pior caso ~ 200 avaliações de regra para obter a regra de classe A e quantas regras dentro desse bloco. Você também pode usar "iptables -L -v -n" para ver quais conjuntos de regras estão sendo mais bem avaliados e movê-los para o topo.Existem outras maneiras melhores de fazer isso, a documentação do iptables cobre isso.

    
por 31.05.2009 / 06:44
2

Sim, no seu sistema, deve haver um /etc/hosts.allow . Dê uma olhada, ele tem alguns exemplos muito fáceis de bloquear IPs, mesmo por serviço.

Em poucas palavras, em /etc/hosts.allow :

ALL : ALL : allow

httpd : /etc/hosts.httpd.deny : deny

sshd : /etc/hosts.sshd.deny : deny
    
por 31.05.2009 / 02:02
1

Eu acho que você não pode fazer isso sem paching seu kernel.

O

ipset parece ser uma boa solução.

Citar a partir da sua página Web:

If you want to

  • store multiple IP addresses or port numbers and match against the collection by iptables at one swoop;
  • dynamically update iptables rules against IP addresses or ports without performance penalty;
  • express complex IP address and ports based rulesets with one single iptables rule and benefit from the speed of IP sets

then ipset may be the proper tool for you.

    
por 31.05.2009 / 17:10
1

Você também pode fazer isso no .htaccess

Aqui está um exemplo que bloqueia por useragent, mas a idéia é a mesma: link

AFAIK Deny rules in Apache config and iptables have linear lookup time.

Eu tentaria e faria alguns testes antes de descartá-lo - o impacto poderia ser imperceptível e seria muito fácil de manter.

Da mesma forma, você pode tentar adicionar a lista ao /etc/hosts.deny

Eu não diria que é mais rápido sem testar primeiro.

Felicidades / Richy

    
por 01.06.2009 / 03:35