拒绝服务(DOS/DDOS/DRDOS)
DOS是Denial of Service的简写,就是拒绝服务,
DDOS是Distributed Denial of Service的简写,就是分布式拒绝服务,
DRDOS是Distributed Reflection Denial of Service的简写,这是分布反射式拒绝服务的意思。

TCP握手协议

180px-Tcp_normal.png
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。(TCP three-way handshake)
1. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
DOS:
最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求就无法通过。连通性攻击指用大量的 连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
DDOS:
即是利用网络上已被攻陷的电脑作为“僵尸”,向某一特定的目标电脑发动密集式的“拒绝服务”式攻击,用以把目标电脑的网络资源及系统资源耗尽,使之无法向真正正常请求的用户提供服务。
DOS/DDOS/DRDOS - 图3
常用手段
常见的DDoS攻击手段有SYN Flood、Ping of Death、ACK Flood、UDP Flood、ICMP Flood、TCP Flood、Connections Flood、Script Flood、Proxy Flood(CC Flood)等。

DRDOS:
攻击时,攻击者巧妙的利用了反弹服务器群(Web服务器、DNS服务器及路由器)来将洪水数据包反弹给目标主机.
攻击者利用特殊的发包工具把伪造的来源地址(受害者地址)的SYN连接请求包发送给那些大量的被欺骗的服务器,根据TCP三次握手规则,这些服务器群会向源IP发出大量的SYN+ACK包来响应这个请求。黑客所发送的请求包的IP地址是被害者的地址,这样受欺骗的计算机就会把回应发到受害处,攻击者利用TCP/IP缺乏认证这一缺陷,不断重复发出这种伪装的请求,这样受欺骗的主机群的回应数据包就会像洪水一样向目标机器涌来,造成该主机器忙于处理这些回应而被拒绝服务攻击。恶意的数据包其实就被那些被利用的主机“反射”到了受害者主机上。这些被反射的数据包返回到受害者主机上后,就形成了洪水攻击。
一个比较完善的DRDoS攻击体系包括以下四部分:
(1)主控端:黑客所用的主机,也称为攻击主控台。它操纵整个攻击过程,向代理攻击端发送攻击命令;
(2)代理攻击端:是攻击者非法侵入并控制的一些“傀儡”机,在攻击者控制下同时向反弹服务器端发送伪造源地址的连接请求数据包;
(3)反弹服务器:接收代理攻击端发送的虚假数据包,向目标服务器发出SYN+ACK或RST包来响应这个请求;
(4)目标服务器:被攻击的目标主机

DOS/DDOS/DRDOS - 图4

区别:Smurfing攻击是网络层反弹攻击,它是以向广播地址发送ICMP ECHOREQUEST信息包来构成攻击,且有一个针对攻击目标的伪造来源,使得网络上的每个系统都向目标发送回ICMP ECHO REPLY信息包。

扩展阅读:
分布式反射拒绝攻击(DRDOS)详解:http://wenku.baidu.com/view/2c0bbcda50e2524de5187e10.html
参考:
1,http://www.cnblogs.com/coderzh/archive/2008/09/17/1292808.html
2,http://zh.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E5%BC%8F%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A
3,hackthegame,黑客精英(UPLINK)

DoS

DoS(Denial of Service,拒绝服务攻击),它的原理很简单,就是用我们手里的机器去给服务器发请求,如果我们手头的服务器各方面性能都比服务器的主机的性能好,那么当我们发送大量请求给服务器,占用服务器的资源,导致服务器没有能力去处理其他用户请求。
为了加深大家的理解,我就详细介绍DoS攻击中最有名的实现方式:Syn-Flood攻击。在具体介绍之前,我先和大家温故一下什么是三次握手。所谓的三次握手,就是在建立TCP连接的时候,客户端和服务器需要做几次通讯,确认相互之间的信息。它是保证TCP协议可靠性的重要手段之一。下面我们就来看一下它的具体流程:
DOS/DDOS/DRDOS - 图5
1、客户端(Client)首先向服务器(Server)发送连接请求,请求内容是:SYN=1 Seq=X;
2、服务器收到这个包以后,将这个数据放入到一个队列中,这个队列叫syn_table。并且发送一个返回包,作为响应,这个返回包有自己的序列号(Seq=Y),以及一个Ack,Ack的值就是客户端发来的Seq值加一;
3、客户端收到返回信息以后,将服务器的Seq加一作为Ack又发给服务器;
4、服务器收到这第三个包,验证没问题以后,就将这个连接放入到request_sock_queue
,三次握手完成。
以上就是三次握手的具体流程。看到这里大家可能会有个疑问,平时我们在和服务器建立连接的时候仅仅调用connect,我们并没有进行三次握手,实际上connect这个高层概念是对三次握手的抽象,它的具体实现完成了三次握手流程。
面对TCP的三次握手协议,攻击者应该如何发起攻击呢?攻击者首先故意发起一个握手数据包,服务器收到以后将它放入等待队列,并返回确认。其次,攻击者不再发送第3个确认包,这样一来,服务器就会进行多次重传发送(Linux系统通过tcp_synack_retries配置重传次数),消耗了大量额外开销,以及等待队列被占用,甚至于等待队列被占满,最终导致服务器不能接收客户端的请求。这就是Syn-Flood攻击。
目前,我们是采取何种方法来解决Syn-Flood攻击的呢?第一种方法,缩短等待时间,尽早删除在等待队列中等待非法请求数据包;第二种方法是在第一次握手报文不放入等待队列,我们将一个32位的无符号整数作为第二次握手的Seq返回给客户端,该整数通过将用户请求的参数(包括请求的地址、端口等),加上服务器的一个序列号等做了一次运算得到。如果是正常用户,它在收到这个整数之后加1作为ACK返回给服务器,服务器在拿到数据后,对这个ACK减1再进行逆运算得到各个参数,最后发出去的数据进行比对,如果完全一致,说明是一个有效的响应,存放到相应的数据结构,反之则不是。通过该方法,非法请求就不能占用系统资源了。

DDoS

DDoS(Distributed Denial of Service,分布式拒绝服务),它是DoS家族里很难防范的一种攻击方式,攻击者首先控制大量肉鸡,然后向目标服务器发送海量请求,导致目标服务器不可用。这里我们不禁要问攻击者是如何获取大量肉鸡的呢?攻击者会对某些APP或网站植入一些恶意代码,譬如说curl www.mukedada.com,用户在使用这款APP或网站时,会自动请求www.mukedada.com这个网站,如果这款APP或网站的活跃用户数很多,那么这个网站就会受到很多莫名的请求。这就要求我们在平时上网过程中不要浏览一些不知名的网站和下载来源不明的APP。
针对这种攻击方式,我们该如何防御呢?首先,作为用户我们尽量从正规渠道下载APP以及文明上网,尽量不让自己做肉鸡;其次,作为服务厂家,当服务器受到DDoS攻击时,我们尽量提升服务器的处理能力,当我们服务器的处理能力大于攻击者的能力时,这些攻击对服务器就不算啥事;最后,一般情况下,我们的服务器的处理能力一般低于攻击者的能力,针对这种情况,目前有以下几种方法:1.暴力方式,譬如:设置访问频率阈值,当某个IP单位时间内访问次数超过这个阈值就拒绝;对于某个服务,如果瞬时请求过大,选择直接拒绝保证其他服务的正常工作;这种方式可能导致正常用户也无法使用。2.验证码,为了防止暴露方式带来的误伤正常用户,目前服务商在收到大量请求时,会向”用户”发送验证码,如果是真实用户则会输入验证码,而是肉鸡的话,则不会,通过该方法则分辨出真实用户和肉鸡。

DRDoS

通过上文介绍,DDos攻击需要获取大量的肉鸡,但是获取肉鸡也越来越困难了,那目前还有没有不用控制肉鸡还能大量攻击的呢?DRDoS((Distributed Reflection Denial of Service,分布式反射拒绝服务),攻击者将不是将请求直接发送给被攻击者,而是发送给一个第三方,通过第三方中转到被攻击者,这就是”Reflection”的体现。它的流程具体如下:攻击者将请求包的源IP篡改成要被攻击者的IP,目标IP是第三方IP,那么第三方的恢复报文的目标IP就变成被攻击者的IP,这样一来,被攻击者就会收到大量请求导致服务不可用。
DOS/DDOS/DRDOS - 图6
需要注意的是:1. 攻击者往往选择的是基于UDP协议的系统,因为UDP协议是不可靠的,能够伪造源IP; 2. 攻击者往往会选择那些响应包大于请求包的服务。基于此,一般被被攻击的服务包括DNS服务、Memcached服务等。
为了加深大家理解,我就以Memecached服务为例。首先,Memcahced运行在11211端口,支持TCP和UDP一些,也就是说攻击者能够伪造源IP,同时,Memcached支持最大键值但数据对1M存储,意味着攻击者用较小的请求包让攻击者收到变大了几十倍的数据包。
对于这种攻击,有没有方法来防范呢?首先,扩大服务器的宽带;其次,尽可能选择TCP协议;最后,对于一些被放大的返回包直接进行丢弃。