最近跟大佬练习网站攻防。本来做好了防ddos的准备,没想到大佬花了几分钟就写了个node.js的脚本,直接对我的服务器发起了cc攻击,瞬间服务器cpu跑满,2秒即502。在感叹大佬的技术之外,我也顺便写下了这篇文章,记录一下如何使用node.js进行CC攻击以及如何防范。
先来看看CC攻击原理:
攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。
CC主要是用来攻击页面的。大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。
一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。
CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。
CC攻击也是DDOS中的一种,传统意义上的DDOS攻击为流量攻击,即通过发送大量的垃圾请求,把你的服务器带宽占满,导致服务器无法对外提供服务。而CC攻击则是通过模拟多线程多用户,对服务器进行访问,直到使服务器的硬件满载,无法提供服务,这时候也就达到了目的,打开网页会返回502。
先看看效果,这是我对自己网站攻击的截图:
攻击开始前,使用 top 命令查看web服务器负载
可以看到,cpu负载0.3%,内存剩余35%左右。
然后我在另一台服务器开始对web服务器进行CC攻击:
直接就564错误了。
我们看看被攻击的时候,web服务器负载:
CPU负载直接飙到96%!并且产生了大量php的进程。
我们再看看发起攻击服务器的资源占用:
只有10%,妥妥的,同配置的服务器,可以一次性攻击9台其他服务器。
CC攻击在web攻击中普遍存在,于是好奇心下友情测试了几个网站(小规模测试,返回500code即停止攻击),发现几个网站基本都没做什么CC防护,2秒就直接瘫痪了。有些服务器配置稍微好一点的,在一台服务器上开了5-6个窗口同时进行攻击,撑了一会儿就502了。
那么怎么防止CC攻击呢?其实服务器的web程序nginx就自带了防CC攻击的模块:limit_conn和limit_req
下面来演示下如何使用这两个模块防止CC攻击。
操作环境:centos7系统,LNMP环境
1.先在nginx中引入这两个模块:
vim /usr/local/nginx/conf/nginx.conf
在 http和server之间加入如下内容:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=allips:10m rate=5r/s;
参数说明:
$binary_remote_addr是限制同一客户端ip地址;
$server_name是限制同一server最大并发数;
limit_conn为限制并发连接数;
limit_rate为限制下载速度;
2.在网站配置文件中加入限制条件
vim /usr/local/nginx/conf/vhost/你的域名.conf
在server下加入如下内容:
limit_conn perip 6; #每个IP并发连接数量
limit_req zone=allips burst=5 nodelay; #通过令牌桶限制IP连接
参数说明:
limit_conn perip x; x为单个IP的最大并发连接数量,超过这个数量将不接受连接。
limit_req zone=allips burst=x nodelay; x为最大延迟请求数,如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。
这几个参数可以根据自己服务器配置改,限制太小的话会影响正常访问,限制太大则会影响防CC的效果。
改完之后重启nginx看看效果:
service nginx restart
3.测试防CC效果
我们再用刚才的脚本来测试攻击。
攻击前服务器负载:
CPU占用依然为 0.3%
开始攻击:
我们可以看到服务器返回了大量的503。这是因为访问被拒绝了
被攻击时服务器的负载:
可以很明显看到,php进程变少了,且CPU负载为23%,不像之前一样满载了。
这时候我们还是可以很顺畅地打开网页:
4.总结
这个防CC机制是nginx自带的,只能抵御基本的CC攻击。因为是通过限制单个IP访问速度来防CC,所以当攻击者使用大量肉鸡攻击的话,那么基本上就死路一条,甚至连你的nginx程序也会直接崩溃。当然我们这种小站也很难会受到大型的CC攻击,至少先保证不会被随便一台服务器或者家用电脑干掉,那样可真的太丢脸了。
当然,如果要进一步防CC攻击,可以提升服务器的配置,或者使用云服务器商提供的安全防护。另外,也可以通过CDN主备站+nginx反向代理做负载均衡,使用多台服务器来抵御DDOS(包括流量攻击和CC攻击)。这里有张自己作的网站架构图可以给大家参考下,希望大家可以开开心心把网站开到地老天荒!
高防架构