一次大规模网站攻击防御报告

原创
运维 系统运维
笔者所在的网站在某一个晚上出现大范围的攻击,据事后统计而知,这次用了攻击方用了大约50万并发持续攻击网站,一看网站应用服务器的负载很高,怪不得很慢呢。本文对问题进行分析和解决。推荐的解决方案:Nginx被动防御。

【51CTO专稿】笔者所在的网站在某一个晚上出现大范围的攻击,据事后统计而知,这次用了攻击方用了大约50万并发持续攻击网站,一看网站应用服务器的负载很高,怪不得很慢呢。接下来开始分析和解决问题。

一、   攻击描述

年初开始,网站应用服务器网卡流量普遍蹿升到100M以上,其中几台服务器网卡流量更是达到了204Mbps。随之带来的就是访问速度逐渐变慢,网络带宽数次被用完。 

二、 攻击分析

1、 既然是网卡流出100M以上,那么一定有不正常的请求地址过来,接着服务器才会响应并发送到客户端。由此判断是请求的地址有异常

应用服务器受到攻击时的网卡流量图

应用服务器受到攻击时的网卡流量图

网站应用服务器受到攻击时的负载现象

网站应用服务器受到攻击时的负载现象

2、 分析web日志,可以发现很多IP同时在一秒钟对的多个地址发送GET请求,且返回的地址的流量在200k-300k之间。试想一下,返回一个php地址,怎么会有200多k的流量,那么就一定是恶意的请求。看下面url中的 232347,这个232347,就是返回给客户端的流量。

123.232.102.228 - - [07/Mar/2012:14:24:23 +0800] "GET /forum-116-20.html HTTP/1.0" "200" 232347 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)" "-"
123.232.102.228 - - [07/Mar/2012:14:24:23 +0800] "GET /forum-1402-1.html HTTP/1.0" "200" 253872 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)" "-"
123.232.102.228 - - [07/Mar/2012:14:24:23 +0800] "GET /forum-63-1.html HTTP/1.0" "200" 118163 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)" "-"
123.232.102.228 - - [07/Mar/2012:14:24:23 +0800] "GET /forum-1342-1.html HTTP/1.0" "200" 235327 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)" "-"
123.232.102.228 - - [07/Mar/2012:14:24:23 +0800] "GET /forum.php?mod=forumdisplay&fid=58 HTTP/1.0" "200" 283377 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)" "-"

3、攻击主要针对php应用,php并发跟nginx差了好几个数量级。这次攻击,平均每台php 每秒最高承受200个并发,绝大部分的针对列表页,直接对数据库造成影响。

四、解决方案

1、防火墙封IP(不推荐)

用封IP的方式来阻止攻击源IP,是一种方法,起初,我是采用了这种方法,但是这样封IP,还需要到日志中去搜索。比较繁琐,而且效果不明现。

2、Nginx被动防御(推荐)

还记得日志中的相同的user-agent的没有,nginx这次利用了user-agent来防御攻击。

在的nginx的配置文档的上面加入了

if ( $http_user_agent ~* "Mozilla/4.0\ \(compatible;\ MSIE\ 6.0;\ Windows\ NT\ 5.0\;\ .NET\ CLR\ 1.1.4322\)" )
 {
     return 444;
 }

重启nginx后,nginx 在日志中检测到该类user-agent时,就会返回444 http 状态码,既请求失败。这样设置后,各应用服务器负载恢复到正常,网卡流量正常。

218.5.73.245 - - [07/Mar/2012:10:53:12 +0800] "GET /forum-222-1.html HTTP/1.0" 444 0 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)"
218.5.73.245 - - [07/Mar/2012:10:53:12 +0800] "GET /forum-222-1.html HTTP/1.0" 444 0 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)"
218.5.73.245 - - [07/Mar/2012:10:53:12 +0800] "GET /forum-222-1.html HTTP/1.0" 444 0 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)"

Nginx 处理攻击ip的结果

五、总结

1、本次nginx 在防小型ddos或者cc有自己的特色:处理请求高效,消耗资源极低。

缺点:需要分析日志,找到规律,比如:user-agent等等。

2、疑问?

Q:有些同学要问了,这样屏蔽该类user-agent,造成误杀率有多大?

A:cc攻击者攻击时,都会有自己特殊的user-agent,屏蔽该类user-agent,不会造成额外的误杀。这是通过观察屏蔽日志的得出来的结论,服务器用上该类策略后,从来木有一个网友因为这事找过。

Q:如果cc攻击软件伪装成正常的user-agent,这样的造成误杀多大?

A:1):并不是所有的攻击者都具备修改user-agent的,相当部分的攻击者用的都是购买的攻击软件,如果要修改,则要付出金钱的代价。这不是攻击者想要的结果。2):就算是伪装成了正常的user-agent,也会有自己的特点,可以从其共有特征来分析,比如来源地址是否相同等等,这里就可以作为共同点来设置策略。在做策略时应注意观察nginx屏蔽日志中,是否其他的正常的请求也被屏蔽了?

124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -
124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -
124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -
124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -
124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -
124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -
124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -
124.133.235.202 - - [08/Mar/2012:10:33:37 +0800] "GET / HTTP/1.1" 302 163 "/zhuanti/nzpp/zonghegr.jsp?group=2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" -

例如上面的日志,这次攻击者将user-agent伪装成正常的,再用user-agent做关键字,就会有部分误杀了。所以针对此类攻击,可以以来源地址作为关键字,nginx防护策略可以这么做,

if ($http__referer ~ * "/zhuanti/nzpp/zonghegr.jsp?group=2")
{
  return 444;
}

这样就不会有误杀了

 3、经验教训

教训:去年的一次CC攻击,跟这次攻击有异曲同工之处,都是打的是php;那时我们在启用了黑洞防护墙后效果并不明显。

经验:当天晚上,我仔细分析了web日志,发现其user-agent,都是相同的,例如windows 5.0,跟正常的windows NT 5.0有本质区别,那可不可以在这上面做文章呢。带着这个问题,在网上搜索了nginx 防cc方面的资料,果然发现网上的高手的想法跟我的相同,都从其相同点user-agent入手,用nginx 来匹配该类user-agent,然后返回503 http状态码,当然这里我做了修改,返回了444状态码。所以,在吸取了上次的教训后,在今年网站遭受攻击时,我果断采用该条策略,结果证明效果很明显。虽然cc攻击一直在持续,但是网站访问依然流畅。

作者简介:崔晓辉,网名coralzd,大众网系统管理员,精通网站系统架构、Unix技术。gtalk:coralzd@gmail.com 

责任编辑:yangsai 来源: 51CTO.com
相关推荐

2016-01-31 16:52:53

2018-02-09 05:30:19

5G运营商物联网

2015-12-11 17:18:34

2024-08-27 13:25:51

2013-08-22 09:10:47

2024-09-26 10:41:31

2020-02-10 08:00:38

AI 数据人工智能

2015-04-28 15:31:09

2019-08-09 17:59:59

华为开发者开源

2022-01-14 18:59:06

网络攻击黑客网络安全

2021-12-14 15:52:52

网络攻击漏洞网络安全

2022-03-17 05:53:25

DDoS网络攻击

2021-12-01 14:57:37

恶意软件黑客网络攻击

2024-01-12 21:22:10

Scribus开源大规模升级

2013-03-21 09:24:28

2022-01-19 11:52:44

网络攻击乌克兰网站瘫痪

2021-05-08 21:34:13

DDoS网络攻击网络安全

2011-08-05 15:04:00

网络攻击黑客

2015-06-12 09:58:51

2024-07-01 00:00:01

CSS浏览器语法
点赞
收藏

51CTO技术栈公众号