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.