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


    导读OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统

    流程图

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

    安装依赖

    RHEL/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="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、增加随机种子

  • 相关阅读:
    去掉ASP.NET Development Server 中的虚拟路径
    实战 SQL Server 2008 数据库误删除数据的恢复
    人的一生,到底在追求什么?
    每日一记20211215
    CentOS系统配置本地yum源
    mysql修改和查看时区
    依赖报错问题
    没想到MarkText竟然是一款比Typora更简洁优雅的markdown编辑器,完全开源免费!
    免费javascript富文本编辑器 总有一款会适合你!
    90%的人都不知道网页文字被禁止如何复制,教你几招神奇技能就可以免费解决,一定要看完!
  • 原文地址:https://www.cnblogs.com/linux130/p/5615197.html
Copyright © 2020-2023  润新知