Eu vou colocar isso como uma resposta apenas porque vai ser longo. Como você disse com bastante precisão, bloquear mais de 20 solicitações simultâneas de 1 IP não resolverá o problema. Você precisa definir critérios "mais inteligentes". Irei ao ponto de dizer que colocar outro proxy entre um proxy e um servidor de aplicativos não é elegante nem útil.
Não sei por que você deseja limitar a taxa antes de acessar o apache porque está perdendo fail2ban
, mod_qos
, mod-antiloris
(altamente específico) e outras soluções. Além disso, não sei se as solicitações POST são seu único problema em termos de um DDoS.
As respostas de solicitação de POST em cache são possíveis e também fazem sentido. A menos que você esteja veiculando conteúdo dinâmico toda vez. Isso, obviamente, não significa que você pode armazenar em cache páginas autenticadas.
Você pode aplicar tempos de espera para o POST se a solicitação tiver levado mais de 5 segundos. Embora os usuários com conexões lentas não consigam postar nada. Você também pode aplicar uma regra por URL combinada com a regra acima. Isso faz sentido, já que é razoável para um usuário enviar POST 1000kb em uma página de upload de arquivo, mas não na página de login. Como eu disse, crie critérios "mais inteligentes". Eles podem ser longos e pode levar algum tempo para formulá-los, mas eles fornecerão uma solução sustentável, pois não sei se há um tamanho único para esse tipo de situação.
Outra solução que você pode combinar é um firewall de aplicativo. Pode ser mais do que você precisa, mas também pode mantê-lo seguro de muitas outras coisas. Aqui está uma página owasp com recomendações e o wiki relevante
EDITAR:
Eu tenho que admitir, eu não tenho nenhuma experiência com essa configuração ( varnish
e antiloris
). Mais cedo ou mais tarde, há muito que o verniz pode armazenar em cache (embora seja altamente "programável"). A principal coisa que você pode fazer é conhecer o padrão de uso e quando ele se desvia da norma. Se você quer apenas evitar esse tipo de ataque muito específico, escrever regras melhores para o Varnish deve fazê-lo. No entanto, as solicitações que chegam ao apache não são uma coisa ruim, contanto que você tenha os mods / confs adequados, o Apache pode dizer quando uma solicitação é legítima e, portanto, processá-la e quando não. Bloquear o número X de conexões de cada cliente NÃO é uma boa coisa a fazer, a menos que você possa definitivamente colocar esse IP na lista negra. Você pode fazer isso no apache através do fail2ban (regex) ou mod_qos