2014-04-22 15:12:01
来 源
ITJS.CN
Nginx
本文介绍使用OpenRestyngx_lua防cc攻击,希望对于初学Nginx服务器相关的朋友有帮助,更多Nginx安装、配置、报错处理等资源请本站内搜索。。
本文介绍使用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
                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小时。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。