#资源#使用Nginx模块OpenResty来防御CC攻击

 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

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

OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

参考 组件 可以知道 OpenResty® 中包含了多少软件。

参考 上路 学习如何从最简单的 hello world 开始使用 OpenResty® 开发 HTTP 业务,或前往 下载 直接获取 OpenResty® 的源代码包开始体验。

这是本人最近在网上找到的一个不错的模块现在写个教程给大家!

流程图

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

 

安装

安装依赖

CENTOS

yum install readline-devel pcre-devel openssl-devel

Debian 和 Ubuntu

apt-get install libreadline-dev libncurses5-dev libpcre3-dev \
 libssl-dev perl make build-essential

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 https://openresty.org/download/ngx_openresty-1.9.7.2.tar.gz
tar xzf ngx_openresty-1.9.7.2.tar.gz
cd ngx_openresty-1.9.7.2/
./configure --prefix=/usr/local/openresty --with-luajit
make && make install

官方安装教程:https://openresty.org/cn/installation.html

NGINX配置

nginx.conf文件

http{
[......]
lua_shared_dict limit 10m;
lua_shared_dict jsjump 10m;
 
    server {
#lua_code_cache off;
        listen       80;
        server_name  www.vpsps.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
                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小时。

VPS评审,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权.
转载请注明转自:https://vpsps.com/1322.html
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!