OpenResty(nginx扩展)实现防cc攻击
时间:2015-06-28 20:02 来源:linux.it.net.cn 作者:IT
本文介绍使用openresty来实现防cc攻击的功能。openresty官网http://openresty.org/cn/index.html。下面是防cc攻击的流程图。

根据流程图,我们知道防cc攻击主要包括两部分,一是限制请求速度,二是给用户发送js跳转代码进行验证请求是否合法。
一、安装依赖 centos:
yum install readline-devel pcre-devel openssl-devel
ubuntu:
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl
二、luajit安装
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安装
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:
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文件:
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
if args["jskey"] and args["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..ngx.var.request_uri.."&jskey="..jspara
else
url=ngx.var.scheme.."://"..ngx.var.host..ngx.var.request_uri.."?jskey="..jspara
end
local jscode="<script>window.location.href='"..url.."';</script>"
ngx.say(jscode)
end
end
else
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..ngx.var.request_uri.."&jskey="..random
else
url=ngx.var.scheme.."://"..ngx.var.host..ngx.var.request_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小时
(责任编辑:IT)
本文介绍使用openresty来实现防cc攻击的功能。openresty官网http://openresty.org/cn/index.html。下面是防cc攻击的流程图。
根据流程图,我们知道防cc攻击主要包括两部分,一是限制请求速度,二是给用户发送js跳转代码进行验证请求是否合法。 一、安装依赖 centos:
ubuntu:
二、luajit安装 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安装 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: 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文件: 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 if args["jskey"] and args["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..ngx.var.request_uri.."&jskey="..jspara else url=ngx.var.scheme.."://"..ngx.var.host..ngx.var.request_uri.."?jskey="..jspara end local jscode="<script>window.location.href='"..url.."';</script>" ngx.say(jscode) end end else 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..ngx.var.request_uri.."&jskey="..random else url=ngx.var.scheme.."://"..ngx.var.host..ngx.var.request_uri.."?jskey="..random end local jscode="<script>window.location.href='"..url.."';</script>" ngx.say(jscode) end lua代码部分解释:
1、1-12行是限速功能实现,第5和第10行表示10秒钟内容最多只能请求20次。 (责任编辑:IT) |