1 DDoS:Distributed Denial of Service


DDoS***,即分布式拒绝服务***,是目前***经常采用而难以防范的***手段。***一般是通过制作僵尸网络的方式***域名,即在计算机中植入特定的恶意程序控制大量“肉鸡”(指可以被***远程控制的机器),然后通过相对集中的若干计算机向相对分散的大量“肉鸡”发送***指令,引发短时间内流量剧增。主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大、最难防御的***之一。

按照发起的方式,可分为三类:

第一类以力取胜,海量数据包从互联网的各个角落蜂拥而来,堵塞IDC入口,让各种强大的硬件防御系统、快速高效的应急流程无用武之地。这种类型的***典型代表是ICMPFlood和UDPFlood,现在已不常见。


第二类以巧取胜,灵动而难以察觉,每隔几分钟发一个包甚至只需要一个包,就可以让豪华配置的服务器不再响应。这类***主要是利用协议或者软件的漏洞发起,例如Slowloris***、Hash冲突***等,需要特定环境机缘巧合下才能出现。


第三类是上述两种的混合,轻灵浑厚兼而有之,既利用了协议、系统的缺陷,又具备了海量的流量,例如SYNFlood***、DNSQuery Flood***,是当前的主流***方式。


2 ***方式


2.1 SYN Flood


SYN Flood***利用了TCP三次握手的缺陷:***者伪装大量的IP地址给服务器发送SYN报文,由于伪造的IP地址几乎不可能存在,也就几乎没有设备会给服务器返回任何应答了。因此,服务器将会维持一个庞大的等待列表,不停地重试发送SYN+ACK报文,同时占用着大量的资源无法释放。更为关键的是,被***服务器的SYN_RECV队列被恶意的数据包占满,不再接受新的SYN请求,合法用户无法完成三次握手建立起TCP连接。也就是说,这个服务器被SYN Flood拒绝服务了。


2.2 DNS Query Flood


DNS Query Flood就是***者操纵大量傀儡机器,对目标发起海量的域名查询请求。为了防止基于ACL的过滤,必须提高数据包的随机性。常用的做法是UDP层随机伪造源IP地址、随机伪造源端口等参数。在DNS协议层,随机伪造查询ID以及待解析域名。随机伪造待解析域名除了防止过滤外,还可以降低命中DNS缓存的可能性,尽可能多地消耗DNS服务器的CPU资源。


2.3 HTTP Flood


HTTP Flood是针对Web服务在第七层协议(应用层)发起的***。它的巨大危害性主要表现在三个方面:发起方便、过滤困难、影响深远。

HTTP Flood***通过端口扫描程序在互联网上寻找匿名的HTTP代理或者SOCKS代理,***者通过匿名代理对***目标发起HTTP请求。匿名代理是一种比较丰富的资源,花几天时间获取代理并不是难事,因此***容易发起而且可以长期高强度的持续。

HTTP Flood***在HTTP层发起,极力模仿正常用户的网页请求行为,与网站业务紧密相关,安全厂商很难提供一套通用的且不影响用户体验的方案。

HTTP Flood***会引起严重的连锁反应,不仅仅是直接导致被***的Web前端响应缓慢,还间接***到后端的Java等业务层逻辑以及更后端的数据库服务,增大它们的压力,甚至对日志存储服务器都带来影响。


2.4 慢速连接***:Sloworis


***者在HTTP请求头中将Connection设置为Keep-Alive,要求Web Server保持TCP连接不要断开,随后缓慢地每隔几分钟发送一个key-value格式的数据到服务端,如a:b,导致服务端认为HTTP头部没有接收完成而一直等待。如果***者使用多线程或者傀儡机来做同样的操作,服务器的Web容器很快就被***者占满了TCP连接而不再接受新的请求。


3 防御


3.1 SYN Flood防御


SYN Flood***大量消耗服务器的CPU、内存资源,并占满SYN等待队列。相应的,我们修改内核参数即可有效缓解。主要参数如下:

net.ipv4.tcp_syncookies = 1      #启用SYN Cookie

net.ipv4.tcp_max_syn_backlog = 8192   #设置SYN最大队列长度

net.ipv4.tcp_synack_retries = 2      #设置SYN+ACK最大重试次数

SYN Cookie的作用是缓解服务器资源压力。启用之前,服务器在接到SYN数据包后,立即分配存储空间,并随机化一个数字作为SYN号发送SYN+ACK数据包。然后保存连接的状态信息等待客户端确认。启用SYN Cookie之后,服务器不再分配存储空间,而且通过基于时间种子的随机数算法设置一个SYN号,替代完全随机的SYN号。发送完SYN+ACK确认报文之后,清空资源不保存任何状态信息。直到服务器接到客户端的最终ACK包,通过Cookie检验算法鉴定是否与发出去的SYN+ACK报文序列号匹配,匹配则通过完成握手,失败则丢弃。

tcp_max_syn_backlog则是使用服务器的内存资源,换取更大的等待队列长度,让***数据包不至于占满所有连接而导致正常用户无法完成握手。

net.ipv4.tcp_synack_retries是降低服务器SYN+ACK报文重试次数,尽快释放等待资源。

ps:可能消耗服务器更多的内存资源,甚至影响正常用户建立TCP连接,需要评估服务器硬件资源和***大小谨慎设置。


3.2 HTTP Flood防御


HTTP Flood***防御主要通过缓存的方式进行,尽量由设备的缓存直接返回结果来保护后端业务。大型的互联网企业,会有庞大的CDN节点缓存内容。当高级***者穿透缓存时,清洗设备会截获HTTP请求做特殊处理。最简单的方法就是对源IP的HTTP请求频率做统计,高于一定频率的IP地址加入黑名单。这种方法过于简单,容易带来误杀,并且无法屏蔽来自代理服务器的***,因此逐渐废止,取而代之的是JavaScript跳转人机识别方案。HTTP Flood是由程序模拟HTTP请求,一般来说不会解析服务端返回数据,更不会解析JS之类代码。因此当清洗设备截获到HTTP请求时,返回一段特殊JavaScript代码,正常用户的浏览器会处理并正常跳转不影响使用,而***程序会***到空处。


3.3 DNS Flood防御


DNS***防御也有类似HTTP的防御手段,第一方案是缓存。其次是重发,可以是直接丢弃DNS报文导致UDP层面的请求重发,可以是返回特殊响应强制要求客户端使用TCP协议重发DNS查询请求。


3.4 慢速连接***防御


Slowloris***防御比较简单,主要方案有两个:

第一个是统计每个TCP连接的时长并计算单位时间内通过的报文数量即可做精确识别。一个TCP连接中,HTTP报文太少和报文太多都是不正常的,过少可能是慢速连接***,过多可能是使用HTTP1.1协议进行的HTTP Flood***,在一个TCP连接中发送多个HTTP请求。


第二个是限制HTTP头部传输的最大许可时间。超过指定时间HTTPHeader还没有传输完成,直接判定源IP地址为慢速连接***,中断连接并加入黑名单。



4 新型***方式


DNS 反射/放大***利用互联网上的DNS基础结构来放大***能够产生的通信量。DNS是用于主机名到IP地址解析的互联网基础设施的重要组成部分。DNS反射/放大***通过使用多个客户端肉机(bots僵尸肉机)将查询发送到多个开放DNS解析器中,从而使大量的***流量从广泛分布源中产生(在Spamhaus袭击期间,使用了超过30K开放解析器)。

                                                                                                                     ——Rango Chen