Interrompe ataques DoS com uma regra de tabelas IP?

6

Eu queria saber se eu poderia evitar ataques de DoS pequenos (D) com uma regra de tabelas IP simples?

Por pequeno quero dizer que eles estão inundando meu servidor web com cerca de 400 + solicitações de um ou dois endereços IP. Posso descartar os endereços IP depois de perceber que eles começaram a acessar meu servidor da Web, mas normalmente demora alguns minutos para que as tabelas de IP sejam acionadas nesse IP e comece a descartá-lo completamente para que ele não cause impacto no servidor da Web. .

Eu derrubo o IP com o seguinte comando:

iptables -I INPUT -s "IP HERE" -j DROP

E, obviamente, salve-o:

/etc/init.d/iptables save

Eu normalmente descubro os endereços IP de ataque com o seguinte comando:

netstat -plan|grep :80|awk '{print $5}'|cut -d: -f 1|sort|uniq -c|sort -n

A questão de fazer isso dessa maneira é que eu tenho que estar lá, e isso requer que eu aja depois do fato. Existe uma regra de tabelas IP que eu poderia usar para soltar um endereço IP logo após atingir 150 conexões? Dessa forma, não tenho que me preocupar com a sobrecarga do servidor da Web e também não preciso estar lá no momento para bloqueá-lo.

A propósito, estou usando o Apache no CentOS se isso importa.

Obrigado pelo seu tempo.

    
por Josh Foskett 31.12.2011 / 10:10

2 respostas

13

Para algo que oferece flexibilidade, examine o (s) módulo (s) recente (e limite). Recent manterá um registro do número de conexões feitas por um IP, durante um determinado período de tempo, e poderá ser usado para acionar uma regra específica. O módulo recente é (relativamente) pesado na CPU - mas quando comparado ao carregamento de uma página dinâmica, pode ser bastante aceitável.

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -m recent --update --seconds 3600 --name BANNED --rsource -j DROP
-A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j ATTK_CHECK

-A ATTACKED -m limit --limit 5/min -j LOG --log-prefix "IPTABLES (Rule ATTACKED): " --log-level 7
-A ATTACKED -m recent --set --name BANNED --rsource -j DROP
-A ATTK_CHECK -m recent --set --name ATTK –-rsource
-A ATTK_CHECK -m recent --update --seconds 600 --hitcount 150 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -m recent --update --seconds 60 --hitcount 50 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -j ACCEPT

Essencialmente, os valores acima são:

  • Aceite as conexões que já foram estabelecidas (ou seja, elas passaram nossas regras)
  • Solte todas as conexões nas portas 80 e 443 (SSL) de IPs proibidos - se eles continuarem tentando se conectar, estenda o tempo - espere uma hora (sem nenhuma tentativa de conexão) antes de desbloqueá-los.
  • Verifique as novas conexões em relação às nossas regras:
    • Considere mais de 150 conexões em 10 minutos um ataque
    • Considere mais de 50 conexões em 1 minuto um ataque
    • Registre o ataque (mas não mais que 5 entradas por minuto - não queira inundar nossos registros); e bloquear a conexão

Para uma explicação mais detalhada, e uma versão em camadas do acima, que eu uso, veja este artigo

Tenha em mente que o ipTables não ajudará no congestionamento da rede, e é bastante ineficaz contra ataques distribuídos - sua vantagem está na segurança e na redução da carga do seu servidor.

    
por 31.12.2011 / 10:34
4

Você pode usar o iptables para bloquear um abusador como este, mas você precisa ter cuidado, pois o iptables exige muito da CPU. Cada pacote é verificado em todas as regras, portanto, a inclusão de regras pode rapidamente fazer com que o servidor fique sem ciclos. Eu tive um cliente uma vez que adicionava uma nova regra toda vez que eles queriam bloquear alguém, e um dia eles tinham um tráfego um pouco mais alto que o normal e o sistema caiu. As tabelas podem reduzir o número de regras analisadas, mas você não pode simplesmente jogar muitas regras no iptables.

Outra alternativa é o roteamento de buracos negros:

ip route add blackhole $IP_HERE
ip route flush cache

A tabela de roteamento é hash (com uma hashtable ), enquanto iptables as regras devem ser analisadas sequencialmente, o que é muito menos eficiente. Dessa forma, você pode ter centenas de milhares de rotas sem nenhum problema, onde milhares de regras iptables se tornariam problemáticas para serem executadas em todas as solicitações.

Em relação à sua segunda pergunta, você pode usar o módulo hashlimit para criar uma lista negra automática para usuários abusivos. Veja minha postagem sobre como evitar um ataque DDoS para mais detalhes, mas a forma abreviada é:

iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-upto 50/min \
    --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name http -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
    
por 31.12.2011 / 10:33