找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 107|回复: 1

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

[复制链接]

205

主题

172

回帖

6921

积分

论坛元老

积分
6921
发表于 2013-12-4 14:34:11 | 显示全部楼层 |阅读模式
更完善的防御已经编写成http-guard。http://www.centos.bz/http-guard/
本文介绍使用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
  •                 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=&#39;"..url.."&#39;;</script>"
  •                         ngx.say(jscode)
  •         end
  •     end
  • else
  • math.randomseed( os.time() );
  •     local random=math.random(100000,999999)
  •     jsjump:set(ip,random,60)
  •     local url=&#39;&#39;
  •     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=&#39;"..url.."&#39;;</script>"
  •     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、增加随机种子

205

主题

172

回帖

6921

积分

论坛元老

积分
6921
 楼主| 发表于 2026-1-17 00:44:07 | 显示全部楼层
不错:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 03:31 , Processed in 0.085258 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表