我的一台服务器在几天前遭到了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"
没有知识产权,这只是大量的要求之一。 有超过3000多个不同的IP使用相同的GET请求模式。
我使用Nginx(nginx-1.2.8-1.el6.ngx.x86_64)在varnish(varnish-3.0.3-1.el6.x86_64)之后。
我的问题是,如何将这种请求redirect到特定页面,比如说404.html?
在Nginx中重写只适用于path,所以你需要分别使用variables比较来标识它们。 你所要求的是:
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,即每分钟30个请求或每两秒一个请求。
将突发设置为1.对于正常的速率限制,将突发设置为> 1以允许客户在短时间内意外超过速率限制时不受限制。
分配20兆字节来存储关于速率限制区域的信息。 根据速率限制文件,每个$binary_remote_addr需要64个字节来存储,所以这个速率限制可以运行在几十万台DOS机器上。 如果是比这更多的机器,速率限制就会崩溃。