
Eu tenho um servidor web lighttpd que entrega páginas geradas em PHP. Atualmente, este servidor está enfrentando muito tráfego devido a um ataque de bot DDoS e estou procurando uma maneira de bloquear ou mitigar alguns deles.
Pelo que eu sei, o lighttpd oferece a possibilidade de bloquear solicitações via endereço IP remoto, por exemplo, colocando
$HTTP["remoteip"] == "12.34.56.0/24" {
url.access-deny = ( "" )
}
into lighttpd.conf
, todas as solicitações provenientes do intervalo de IP 12.34.56.0 - 12.34.56.255 seriam bloqueadas.
No entanto, devido à natureza do DDoS, não é viável bloquear endereços ou intervalos IP únicos, porque eles mudam com bastante frequência.
Ao examinar o log de acesso, descobri que a maioria das solicitações de bots parece usar o protocolo HTTP/1.0 mais antigo, enquanto a maior parte do tráfego legítimo usa HTTP/1.1.
Então minha pergunta é:Existe uma maneira de bloquear/negar todas as solicitações que chegam via HTTP/1.0 (e permitir aquelas via HTTP/1.1) no lighttpd?
Não consegui encontrar tal possibilidade no oficialdocumentação de configuração do lighttpd.
Notas:
- Estou ciente de que algum tráfego legítimo também pode usar HTTP/1.0, mas não há problema em bloqueá-lo também.
- As solicitações de bot não parecem usar um padrão comum para agentes de usuário ou referenciadores HTTP, portanto, usar aqueles com um padrão de expressão regular não parece ser uma opção.
Responder1
Em vez de fornecer uma solução para lighttpd
, eu recomendo que você usefail2banque está presente em todos os sistemas baseados em Unix. Ele está observando as alterações nos arquivos de log e analisa-os de acordo com as regras de expressão regular e, em caso de padrão correspondente (HTTP/1.0 no seu caso), irá bloqueá-lo no nível do firewall do sistema, que é mais eficaz para bloquear conexões indesejadas.
Além disso, se você estiver enfrentando um tráfego anormal onde você vê mais solicitações maliciosas do que solicitações normais, você pode adicionar a seguinte regra de firewall para desacelerar o ataque DDoS
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 127 -j ACCEPT
Se você ainda deseja bloquear o lighttpd
nível HTTP/1.0, tente combinar o protocolo HTTP assim:
env.SERVER_PROTOCOL == "HTTP/1.0" {
url.access-deny = ( "" )
}
(A solução não foi testada desde que mudei nginx
há muito tempo, mas AFAIR pode funcionar.)