Eu tenho um site hospedado por 1GB-VPS rodando no Ubuntu 10.04 LTS. Eu estou usando nginx como o servidor web. O site está sendo executado em uma configuração relativamente estável há três anos e lida com cerca de 4 milhões de pageviews por mês.
Nas últimas 16 horas, tenho visto o que acredito ser um ataque DDoS "moderado". O tráfego de saída se multiplicou por 5 e o uso da CPU praticamente triplicou. Eu estou vendo em meus logs nginx um ou dois IPs a cada segundo enviando vários pedidos simultaneamente (1-10 cada). Essas solicitações parecem não estar indo para o meu URL, mas meu endereço IP diretamente. Como estou um pouco confortável com o nginx.conf, configurei um bloco de servidores "padrão" separado para capturar esse tráfego e registrá-lo. Eu tenho que definir para registrar esse tráfego e retornar o código de erro 444 para ele. Eu também configuro o limit_req_zone e o limit_conn_zone para esse tráfego, apesar de serem solicitações de envio de IPs diferentes, o que tem pouco impacto. Aqui está a seção relevante do nginx.conf:
limit_req_zone $binary_remote_addr zone=ddos:25m rate=1r/m;
limit_conn_zone $binary_remote_addr zone=blockedfuckers:20m;
server {
listen 80 default_server;
server_name _;
access_log /var/log/nginx/a2.log hackers;
limit_req zone=ddos nodelay;
limit_conn blockedfrakers 1;
return 444;
}
Isso reduziu o uso da CPU em cerca de 30%, mas o tráfego de saída ainda é alto e a CPU ainda está acima do dobro da normal. Por algum motivo, o log mostra as solicitações sendo enviadas uma resposta 400, não o 444 que estou tentando enviar. Por exemplo:
109.198.195.28 [12/Mar/2013:22:49:24 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
Estes parecem-me pedidos "vazios", por isso estou a tentar configurar o iptables para os largar, mas as poucas coisas que tentei não funcionaram. Qualquer ideia sobre como posso segmentar & soltar esse tráfego?