查看: 1988|回复: 25

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

[复制链接]
发表于 2013-2-9 09:27:58 | 显示全部楼层 |阅读模式

本文介绍使用openresty来实现防cc攻击的功能。openresty官网http://openresty.org/cn/index.html。下面是防cc攻击的流程图。

根据流程图,我们知道防cc攻击主要包括两部分,一是限制请求速度,二是给用户发送js跳转代码进行验证请求是否合法。

一、安装依赖

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安装
四、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
  •         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小时。


发表于 2013-2-12 11:48:09 | 显示全部楼层
真好。。。。。。。。。  
发表于 2013-2-20 03:16:26 | 显示全部楼层
长时间没来看了 ~~  
发表于 2013-2-22 20:28:53 | 显示全部楼层
呵呵 哪天得看看 `~~~~  
发表于 2014-11-5 03:57:31 | 显示全部楼层
呵呵,明白了  
发表于 2014-11-17 23:27:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2014-12-5 10:39:40 | 显示全部楼层
不错,感谢楼主
发表于 2014-12-28 16:27:10 | 显示全部楼层
今天再看下  
发表于 2015-1-28 14:19:33 | 显示全部楼层
这个站不错!!  
发表于 2015-3-2 10:51:51 | 显示全部楼层
做一个,做好了,请看  
高级模式
B Color Image Link Quote Code Smilies

本版积分规则