阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

80次阅读
没有评论

共计 2563 个字符,预计需要花费 7 分钟才能阅读完成。

导读 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 攻击

安装依赖

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='https://www.linuxprobe.com/linux-openresty.html"..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='https://www.linuxprobe.com/linux-openresty.html"..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、增加随机种子

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2563字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中