Como faço para eliminar pacotes HTTP “vazios” usando iptables? [duplicado]

2

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?

    
por Josh K 13.03.2013 / 03:54

1 resposta

1

Se você tem certeza de que o payload do TCP é 0, você pode tentar com as opções --length do iptables. Esta opção corresponde à carga da camada 3. Esta regra deve funcionar:

iptables -I INPUT -p tcp --dport 80 -m length --length 20 -j DROP

O tamanho de um cabeçalho TCP é normalmente 20 (pode ser maior, mas tente com 20 e veja os resultados). Então, essa regra soltar pacotes que contém apenas um pacote com um cabeçalho TCP e sem carga.

    
por 13.03.2013 / 13:28