Por alguns meses agora um dos nossos servidores de hospedagem compartilhada tem sido persistentemente e constantemente martelado por solicitações "POST /" do que deve ser centenas de milhares de IPs individuais. Em várias ocasiões, isso sobrecarregou o servidor e levou a uma negação da interrupção do tipo de serviço. O domínio de destino é muito chato (um pequeno agente imobiliário), embora isso pareça ser mal-intencionado. Não consigo entender o motivo desse ataque de longa duração e 99% malsucedido.
Uma solicitação típica (tirada de TCPDUMP) é semelhante a isto:
POST / HTTP/1.1
Accept: */*
Accept-Language: en-us
Content-Type: application/octet-stream
Content-Length: 570
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: xxx.co.uk
Connection: Keep-Alive
Cache-Control: no-cache
2+cIPSyYVJFqB9xPFzWoLj9seNyEKIcuIJz/yfkc9tVP+orXgjDk8ywglufcXsMz
bVP4XLcowz/fQtsn2kceQEj/EaEWx/GEbcC3eTbCbTube0suAfEGje3qISKQJ+ka
HaChqun3whii3OTh7vCayGV72lh4raLRandKC5g/73wgQ9Jzh2OLIzNvsiEMSJco
yG+4i35XJMvX7ovx8qJkyByHUIeE5G5M2Kp97O4sOT4jTAK2y/KAMjf6oFgtAJhI
K4/HdcnyfNdI3/4RJXlrSfhUQAc+qhGMEL7AZdtzgRub7lnu+hbuPGZvS3rF1MvL
WK1q4mrnZr0Q3m0bWkzsMZCndQ7fqOBafchjprhn4JKPsjO+upRm2m+irvmJjqnl
sDiR3fnD6pzbWyLTm2qonMJPCll3p6zg06gEfIaW04t9r89/PdHgz8AU8nzO4BX8
qwTG6dSjgbowHyJQmud8Ro+ZT+gHfw/YQUrBqKm7RoFmfJzUoOCKaP1LTwHfI1Gc
E+L8bwQV6ztKBwVn2NqbE83SAXYr9E0QkpaxGg==
Não conseguimos determinar o que está na solicitação POST, pois parece lixo, mas não tenho certeza se é relevante. Não é codificado em base64.
Para reduzir a quantidade de largura de banda usada pelas respostas a essa solicitação, proibimos o uso de solicitações POST na configuração do Apache2:
<Location />
<Limit POST>
Order deny,allow
Deny from all
</Limit>
</Location>
Isso restringe o tamanho da resposta a apenas uma mensagem 403 Proibida simples, em vez da homepage comum do cliente.
Para tentar bloquear os IPs, tentamos canalizar o log de acesso, filtrar a solicitação POST e alimentar isso diretamente no iptables:
tail -f /var/www/vhosts/xxx.co.uk/statistics/logs/access_log | grep "POST / " | awk '{print $1}' | xargs -I{} iptables -A INPUT -s {} -j DROP
Isso funciona bem e reduz o efeito do problema, mas é implacável e geralmente temos que limpar o conjunto de regras do iptables quando ele atinge 50-60k devido a problemas de iptables / kernel. Não é uma solução, pois não posso deixar essa corrida por algumas semanas até que quem for o responsável receba a mensagem e desista.
Também desativamos o KeepAlive para este VirtualHost em particular para manter o número de trabalhadores Apache ocupados no mínimo, o que ajudou, mas não é uma solução.
Alguém tem alguma idéia melhor sobre como eliminar esses pedidos, em uma escala de centenas de milhares de IPs remotos, ou para reduzir o impacto no Apache ao mínimo absoluto? O melhor que posso fazer no momento é configurá-lo para enviar um 403 Proibido, combinado com bloqueio de IP por algumas horas ...
Obrigado!