Nginx - Pedido de redirecionamento por padrão de parâmetros GET

2

Um dos meus servidores foi atacado por DDoS há alguns dias e durou 4 dias. Abaixo estão os trechos de registros da solicitação:

36.224.180.253 - - [14/May/2013:03:11:46 +0800] "GET //?f5b2fd2f860dc=9597624054932145 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"
36.224.180.253 - - [14/May/2013:03:11:50 +0800] "GET //?d69e553a2e8cc=8383534686131949 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"
36.224.180.253 - - [14/May/2013:03:11:53 +0800] "GET //?cd28bceecb2f7=8014028628342069 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"
36.224.180.253 - - [14/May/2013:03:11:59 +0800] "GET //?e39ba4d777ca3=8890936876339672 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"
36.224.180.253 - - [14/May/2013:03:12:02 +0800] "GET //?3bc0dd265e14b=2334116190596257 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"
36.224.180.253 - - [14/May/2013:03:12:06 +0800] "GET //?8b645989c8334=5444999657995141 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"
36.224.180.253 - - [14/May/2013:03:12:09 +0800] "GET //?bb1f56833c451=7309469290160174 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"
36.224.180.253 - - [14/May/2013:03:12:11 +0800] "GET //?5fb9da415957e=3739296350043726 HTTP/1.1" 301 178 "-" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"

Deixa pra lá o IP, é apenas um dos grandes pedidos. Existem mais de 3000+ IPs diferentes usando o mesmo padrão de requisições GET.

Estou usando o Nginx (nginx-1.2.8-1.el6.ngx.x86_64) atrás do Varnish (verniz-3.0.3-1.el6.x86_64).

Minha pergunta é: como redirecionar esse tipo de solicitação para uma página específica, digamos 404.html?

    
por chr1x2 16.05.2013 / 08:30

1 resposta

2

Reescrever no Nginx só funciona em caminhos, então você precisa usar uma comparação nas variáveis separadamente para identificá-los. O que você pediu seria parecido com:

if ($args ~ "([a-f0-9]{12,})=([a-f0-9]{12,})" ){
    rewrite ^/$ /404_rewrite?;
}

location  /404_rewrite {
    return 404;
}
  • A correspondência para os argumentos deve estar entre aspas, caso contrário, o { e } confundiriam o Nginx.

  • O ? no final da reescrita faz o Nginx eliminar todos os parâmetros, em vez de anexá-los ao URL reescrito.

No entanto, você pode desejar que o Nginx tente atrasar cada solicitação no DOS, em vez de lidar com elas o mais rápido possível.

limit_req_zone  $binary_remote_addr  zone=dos_attack:20m   rate=30r/m;

if ($args ~ "([a-f0-9]{12,})=([a-f0-9]{12,})" ){
    rewrite ^/$ /404_rewrite?;
}

location  /404_rewrite {
    limit_req   zone=dos_attack  burst=1;
    internal;
    return 404;
}

O que isto faz é:

  • Defina o número de solicitações em 30r / m, que são 30 solicitações por minuto ou uma solicitação a cada dois segundos.

  • Define a rajada em 1. Para a taxa normal de limitação, a rajada é definida em > 1 para permitir que os clientes não sejam limitados se ultrapassarem acidentalmente o limite de taxa por um curto período de tempo.

  • Aloca 20 megabytes para armazenar as informações sobre a zona de limitação de taxa. De acordo com a documentação de limite de taxa , cada $binary_remote_addr leva 64 bytes para armazenar, portanto, essa limitação de taxa funcionaria até um par de cem mil máquinas individuais fazendo o DOS. Se fossem mais máquinas do que isso, a limitação de taxa seria quebrada.

por 16.05.2013 / 18:59