本章我们了解DDoS防护的TCP部分,上篇主要介绍了syn_flood攻击,今天介绍其他主要类型的攻击方式和防御原理。
1.synack/ack/reset flood 攻击和防御
synack flood攻击:
syn_ack报文出现在连接建立的第2个报文,用来确认第一次握手的syn包。当服务器收到syn_ack报文后会在系统里查询是否属于3次握手的范畴。如果属于则回复ack,并将连接设为连接状态。若没有查到相关信息,则回复reset。(这里window协议实现与Linux有所不同,这里仅讨论Linux)。当攻击者发送大量的syn_ack进行攻击时,服务器将会为处理这些报文而消耗大量的资源。
也许你发现这里可能还有另一种潜在的危害,就是当服务器主动外联时,发送完syn,等待synack包时,收到了攻击者发送的synack报文而导致,连接建立失败。其实严格意义上说这种情况是存在的。可这种情形发送在攻击的报文五元组匹配并且seq-ack也正确匹配的情况。概率极低,忽略不计。
synack flood 防御:
1. 如果服务器没有主动发起连接的需求,直接将所以syn_ack包丢弃即可。
2. 如果有对外连接的需求,则可利用源认证的方式防御,具体防护原理为:
向syn_ack的目标IP,端口发送syn报文,能在固定时间内返回,并且序列号匹配则说明该IP,端口确实提高了服务,加入白名单。多次未防护的加入黑名单。
其他包类型的flood攻击:
主要的攻击原理都为利用大量的无效数据包,消耗服务器资源。由于攻击报文命中五元组和序列号的概率极低,所以对正常连接破坏有限(服务器资源充足的情况下)。
针对这些类型的攻击的处理方式也正是利用上面的特点。在连接建立的时候,利用syn_reset ,syn_cookie认证,认证通过之后,为每个tcp连接建立一个会话,保存五元组和序列号信息,只有匹配的包才转发到服务器,不匹配的丢弃。
2.TCP连接耗尽攻击/慢连接攻击
连接耗尽攻击:这种攻击方式也许是TCP攻击中,消耗资源最严重的攻击方式。通常黑客发起连接耗尽型的攻击的代价也比上述的要高的多。
那么让我们先来了解一下,一个TCP连接,将大致占用多少资源,通常服务器又能接受多少的连接的?下面以Linux系统为例,我们做一下简要的分析:
在三次握手完成之后,内核会为每个连接分配相应的结构,保存TCP连接相应的控制信息,接收缓冲和发送缓冲。默认情况下占用大概10K的内存。
通常的连接耗尽攻击会发起10~ 100w的连接,大致占用100M ~ 1G的内存,也许你会觉得很少。但大量的空连接占用的不只是这些,攻击者通常还会建立后立马会fin报文结束连接。每个TCP连接都需要维护状态。不断的发起和断开,系统将不断分配和释放资源,将会大大增加系统的调度负担,同时上层应用也将在建立和断开连接上消耗大量的CPU,造成服务器不可以用。
该类型还有另一种演化的攻击方式,慢连接攻击:例如通常的post请求都会在http头部设置content-length字段表明。请求的字节数,服务器应用通常获取到之后,会在连接上持续接收内容直到获取到指定长度的数据。黑客正是利用这个处理过程,比如:连接建立后,发送的http头指定长度content-length:10000,如何每秒发送1字节的数据。这样一样很少的连接就可能造成服务器占用严重,无法提供服务。
防御原理:
报文经过防御系统后防御系统将记录每个IP的连接行为做出标记:比如可分为正常,异常,可疑等级别。达到一定次数加入黑名单。
具体如空连接异常的判断标准为在连接建立和关闭过程中,或者建立后长时间,没有正常的数据交互过程,则可判定为空连接。
慢连接:建立后报文交互缓慢,一定时间内总传输数据小于特定值,则视为慢连接异常。
3.异常报文攻击
TCP为了实现全双工的流传输,定义了负载的各种流控,并且整个传输过程都根据数据包中的标志位,进行状态机的状态切换。发送大量的异常报文,可能导致协议栈处理的过程中发送错误,而使系统奔溃。
防御方式较为简单:
1.是基于上述提到过的tcp会话机制,加入状态的检查,特定状态下只接收特意的允许的类型的报文。
2.过滤畸形报文,如syn,synack报文中一定不带负载。过滤分片报文等(有一定概率误拦截)。
总的来说,利于上述的防御原理,基于TCP的特性,在带宽充足的情况下,防御效果基本良好。针对连接耗尽类型的攻击,还需要根据业务的特征,来定制连接的识别。比如基于用户的登录信息等等。