Você não informou o seu SO, então eu ficarei feliz em lhe dizer a versão do OpenBSD: em pf.conf
coloque algo como o seguinte no seu conjunto de regras (para 100 conns por 10 segundos no máximo):
table <bad_hosts> persist block quick from <bad_hosts> pass in on $ext_if proto tcp to $webserver port www keep state \ (max-src-conn-rate 100/10, overload <bad_hosts> flush global)
você pode adicionar uma lista de desbloqueio e uma tarefa do cron chutando endereços de bad_hosts depois de um dia ou dois.