本文介紹使用openresty來實現防cc攻擊的功能。openresty官網http://openresty.org/cn/index.html。下面是防cc攻擊的流程圖。
根據流程圖,我們知道防cc攻擊主要包括兩部分,一是限制請求速度,二是給用戶發送js跳轉代碼進行驗證請求是否合法。
RHEL/Centos:
yum install readline-devel pcre-devel openssl-devel
ubuntu:
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perlluajit安裝
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 installnginx配置
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 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="window.location.href='"..url.."';" 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="window.location.href='"..url.."';" 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、增加隨機種子
原文地址:https://www.centos.bz/2012/12/openresty-nginx-block-cc-attack-deploy/
本文地址:http://www.linuxprobe.com/linux-openresty.html
本文介紹使用openresty來實現防cc攻擊的功能。openresty官網http://openresty.org/cn/index.html。下面是防cc攻擊的流程圖。
根據流程圖,我們知道防cc攻擊主要包括兩部分,一是限制請求速度,二是給用戶發送js跳轉代碼進行驗證請求是否合法。
RHEL/Centos:
yum install readline-devel pcre-devel openssl-devel
ubuntu:
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perlluajit安裝
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 installnginx配置
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 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="window.location.href='"..url.."';" 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="window.location.href='"..url.."';" 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、增加隨機種子
原文地址:https://www.centos.bz/2012/12/openresty-nginx-block-cc-attack-deploy/
轉載地址:http://www.linuxprobe.com/linux-openresty.html
http://xxxxxx/Linuxjc/1137394.html TechArticle