Skip to content
Go back

DDoS攻击详解:从僵尸网络到流量清洗

DDoS 攻击详解:从僵尸网络到流量清洗

一句话结论(30s)

DDoS 是「不对称的资源消耗战」而非精巧漏洞——因为攻击者用几乎零成本的僵尸网络海量流量,去消耗防守者高成本的带宽与算力,所以它难以根治,防护核心只能是用更大的资源(CDN / 清洗中心)去「消化」攻击流量。

核心原理(2min)

底层深入(5-10min)

DDoS(Distributed Denial of Service,分布式拒绝服务)攻击就像一群人同时挤在一个小小的便利店门口,让真正的顾客进不去。它不是黑客入侵的精致手术,而是用海量的”垃圾流量”淹没目标的粗暴洪水。

从DoS到DDoS:一字之差,天壤之别

DoS(拒绝服务)是单机攻击——一台机器疯狂发包打瘫一个服务。这种攻击容易被封禁IP,防御方拉黑一个IP就行。

DDoS加了一个”D”(Distributed),攻击流量来自成千上万台被控制的机器——这就是僵尸网络(Botnet)。攻击者(Botmaster)通过C&C(Command & Control)服务器远程控制这些”肉鸡”(被植入恶意程序的机器),一声令下万众齐发。你封一个IP,还有九千九百九十九个在攻击。

三大主流攻击手法

SYN Flood(半连接洪水)

TCP要三次握手才能建立连接。SYN Flood利用这个机制:攻击者发送大量SYN包,源IP是伪造的(不存在或不可达)。服务器回复SYN-ACK后,因为源IP是伪造的,永远收不到最后的ACK,于是在**半连接队列(SYN Queue)**中积累大量SYN_RECV状态的连接。

这个队列是有限的(Linux中由net.ipv4.tcp_max_syn_backlog控制,默认通常为128-256),一旦被填满,正常用户的SYN请求就被丢弃。

防御手段:SYN Cookie。收到SYN时不立即分配半连接资源,而是用客户端的IP、端口、时间戳等信息计算一个Cookie编码到SYN-ACK的序列号中。只有收到合法的ACK(含正确的Cookie+1)时才真正分配连接资源。这样攻击者发多少SYN都消耗不了半连接队列。

思考:SYN Cookie 为什么能化解半连接耗尽?因为它把「分配资源」从握手第一步推迟到了最后一步——收到 SYN 时不占队列,而是把客户端信息算成一个 Cookie 塞进 SYN-ACK 的序列号里,只有收到携带正确 Cookie+1 的 ACK 才真正建连。攻击者伪造源 IP 收不到回包、回不了 ACK,自然占不到资源。

UDP反射放大攻击

UDP是无连接的,攻击者可以伪造源IP。经典的攻击链路:

  1. 攻击者伪造受害者IP,向互联网上的开放DNS/NTP/Memcached服务器发小请求。
  2. 这些服务器向”源IP”(受害者)返回比请求大几十倍到几百倍的响应。
  3. 受害者被海量响应包淹没。

这就是”反射+放大”:攻击者花1Mbps的流量,受害者收到100Mbps甚至1Gbps的回复。Memcached的放大倍数可达5万倍——发一个15字节的请求,收到750KB的响应。

思考:放大倍数凭什么能到几万倍?因为反射服务器「回错了人」——攻击者伪造受害者 IP 发一个小请求,反射服务器却把远大于请求的响应发给受害者。响应体越大、请求体越小,放大比越高:Memcached 一个 15 字节请求能换回 750KB 响应,攻击者用 1Mbps 就能让受害者承受 1Gbps,这就是不对称战力的来源。

HTTP Flood(应用层洪水)

比协议层攻击更难防御,因为HTTP Flood发的是完全合法的HTTP请求——三次握手也做完了,Cookie也带了,URL也是对的,跟正常用户一模一样。唯一的区别是:太多了。

这种攻击恶意消耗应用层资源(CPU、数据库连接、内存),常规的防火墙和SYN Cookie对它无效。防御需要应用层的流量分析:同一IP的请求频率、请求模式是否异常、User-Agent是否单一等。

思考:为什么「完全合法的请求」反而最难防?因为合法意味着防火墙不能靠「包长异常、协议畸形」这类硬特征一刀切。HTTP Flood 和正常流量在报文层面几乎一样,唯一区别是「量」,只能靠应用层行为分析(频率、UA 分布、模式)去猜谁是机器人——猜就有误判风险,这正是它的棘手之处。

防御体系:纵深防御

单靠一种手段挡不住DDoS,需要多层递进的防御:

第一层:网络层防火墙

限制SYN速率、限制单IP并发连接数、丢弃明显伪造的包(如源IP为内网地址的包从公网进来)。这一层过滤掉最低级的攻击流量。

# Linux上限制SYN速率
iptables -A INPUT -p tcp --syn -m limit --limit 100/s --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

第二层:CDN与反向代理

CDN的天然优势是分布式节点多、总带宽大。攻击流量被分散到全球各节点,单个节点扛不住就调度走。Cloudflare、Akamai等CDN厂商提供的DDoS防护,本质上是用巨大的带宽池和节点数量来”硬扛”。

第三层:流量清洗

当攻击流量大到一定程度,运营商(ISP)或专业清洗服务在骨干网上就把攻击流量过滤掉——在流量到达目标服务器之前就”洗干净”。清洗中心通过深度包检测(DPI)识别攻击特征(包长度分布、协议比例异常、源IP分布异常),动态生成过滤规则。

第四层:应用层防护

对于HTTP Flood类攻击,使用WAF(Web Application Firewall,Web应用防火墙)做行为分析:验证码(CAPTCHA)、JS挑战(验证浏览器环境)、人机识别等。

总结:DDoS的本质

DDoS不是”精妙的技术漏洞”,而是”不对称的资源消耗战”——攻击者用低成本(僵尸网络的成本分摊到每个肉鸡几乎为零)对抗防守者的高成本(带宽、计算、运维)。理解了这种不对称性,你就理解了为什么DDoS如此难以根治,以及为什么防护的核心思路始终是:用更大的资源(CDN/清洗中心)来”消化”攻击流量。

章末提问

Q1:SYN Flood 为什么能打瘫服务器?SYN Cookie 是怎么防的?

结论先行:SYN Flood 靠伪造源 IP 塞满有限的半连接队列,让正常请求进不来;SYN Cookie 则是「先不分配资源」,把验证信息编码进 SYN-ACK 序列号,收到合法 ACK 才建连。因为半连接队列容量固定,攻击者发大量 SYN 且永不回 ACK,队列就被 SYN_RECV 占满;SYN Cookie 绕开了队列的提前占用,攻击者发多少 SYN 都占不到资源。

Q2:UDP 反射放大攻击为什么能放大几万倍?

结论先行:因为它「借刀杀人」——伪造受害者 IP 让开放服务器把大响应反射给受害者。因为 UDP 无连接、源 IP 可伪造,攻击者花极小代价发出小请求,反射服务器却返回远大于请求的响应,放大比 = 响应大小/请求大小,Memcached 可达 5 万倍,最终受害者被海量响应淹没。

Q3:为什么说 DDoS 无法根治?

结论先行:因为它是「不对称的资源消耗战」,攻防成本天然不对等。因为攻击者用近乎零成本的僵尸网络流量,去消耗防守者高成本的带宽与算力,防守方永远在被动「消化」;所以防护思路只能是用更大的资源(CDN/清洗中心)去扛,而不是像漏洞那样「打补丁根治」。


Share this post on:

Previous Post
DNS over TCP vs UDP:为什么域名解析默认走UDP
Next Post
Cookie、Session、JWT——三种会话机制的选型与实践