web-dev-qa-db-ja.com

Nginx-GETパラメータパターンによるリダイレクトリクエスト

私のサーバーの1つが数日前にDDoSに攻撃され、4日間続きました。以下は、リクエストのログスニペットです。

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"

IPを気にしないでください、それは大規模な要求の1つにすぎません。同じGETリクエストパターンを使用する3000以上の異なるIPがあります。

Varnish(varnish-3.0.3-1.el6.x86_64)の背後でNginx(nginx-1.2.8-1.el6.ngx.x86_64)を使用しています。

私の質問は、この種のリクエストを特定のページ、たとえば404.htmlにリダイレクトする方法です。

2
chr1x2

Nginxでの書き換えはパスでのみ機能するため、変数を個別に比較して識別する必要があります。あなたが求めたものは次のようになります:

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

location  /404_rewrite {
    return 404;
}
  • 引数の一致は引用符で囲む必要があります。そうでない場合は{および}はNginxを混乱させるでしょう。

  • ?書き換えの最後に、Nginxは、書き換えられたURLにパラメータを追加するのではなく、すべてのパラメータを削除します。

ただし、Nginxができるだけ早くリクエストを処理するのではなく、DOSで各リクエストを遅延させようとする場合があります。

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;
}

これは何をしますか:

  • リクエスト数を30r/mに設定します。これは、1分あたり30リクエスト、または2秒ごとに1リクエストです。

  • バーストを1に設定します。通常のレート制限の場合、バーストは> 1に設定され、クライアントが誤って短時間にレート制限を超えた場合に制限されないようにします。

  • レート制限ゾーンに関する情報を格納するために20メガバイトを割り当てます。 レート制限ドキュメント によると、各$binary_remote_addrは保存に64バイトかかるため、このレート制限はDOSを実行する数十万台の個々のマシンまで機能します。それよりも多くのマシンである場合、レート制限は機能しなくなります。

2
Danack