本文介绍使用openresty来实现防cc攻击的功能。openresty官网http://openresty.org/cn/index.html。下面是防cc攻击的流程图。
根据流程图,我们知道防cc攻击主要包括两部分,一是限制请求速度,二是给用户发送js跳转代码进行验证请求是否合法。

一、安装依赖
|
1
|
yum install readline-devel pcre-devel openssl-devel |
|
1
|
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl |
二、luajit安装
|
1
2
3
4
5
6
|
cd /tmp/git clone http://luajit.org/git/luajit-2.0.gitcd luajit-2.0/make && make installln -sf luajit-2.0.0-beta10 /usr/local/bin/luajitln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/lib/ |
三、openresty安装
|
1
2
3
4
5
6
|
cd /tmpwget http://agentzh.org/misc/nginx/ngx_openresty-1.2.4.13.tar.gztar xzf ngx_openresty-1.2.4.13.tar.gz cd ngx_openresty-1.2.4.13/./configure --prefix=/usr/local/openresty --with-luajitmake && make install |
四、nginx配置
nginx.conf:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
http{[......]lua_shared_dict limit 10m;lua_shared_dict jsjump 10m; server { #lua_code_cache off; listen 80; server_name www.centos.bz; location / { default_type text/html; content_by_lua_file "/usr/local/openresty/nginx/conf/lua"; } location @cc { internal; root html; index index.html index.htm; } }} |
/usr/local/openresty/nginx/conf/lua文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
local ip = ngx.var.binary_remote_addrlocal limit = ngx.shared.limitlocal req,_=limit:get(ip)if req then if req > 20 then ngx.exit(503) else limit:incr(ip,1) endelse limit:set(ip,1,10)endlocal jsjump = ngx.shared.jsjumplocal uri = ngx.var.request_urilocal jspara,flags=jsjump:get(ip)local args = ngx.req.get_uri_args()if jspara then if flags then ngx.exec("@cc") else local p_jskey='' if args["jskey"] and type(args["jskey"])=='table' then p_jskey=args["jskey"][table.getn(args["jskey"])] else p_jskey=args["jskey"] end if p_jskey and p_jskey==tostring(jspara) then jsjump:set(ip,jspara,3600,1) ngx.exec("@cc") else local url='' if ngx.var.args then url=ngx.var.scheme.."://"..ngx.var.host..uri.."&jskey="..jspara else url=ngx.var.scheme.."://"..ngx.var.host..uri.."?jskey="..jspara end local jscode="<script>window.location.href='"..url.."';</script>" ngx.say(jscode) end endelse math.randomseed( os.time() ); local random=math.random(100000,999999) jsjump:set(ip,random,60) local url='' if ngx.var.args then url=ngx.var.scheme.."://"..ngx.var.host..uri.."&jskey="..random else url=ngx.var.scheme.."://"..ngx.var.host..uri.."?jskey="..random end local jscode="<script>window.location.href='"..url.."';</script>" ngx.say(jscode)end |
lua代码部分解释:
1、1-12行是限速功能实现,第5和第10行表示10秒钟内容最多只能请求20次。
2、14-48行是验证部分,24行中的3600表示验证通过后,白名单时间为3600秒,即1小时。
update: 2013.5.26
1、修复JS无限跳转bug
2、增加随机种子