如何提高防护CC攻击的能力

今天先是看到一篇讨论CC攻击的文章:Nginx防CC攻击,紧接着就有同窗在群里问我关于防CC攻击的问题,巧吗?好巧!php

什么是CC攻击?html

CC攻击是DDoS攻击的一种类型,使用代理服务器向受害服务器发送大量貌似合法的请求(一般使用HTTP GET)。CC(Challenge Collapsar,挑战黑洞)根据其工具命名,攻击者创造性地使用代理机制,利用众多普遍可用的免费代理服务器发动DDoS攻击。许多免费代理服务器支持匿名模式,这使追踪变得很是困难。redis

原本看了上面那篇文章,以为虽然写的很用心,还作了样本压测,但仅仅作基于IP的频率限制,从原理上来说并不实用,为何呢?其实,做者本身在文末也提到了。sql

虽然用limit_req_module能够在必定程度上的防止CC攻击,可是有误杀几率;国内宽带用户的IP地址已经大量内网化,几百人共享一个IP的可能性是很大的。数据库

作基于IP的频率限制,误杀的几率确实很是大。在国内,一个小区、一个公司常常会遇到共用IP的状况,而移动网络共用基站的设备更是容易出现相同的公网IP。浏览器

墨菲定律第一条就是:任何事物都没有表面看起来那么简单。况且这个看起来一点都不简单,怎么可能只用IP频率限制这一种手段呢?对于CC攻击,其防护必须采用多种方法,而这些方法本质上也是在提升服务器的并发能力。缓存

1. 服务器垂直扩展和水平扩容

资金容许的状况下,这是最简单的一种方法,本质上讲,这个方法并非针对CC攻击的,而是提高服务自己处理并发的能力,但确实提高了对CC攻击的承载能力。服务器

  • 垂直扩展:是指增长每台服务器的硬件能力,如升级CPU,增长内存,升级SSD固态硬盘等。微信

  • 水平扩容:是指经过增长提供服务的服务器来提高承载力。cookie

上述扩展和扩容能够在服务的各个层级进行,包括:应用服务器、数据库服务器、缓存服务器等等。

2. 数据缓存(内存级别,不要用文件)

对于服务中具有高度共性,多用户可重用,或单用户屡次可重用的数据,一旦从数据库中检索出,或经过计算得出后,最好将其放在缓存中,后续请求都可直接从缓存中取得数据,减轻数据库的检索压力和应用服务器的计算压力,而且可以快速返回结果并释放进程,从而也能缓解服务器的内存压力。

须要注意的是,缓存不要使用文件形式,可使用redis、memcached等基于内存的no sql缓存服务,而且与应用服务器分离,单独部署在局域网内。局域网内的网络IO确定比起磁盘IO要高。固然,为了避免使局域网带宽成为瓶颈,千兆网络也是有必要的。

3. 页面静态化

与数据缓存同样,页面数据本质上也属于数据,常见的手段是生成静态化的html页面文件,利用客户端浏览器的缓存功能或者服务端的缓存服务,以及CDN节点的缓冲服务,都可以下降服务器端的数据检索和计算压力,快速相应结果并释放链接进程。

4. 用户级别的调用频率限制

无论服务是有登录态仍是没登录态,基于session等方式均可觉得客户端分配惟一的识别ID(后称做SID),服务端能够将SID存到缓存中。当客户端请求服务时,若是没有带SID(cookie中或请求参数中等),则由服务端快速分配一个并返回。能够的话,本次请求能够不返回数据,或者将分配SID独立出业务服务。当客户端请求时带了合法SID(即SID能在服务端缓存中匹配到),即可以依据SID对客户端进行频率限制。而对于SID非法的请求,则直接拒绝服务。

相比根据IP进行的频率限制,根据SID的频率限制更加精准可控,最大程度的避免误杀的状况。

5. IP限制

最后,IP限制依然能够结合上述规则一块儿使用,可是能够将其前置到外层的防火墙或负载均衡器上去作,而且能够调大限制的阈值(结合历史统计数量,预测一个极端的访问量阈值,在服务器可承受的范围内,尽可能避免误伤),防止恶意访问穿透到应用服务器上,形成应用服务器压力。

扫描下方二维码或者微信搜索[phpjiagoushier],关注个人微信公众号[PHP架构],参与互动交流。

phpjiagoushier

相关文章
相关标签/搜索