其实防御CC攻击如同当初防御DDOS攻击本质上是一样的,这些攻击都是以消耗服务器资源为目的的。DDOS攻击的原理是针对TCP/IP协议的一项缺陷,当时设计者以为互联网使用者都是互联网的良民,不过现在的互联网环境可是要复杂的多。
两台机器通信要进行一个所谓的三次握手,首先是客户机发出一个请求 (SYN) ,服务器收到该请求后,填写会话信息表 (TCB,保存在内存中),并且向客户机反馈一个回应包 (SYN-ACK) ,此时连接处于 TIME_WAIT 状态,如果最终没有收到客户机的 ACK 信息包,会尝试隔一段时间再发送一次回应包 SYN-ACK,这样经过多次重试后,客户机还没有回应的话,服务器才会关闭会话,并从 TCB 中删除掉该会话。这个等待过程大约为 30 秒。当攻击者同时发起十万计的请求时 (SYN) 到服务器开放的端口,并且本身拒绝发送 SYN-ACK 回应时,服务器的的 TCB 将会很快超过负荷,并且攻击者可以伪造包中的源 IP 地址,这样攻击者还不会被服务器返回的包堵住。可以看出这是 TCP/IP 协议中一个相当严重的问题。通过防火墙策略审核过滤数据包,可以从一定程度上防止 DDOS 攻击。
目前看来,CC攻击主要针对 WEB 应用程序比较消耗资源的地方进行疯狂请求,比如,论坛中的搜索功能,如果不加以限制,任由人搜索,普通配置的服务器在几百个并发请求下,MYSQL 服务就挂掉了。
想要防御CC攻击,就要知道它的的种类有三种,直接攻击,代理攻击,僵尸网络攻击。
直接攻击主要针对有重要缺陷的 WEB 应用程序,一般说来是程序写的有问题的时候才会出现这种情况,比较少见。僵尸网络攻击有点类似于 DDOS 攻击了,从 WEB 应用程序层面上已经无法防御,所以这两种情况我们不进行深入的探讨。
这里要主要讨论第二种,代理攻击,CC 攻击者一般会操作一批代理服务器,比方说 100 个代理,然后每个代理同时发出 10 个请求,这样 WEB 服务器同时收到 1000 个并发请求的,并且在发出请求后,立刻断掉与代理的连接,避免代理返回的数据将本身的带宽堵死,而不能发动再次请求,这时 WEB 服务器会将响应这些请求的进程进行队列,数据库服务器也同样如此,这样一来,正常请求将会被排在很后被处理,就象本来你去食堂吃饭时,一般只有不到十个人在排队,今天前面却插了一千个人,那么轮到你的机会就很小很小了,这时就出现页面打开极其缓慢或者白屏。
防御 CC 攻击
Discuz!5.5 在以往抗 CC 的基础上又加了两种方法,可以根据实际遭受攻击的情况,通过配置组合出适合的抵抗方法。限于篇幅,不详细阐述对抗原理,现将配置方法做下简要说明。
配置文件 config.inc.php
$attackevasive = 0; // 论坛防御级别,可防止大量的非正常请求造成的拒绝服务攻击
// 防护大量正常请求造成的拒绝服务攻击
// 0=关闭, 1=cookie 刷新限制, 2=限制代理访问, 4=二次请求, 8=回答问题(第一次访问时需要回答问题)
// 组合为: 1|2, 1|4, 2|8, 1|2|4...
正常情况下设置为 0,在遭到攻击时,分析其攻击手法和规律,组合使用。可以尝试先设置为 2, 2|4, 1|2|4|, 1|2|4|8, 如果 1|2|4|8 还不行,我们认为应用程序层面上已经抵挡不住,可能主机遭受的攻击来自于僵尸网络的 DDOS 攻击了,我们建议您从防火墙策略上入手。