注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老和山小和尚

敬天爱人

 
 
 

日志

 
 
 
 

记一次有效的DDOS防御  

2011-12-05 12:53:15|  分类: Nginx |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
去年我就开发了nginx_limit_access_module, 该模块提供一个POST接口,通过该接口,系统管理员可以发送指令进去,手工封禁某些host,ip,uri等资源。这些封禁都需要手工配置,基本上想封什么就封什么,但它只是一个被动技能,需要你发送封禁指令。如果你想让Nginx自动封禁,可以看看limit_reqlimit_conn模块。

DDOS攻击每逢年关就攻击得紧些,这个模块是去年年底开发的,当时也测试了挺久,都没什么大问题,过了年,就没有攻击了,后来也就没上线。结果今年年底又来了,攻击的目标都是些私服博客,看起来DDOS攻击还是挺赚钱的,真是个人傻钱多的行业。

基本上我们碰到的攻击都是固定的host或者uri,攻击IP主机可能有几千个,高峰期每秒钟有近万个并发请求,攻击会持续1个小时左右,结果导致后端应用服务器先撑不住挂掉,然后是nginx,由于后端服务器没有反应,积累过多链接,内存耗尽,也挂了。

最终结果是,我们屈服了,直接将私服博客封掉了事。

但每次这样搞我们也不是办法,狗急了也会跳墙,谁愿意大半夜的起来重启机器?所以,我们现在设计了一套应急方案:在应用服务器那边,对单个博客访问次数进行统计,超过一定阈值,向limit_access模块发送指令,自动封禁某些host一段时间。逻辑很简单,响应速度也足够快。我们的想法也是尽量单点清除,不影响其他用户的体验。

Nginx这边的配置是这样的:

 http {
    limit_access_zone  zone=host:10M bucket_number=10007 type=$host;
    limit_access_variable zone=host $limit_access_deny_host;

    server {
        listen       80;
        server_name  _;

        location / {
            if ($limit_access_deny_host) {
                return 503;
            }
proxy_pass http://backends;
        }

        location /limit_interface_host {
            allow   127.0.0.1/32;
            deny all;
            limit_access_interface zone=host;
        }
    }
}


自动封禁脚本指令类似这样:wget -d --post-data="ban_type=variable&ban_list=xxx.blog.163.com" http://127.0.0.1/limit_interface_host

完整的文档在这里:https://github.com/yaoweibin/nginx_limit_access_module ,有兴趣的读者可以看看。

结果
周五晚上7点多,有两次DDOS攻击,自动脚本暂时封禁了两个博客域名,可以看到服务器负载有明显的变化,所有服务器都没有过载而挂掉:

记一次有效的DDOS防御 - 120斤的大青蛙 - 老和山小和尚
 

后续
有心的读者可能会说,如果碰到很热门的博客,误杀怎么办?我们的阈值设得足够高,正常的访问还没到这个程度。而且我们默认的封禁时间是1天,1天以后自动解封。

另外,如果你想做得精细一点,可以分析日志,找出攻击IP,然后用这个模块手工封禁IP。还有其他资源的限制都可以,只要你想的到。

我现在的打算是,直接返回503还是粗暴了点,说不定里面有正常访问请求呢。我想建立几台验证码服务器,将这些流量通过302重定向转到这些验证码服务器上,只要通过了验证码,就可以正常访问。这个设想在这篇日志也有所介绍









  评论这张
 
阅读(3006)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017