本文介绍使用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.git cd luajit-2.0/ make && make install ln -sf luajit-2.0.0-beta10 /usr/local/bin/luajit ln -sf /usr/local/lib/libluajit-5 .1.so.2 /usr/lib/ |
三、openresty安装
1
2
3
4
5
6
|
cd /tmp wget http: //agentzh .org /misc/nginx/ngx_openresty-1 .2.4.13. tar .gz tar xzf ngx_openresty-1.2.4.13. tar .gz cd ngx_openresty-1.2.4.13/ . /configure --prefix= /usr/local/openresty --with-luajit make && 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_addr local limit = ngx.shared.limit local req,_=limit:get(ip) if req then if req > 20 then ngx. exit (503) else limit:incr(ip,1) end else limit: set (ip,1,10) end local jsjump = ngx.shared.jsjump local uri = ngx.var.request_uri local 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 end else 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、增加随机种子