私のサーバーの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にリダイレクトする方法です。
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を実行する数十万台の個々のマシンまで機能します。それよりも多くのマシンである場合、レート制限は機能しなくなります。