nginx扩展 OpenResty 实现防cc攻击教程

简介: 使用OpenResty实现CC攻击防护,包括两个主要步骤:限制请求速度和JS验证。首先,安装依赖(RHEL/CentOS需安装readline-devel, pcre-devel, openssl-devel,Ubuntu需安装libreadline-dev等)。然后,安装Luajit和OpenResty。在Nginx配置中,创建`lua`共享字典并设置`content_by_lua_file`调用lua脚本。lua脚本检查请求频率,超过限制则返回503,否则增加计数。同时,通过JS验证,生成随机码并重定向用户,用户需携带正确验证码请求才能访问。

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

安装依赖

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

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

目录
相关文章
|
4月前
|
云安全 安全 BI
CC攻击该怎么防护更好
随着互联网发展,CC攻击成为严峻的网络安全问题。这种DDoS攻击通过操纵大量主机,向目标服务器发送大量请求,导致服务器资源耗尽。应对CC攻击,可以采取以下策略:部署高防IP或SCDN服务,限制请求频率,以及使用验证码验证。德迅云安全提供一站式安全加速解决方案,包括Web应用防火墙、CDN加速和抗DDoS防护,利用AI检测、智能语义解析等技术,有效防御各种网络攻击,同时保证网站内容的快速稳定访问。通过实时数据统计和安全可视化工具,便于监控和应对安全威胁。综合运用这些方法能有效降低CC攻击影响,保障Web应用程序的安全稳定运行。
|
2月前
|
云安全 负载均衡 安全
CC攻击和DDoS攻击
【8月更文挑战第17天】
63 4
|
2月前
|
应用服务中间件 nginx
[nginx]编译安装openresty
[nginx]编译安装openresty
|
3月前
|
Ubuntu 应用服务中间件 Linux
Linux学习之Ubuntu 20中OpenResty的nginx目录里内容和配置文件
总的来说,OpenResty的Nginx配置文件是一个强大的工具,它允许你以非常灵活的方式定义你的Web服务的行为。
38 2
|
3月前
|
JavaScript 应用服务中间件 nginx
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
129 10
|
3月前
|
应用服务中间件 网络安全 nginx
Nginx简易防CC策略规则
Nginx简易防CC策略规则
40 1
|
3月前
|
应用服务中间件 Linux 网络安全
nginx安装的详细教程(包括命令行安装和编译安装)
nginx安装的详细教程(包括命令行安装和编译安装)
|
3月前
|
应用服务中间件 Linux nginx
【项目部署系列教程】3. 安装宝塔 vs nginx
【项目部署系列教程】3. 安装宝塔 vs nginx
47 0
|
4月前
|
应用服务中间件 Linux 程序员
老程序员分享:nginx安装及其配置详细教程
老程序员分享:nginx安装及其配置详细教程
|
4月前
|
负载均衡 前端开发 应用服务中间件
技术好文共享:超详细的Nginx简易教程
技术好文共享:超详细的Nginx简易教程
下一篇
无影云桌面