Então a solução que eu descobri, que eu acho que vale a pena documentar, é a seguinte:
- O Squid registra todas as solicitações recebidas
- Para solicitações de CDN, o squid segue o cabeçalho X-forwarded-For, deixando o IP do cliente real em os logs
- O Fail2ban verifica os logs, registrando quantas solicitações estão sendo feitas por clientes por minuto etc.
- Quando um cliente faz X número de solicitações, ele é colocado na lista de IP squirm , que tem a solicitação foi reescrita para apontar para um servidor da Web no balanceador de carga.
- O Squid pega isso, nega a solicitação de acesso aos servidores da Web e permite acesso a um servidor thttpd em execução no balanceador de carga, que hospeda uma página da Web de "você está banido".