最新消息:

OpenResty(nginx扩展)实现防cc攻击

未分类 admin 4131浏览 0评论

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

一、安装依赖

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.aikaiyuan.com;

    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小时。

转载请注明:爱开源 » OpenResty(nginx扩展)实现防cc攻击

您必须 登录 才能发表评论!