什么是 DDoS 攻击?
28 Dec 2025
对于DDoS(分布式拒绝服务)攻击,人们往往谈虎色变。它被认为是安全领域中最难解决的问题之一,迄今为止也没有完美的解决方案。
在介绍DDoS之前,我们先了解一下拒绝服务(DoS)攻击。DoS的英文全称是 of ,DoS攻击是指通过某种手段使目标计算机或网络无法提供正常服务,影响正常用户。比如一个停车场有100个停车位,如果有人用障碍物恶意霸占车位,或者故意损坏停车场设施,导致其他车辆不能正常使用车位,停车场无法正常提供服务,这就是拒绝服务攻击。
一个恶意用户对停车场的影响有限,但是如果他叫来100个朋友都来停车,把车位全占了,导致停车场彻底不可用,那么停车场入口就会排起长队,这种规模更大的拒绝服务攻击就称为“分布式拒绝服务”( of ,DDoS)攻击。
我们的系统就好比停车场,系统中的资源就是车位。资源是有限的,而服务必须一直提供下去。如果资源全部被占用,或者系统被恶意破坏,就导致系统停止响应。
拒绝服务攻击的方式有很多种,比如触发了服务器Bug,导致服务器进程崩溃DDOS,或者大量恶意的请求导致服务器的CPU、内存、磁盘等资源被过度消耗,还有网络流量劫持、DNS劫持都可能导致服务中断,都可以被称为拒绝服务攻击。
多台计算机节点共同发起拒绝服务攻击(通常是消耗目标服务器资源),就能形成规模效应。这些攻击节点往往是黑客们所控制的“肉鸡”,当肉鸡数量达到一定规模后,就形成了一个“僵尸网络”。在大型的僵尸网络中,肉鸡数量甚至能达到数万、数十万的规模。如此大规模的僵尸网络发起的DDoS攻击,几乎是不可阻挡的。图21-1为DDoS攻击示意图。
常见的DDoS攻击有SYN flood、UDP flood、UDP反射放大攻击等。其中SYN flood是一种最为经典的DDoS攻击,于1996年被发现,至今仍然保持着非常强大的生命力。SYN flood如此猖獗,是因为它利用了TCP协议设计中的缺陷,而TCP/IP协议是整个互联网的基础,牵一发而动全身,如今想要修复这样的缺陷几乎是不可能的事情。
正常情况下,TCP三次握手的过程如图21-2所示。
(1)客户端向服务端发送一个带有SYN标志位的包,包含了客户端使用的初始序列号x。
(2)服务端收到客户端发送的SYN包后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含确认号x+1和服务器端的初始序列号y。
(3)客户端收到服务端返回的SYN+ACK报文后,向服务端返回一个ACK置位且确认号为y+1的报文。至此,一个标准的TCP连接就完成了,双向都可以收发数据。
TCP连接被设计成需要三次握手,是为了让双方都确认与对方建立的连接可以正常收发数据,即连接是双工的。
在SYN flood攻击中,攻击者向服务端发送大量伪造源IP地址的SYN包,此时服务端会返回SYN+ACK包,因为源IP地址是伪造的,所以伪造的IP地址并不会应答ACK包,而服务器端没有收到ACK回应包,就会等待一段时间(默认为75秒),此时的连接状态称为半开连接,如果超时则丢弃这个连接。虽然是半开连接,服务端也需要为它们分配系统资源,并使用一个队列来存储这些半开连接。如果攻击者大量发送这种伪造源IP地址的SYN报文,服务端将会消耗非常多的资源(CPU和内存)来处理这种半连接,同时半开连接数量会超过队列中连接数的最大限制。最后的结果是,服务端没办法处理正常的连接请求,因而拒绝服务。图21-3为SYN flood攻击示意图。
对抗SYN flood的主要措施有SYN 、SYN Proxy、Safe Reset等算法。SYN 的主要思想是在服务端不存储半开连接信息,而是根据客户端的SYN包,通过一定的算法计算响应的SYN+ACK报文的初始序列号y,一般是用HMAC算法,所以这个序列号并不是随机生成的,而是服务端秘密生成的。如果客户端真的要建立连接,它会再发送ACK报文并且确认号ack=y+1。服务端收到后,将以同样的算法再次计算序列号,如果它的值等于ack-1,就说明这个确认号ack是合法的,服务端从这个时候开始才真正为这个连接分配资源并建立连接。
所以,开启SYN 后,半开连接不会占用队列,不消耗服务端的内存。但是为了生成这个特殊的序列号,服务器端需要做额外的密码学计算。
Safe Reset方案一般在网络防火墙中使用。接收到客户端的SYN报文后,防火墙返回一个确认号错误的SYN+ACK报文,真实的客户端在发现错误后会回应一个RST报文,这样防火墙就知道这个IP地址是真实客户端,并将其添加到白名单中,后面如果客户端重新请求连接时就将它放行。而虚假的源IP地址不会有回应,所以它们就不会被列入白名单。
反射放大型攻击是近几年非常流行的DDoS攻击方式,超大流量的DDoS攻击多数是由反射放大型攻击产生的。绝大部分反射放大型攻击是UDP协议的,因为UDP是无连接的协议,当客户端伪造源IP地址访问UDP服务时,服务端会把响应内容返回给伪造的源IP地址,所以当攻击者把源IP地址指定为攻击目标时,响应内容就被发送给了攻击目标。如果一个UDP服务的响应内容远大于请求内容,攻击者就借助UDP服务实现了四两拨千斤的放大攻击效果。图21-4为UDP反射放大型攻击示意图。
比如,支持使用UDP协议来操作数据,如果攻击者找到一台互联网上的服务器,事先往其中存储一个超长内容的值,然后伪造成受害者的IP地址来读取这个值,那么读取出来的超长结果就被返回给了受害者。
在很多对抗DDoS的产品中,一般会综合使用各种算法,结合DDoS攻击的一些特征,对流量进行清洗。对抗DDoS的网络设备可以串联或者并联在网络出口处。
但DDoS攻击仍然是业界的一个难题,当攻击流量超过了网络设备或者带宽的最大负荷时,网络将瘫痪。一般来说,大型网站之所以看起来比较能“抗”DDoS攻击,是因为大型网站的带宽比较充足,集群内服务器的数量也比较多。但一个集群的资源毕竟是有限的,在实际的攻击中,DDoS的流量甚至可以达到每秒数Tb,遇到这种情况,只能与网络运营商或云厂商合作,共同完成DDoS攻击的响应。
本文节选自《白帽子讲web安全第二版》,Web安全领域的小伙伴,大都应该看过科学家级天才黑客道哥吴翰清的《白帽子讲Web安全》!这本书,可谓安全从业者的标配,不仅国内小伙伴给出的好评如潮,收获了豆瓣8.2的高分,还被美国斯普林格出版社隆重引进在全球发行英文版,这在安全著作中也是独一份的待遇!!!
距本书第1版的出版转眼过去了11年,第2版也是在2023年8月正式出版上市,在这次修订中,道哥邀请曾经的老同事叶敏,来担任第二作者。书中修订了大量章节,更正了一些错漏和过时之处,同时新增了移动互联网、云计算、机器学习、等许多新领域的安全知识,使得第2版能够跟上时代的发展。