做运维这些年,被半夜电话吵醒的次数已经数不清了——不是服务器宕机,就是有人在打你的站。DDoS 这三个字母,圈子里早就讲烂了,但真正能把它讲透、讲得让零基础的人看懂并知道怎么应对的内容,反而没多少。大部分文章都停在“什么是 DDoS”“有哪几种攻击类型”这个层面,看完该懵还是懵。这篇不一样,我把整个攻击流程、常见攻击手法、防御逻辑和应急处理节奏整体过一遍,尽量说人话。目标就一个:哪怕你之前完全没接触过网络安全,读完这篇之后,也能在真出事时有一个清晰的应对框架。
1. DDoS 攻击到底是什么:从“网站突然打不开”说起
1.1 一个生活化的定义
DDoS 的全称是 Distributed Denial of Service,翻译过来是“分布式拒绝服务”。一句话概括:攻击者利用大量分散在各地的机器,同时向某个目标发起请求,把目标的带宽、连接数、CPU、内存等资源耗尽,导致正常用户无法访问。
很多人一开始会被“分布式”三个字绕晕,我用餐厅打个比方。一家餐厅正常一天接待一百个客人,某天有一群人被统一组织起来,在饭点同时涌进餐厅,把每个座位都坐满,却既不点餐也不离开。真正的顾客来了发现没位置,只能转身走人。餐厅本身没有被砸坏,但已经失去了正常营业的能力。这就是“拒绝服务”——不是把服务器打宕机了,而是让它忙到没法处理正常请求。
“分布式”的关键在哪?这一大群人不是从同一个地方来的,他们分散在城市各个角落,由幕后的人通过手机远程指挥,同一时间到达餐厅门口。换到网络世界里,就是大量的“肉鸡”机器同时向目标服务器发起请求或流量,从四面八方汇聚过来,目标再怎么努力也招架不住。
1.2 攻击能得手的三个核心条件
一场 DDoS 攻击要想成事,缺了这三个条件都玩不转,理解了它们,整个防御体系的思路也就顺了。
第一个条件是攻击者有足够的攻击资源。手里控制着成千上万台机器,流量规模才能上去。所以攻击者在动手之前,通常已经掌控了一个规模可观的“僵尸网络”。
第二个条件是攻击流量能够顺利到达目标。这不是废话。如果目标启用了 CDN 或者本地网络运营商拦截了一部分异常流量,攻击流量还没到源站就被挡住了一部分,攻击效果会大打折扣。
第三个条件,也是最重要的,目标自身的资源是有限的。一台服务器的带宽上限、能同时处理的 TCP 连接数、CPU 算力、内存大小、数据库连接池数量,全都是有限的。攻击者不需要打掉目标的所有资源,只要把其中一个短板打穿,比如带宽占满,或者连接队列耗尽,业务同样不可用。
这三个条件正好对应防御的三个方向:削弱攻击者的资源、在流量途中拦截、增强目标的资源冗余。后面所有解决方案,其实都是这三条路的具体实现。
1.3 零基础必须知道的三个网络概念
DDoS 相关的文章里会反复出现几个词,搞懂它们,后面看什么内容都不费劲。
第一个是 IP 和域名的关系。域名是给人看的,IP 是给机器找的,中间靠 DNS 解析建立联系。攻击者要真正打死一个网站,必须找到服务器真实 IP。很多网站套了 CDN,域名解析后指向的是 CDN 节点,真实源站 IP 被藏了起来,攻击者如果找不到源站,打到的只是 CDN 的防护节点。这也解释了为什么“隐藏源站 IP”是所有防御动作里最基础也最重要的一步。
第二个是 TCP 三次握手。客户端和服务器建立 TCP 连接,需要完成 SYN、SYN-ACK、ACK 三个步骤。三次握手本来是为了可靠通信,但后来很多人发现这个流程可以被利用——比如只发第一次握手就不再回应,让服务器一直等着,白白占用资源。著名的 SYN Flood 攻击就是这么来的。
第三个概念是带宽和 QPS。带宽决定了每秒能传输多少数据,单位是比特每秒;QPS 是每秒能处理的请求数。大流量攻击的目标是打满带宽,应用层攻击的目标是打满 QPS。这两种攻击手段完全不同,防御方式也不同,后面会展开讲。
2. 一次 DDoS 攻击的完整生命周期
标题里特意提到了“攻击流程”,这确实是理解 DDoS 的重中之重。很多人以为攻击就是“一堆机器同时发流量”,实际上一次合格的 DDoS 攻击有一套完整的步骤,从侦察到收尾环环相扣。
2.1 攻击者是如何选定目标的
攻击者一般不会随机挑一个网站就打,成本不允许,收益也不划算。我接触过的真实攻击场景里,目标往往有明确指向:有的是竞争对手在恶意打压,有的是被勒索团伙盯上,先打你几个小时,再发邮件要保护费,也有的是纯粹的技术炫耀或私人恩怨。
选定目标之后,攻击者会做一道“踩点”工作。他们要想办法确认目标的真实 IP、是否使用了 CDN、源站有没有完全隐藏、目标机房的带宽规模大概是什么级别、有没有部署高防设备。这些都是通过公开信息、历史解析记录、子域名探测等手段一点点拼凑出来的。
对防御者来说,这个阶段最容易被忽略。如果你发现某个时段有人大量扫描你的服务器端口、反复尝试域名解析记录、或者有人从不同 IP 频繁访问平时没人访问的路径,往往就是攻击前兆。把这些行为记录下来,提前加强防护,很可能就躲过了一次大麻烦。
2.2 僵尸网络如何组建
攻击资源不是天生的,需要提前囤积。攻击者通过批量扫描互联网,寻找暴露在公网、有安全漏洞的设备,最常见的是弱口令的路由器、摄像头、NAS,以及一批没来得及打补丁的服务器。这些设备被植入恶意程序后,就变成了一台台随时可控的“肉鸡”。
组建僵尸网络是一个持续的过程,可能耗时几个月,规模从几千台到几十万台不等。平时这些肉鸡正常运行,用户根本察觉不到,只有接到攻击指令时才进入疯狂发包状态。
这里有一个对普通企业很重要的事实:很多服务器被拖进僵尸网络,不是企业做了什么特别的事,仅仅是因为一台测试服务器暴露在公网上,密码没改,系统没更新。企业花大力气防 DDoS,结果自己的服务器成了攻击别人的帮凶,这种事在行业里一点都不新鲜。
2.3 指令下发与流量汇聚
准备就绪后,攻击者会选择一个“良辰吉日”动手。我见过的大多数攻击都选在业务高峰期,比如电商大促、开票日、节假日,因为这时候哪怕中断一个小时,损失都是实打实的。
攻击者通过控制服务器向所有肉鸡下发一条指令:把流量打到目标 IP。成百上千台机器收到指令后同时开火,流量从全国各地甚至全球各地涌来,汇集成一股远超目标带宽承受能力的洪流。目标机房的上联端口最先被打满,随之而来的是整个 IP 段网络拥塞,甚至波及同机房的其他租户。
这里有个很多新手不理解的细节:既然流量是从已知 IP 发来的,为什么不能直接封掉这些 IP?因为一来来源 IP 动辄几千上万个,二来很多攻击流量源地址被伪造过,根本封无可封。
2.4 攻击过程中的动态变化
真实的攻击不是一根筋打到底,攻击者会根据目标的反应不断调整策略。
如果目标启用了 CDN 或高防,攻击者发现打不到源站,可能反过来直接攻击 CDN 服务的某个节点;如果目标上了容量更大的防护带宽,攻击者会继续加大流量,打出更高峰值;有些攻击还会从单一类型变成多种类型混合,比如一边灌带宽,一边用应用层请求把源站的 CPU 打满。
攻击结束后的走向也不一样。勒索型攻击打完就停,等受害者联系付款;竞争型攻击会持续骚扰三五天,直到目标业务受损;还有一类低强度慢速攻击,流量不大,但隔一段时间就来一轮,像蚊子一样烦人,意图是让目标一直处于不稳定状态。
理解了攻击的生命周期,就能明白一个关键结论:防御 DDoS 不是“扛一下”的事情,而是在攻击前、攻击中、攻击后都要有一套明确策略,才能跟上攻击者的动态节奏。
3. 主流攻击类型逐个拆解:从网络层到应用层
DDoS 攻击虽然花样百出,但按攻击目标可以分成三大类:网络层攻击打带宽,传输层攻击打连接,应用层攻击打业务处理能力。每一类的原理、识别特征和防御思路都完全不同。
3.1 网络层攻击:企图灌满带宽
这类攻击的目标非常直接,就是尽量消耗目标的带宽资源。攻击者让肉鸡向目标发送海量数据包,直到目标机房的入口带宽完全被占满,正常流量进不来。
典型代表是 ICMP Flood,就是大量发送 Ping 请求,原理最简单,但防御也相对容易,很多机房会直接丢弃 ICMP 包。UDP Flood 更普遍,攻击者发送大量 UDP 数据包到目标端口,目标服务器收到后要耗费时间处理这些无意义的数据包。反射放大攻击则是这类攻击里的“重炮手”,攻击者用源地址伪装成目标 IP,向某个公开服务发送小查询,服务返回的响应却非常大,流量被放大了几十甚至上百倍,攻击者只需要很小成本就能制造出巨大的流量。
识别网络层攻击非常简单,看带宽曲线就够:正常情况下一条平滑曲线的位置,突然飙到接近实际带宽上限,基本就是这类攻击。
3.2 传输层攻击:耗尽连接资源
这类攻击不追求流量达到多么可怕的量级,它的目标是填满服务器的连接处理队列。最著名的就是 SYN Flood。
原理前面提过,TCP 建立连接要先握三次手。攻击者大量发送 SYN 请求,但收到服务器的 SYN-ACK 之后,故意不回应最后一个 ACK。服务器一直在等待,每条等待中的半开连接都会占用内存和连接队列空间。当半开连接数量超过系统上限,后续的正常连接请求也会被拒之门外。
防御 SYN Flood 的核心思路包括启用 SYN Cookie 机制,让服务器不分配资源形式变相规避占坑,以及缩短 SYN 等待超时时间、调整内核参数等。根本的逻辑是让恶意的半开连接占用的资源尽量小、释放尽量快。
3.3 应用层攻击:打瘫业务处理能力
这类攻击最阴险,因为流量看起来正常,很难被流量特征识别。攻击者让肉鸡发送真实的 HTTP 请求,请求的是真实的业务页面,甚至模拟了真实的浏览器特征,目标是耗尽服务器的应用处理能力、数据库连接池或者业务逻辑资源。
典型如 HTTP Flood,其实就是不停地用大量 GET 或 POST 请求刷业务接口,看 CPU 和数据库压力。还有慢速攻击,攻击者建立连接后慢慢地发数据,读得很慢、写得很慢,把服务器的连接资源一点一点占住,让其他人连不上。
应用层攻击的防御难度最大,因为规则不能太简单粗暴,否则容易误伤正常用户。通常需要结合速率限制、行为分析、验证码挑战等组合手段才能实现较好的效果。
3.4 三类攻击的实战对比
| 攻击类别 | 典型类型 | 攻击目标 | 流量特征 | 防御难度 |
|---|---|---|---|---|
| 网络层攻击 | ICMP Flood、UDP Flood、反射放大 | 带宽资源 | 流量巨大,峰值明显 | 中等,依赖清洗能力 |
| 传输层攻击 | SYN Flood、TCP 连接耗尽 | 连接队列、服务器状态 | 流量未必大,半开连接多 | 中等,依赖系统参数与防火墙 |
| 应用层攻击 | HTTP Flood、慢速攻击、CC 攻击 | CPU、内存、数据库连接 | 看起来像正常访问 | 高,需要精细化识别 |
实战中,大规模攻击往往是组合拳,先打网络层逼你启动流量清洗,再打应用层让你的清洗防线出现漏洞,一层一层往里打。所以防御体系也必须是一层一层叠起来的,谁想靠单车防护打天下,几乎不可能。
4. 为什么 DDoS 防御这么难:几个关键认知误区
很多团队第一次遭遇 DDoS 时,反应往往是“我们买了防火墙啊”“我们带宽挺大的”,结果还是被打挂了。这背后有几个根深蒂固的认知误区。
4.1 攻击的本质是资源不对等
DDoS 之所以被称为“不对称攻击”,就是因为它利用的是攻击者与防御者之间巨大的成本剪刀差。攻击者组建一个万级僵尸网络,攫取到的资源总量远远超过一家普通企业能为一个业务准备的带宽和服务器资源。
同样是打一场攻击,攻击者花几万甚至几千块就能租到足够大的攻击服务,而防御方如果想把本地带宽扩容到能硬抗万兆流量,硬件成本和带宽费用都是天文数字。所以防御 DDoS 的核心思路从来不是说“把自己的墙修得比对方的炮弹还硬”,而是要想办法在流量到达自己家门口之前,就把“炮弹”拦下来或者卸掉。
这也是为什么“直接封 IP”在 DDoS 场景下基本无效。攻击源 IP 数量巨大且随时在变,还会伪造源地址,人工一个个封,手速永远赶不上攻击者生成新资源的速度。真正有效的做法是在流量入口处做规模的快速筛选,而不是对单一来源做精确打击。
4.2 传统防火墙与 IDS 的局限
很多企业网站上买了品牌防火墙,却依然在 DDoS 中被轻易打倒,因为传统防火墙的设计目标就不是应对这种场景。防火墙是串行设备,所有流量都要经过它处理,当进入流量远超它的处理上限时,防火墙会先于服务器变成瓶颈,自己直接宕机或者把流量丢弃。
IDS 和 IPS 这类入侵检测产品能识别攻击行为并发出告警,但它们的功能是“发现”而不是“处理”。一个小流量攻击它来得及告警,一旦流量上万兆,检测引擎自己也可能被流量淹没。更不用说,应用层攻击的请求看起来和正常访问几乎一样,单靠规则库很难做出及时准确的判断。
所以我的观点很明确:本地安全设备可以作为第一道防线,但绝不能假设它们能扛住大规模 DDoS。它们的价值更多体现在攻击还未成形时快速发现异常信号,而不是在攻击肆虐时充当防线的唯一支柱。
4.3 防御者最典型的几个错误操作
我在实际接触过的项目里看到过不少反面教材,大致有几种。
一种是在攻击发生时临时抱佛脚,几个人围在电脑前,一遍遍刷新监控面板,手忙脚乱地封 IP、改配置。这种临时指挥不仅效率低,还容易因为误操作让情况更糟。另一种是只有一个“大水管”思路,以为把带宽扩容就万事大吉,结果攻击者发现打带宽打不动,转手打应用层,服务器 CPU 直接飙满。还有一种是买了好几年高防,却从来没有自己人真的测过切换流程,等攻击真来了,发现高防的 IP 还没有配好回源规则,业务已经断了。
这些问题的根子都是一样的:把 DDoS 防御当成“买了设备就完事”的静态工程,而不是一套需要持续运营的动态体系。
5. 怎么判断自己正在被攻击:症状与应急动作
没有监控手段的团队,被攻击后往往是用户先发现,这非常被动。其实大部分 DDoS 攻击在早期都有征兆,关键是你能不能及时识别。
5.1 六个不需要专业工具就能判断的症状
- 网站访问突然变慢,刷新几次才能打开,严重时直接超时。
- 带宽监控数据出现异常尖峰,数值逼近甚至超过实际购买带宽。
- 服务器负载(load average)、CPU 使用率、内存占用出现不明原因的大幅上升。
- 应用日志和访问日志里出现大量连接超时、请求失败的记录。
- 数据库连接数告警,连接池被占满,正常查询也响应缓慢。
- 用户开始集中反馈页面打不开,尤其是跨地域的用户同时反馈。
这六个症状都不需要专业安全工具,光靠系统和业务的监控面板就能看出来。它们的共同点是“没有任何业务增长或版本上线,但资源消耗突然暴涨”。一旦同时出现两项以上,就要高度警惕了。
5.2 应急响应的第一件事:止损优先
很多团队出事后第一个念头是“查是谁打的”,这是大忌。攻击正在进行时,第一优先级永远只有一个:让业务尽快恢复正常。
常规的止损动作包括:把流量切到高防 IP 或者 CDN 节点,让攻击流量打到防护节点上;把 WAF 和防护策略切到更严格的模式;针对应用层攻击,可以临时开启全站验证码、限制单用户请求频率、关闭高消耗的接口。如果是本地机房,条件允许的话可以直接与机房或运营商联系,申请上游流量清洗或黑洞路由——流量在入口就被丢进黑洞,源站压力瞬间消失,业务整体ip切换后也能更快恢复。
处理过程中还有一条不能忘:保留现场。攻击期间的访问日志、连接状态、监控截图,这些统统要存下来,不要因为着急重启服务器就把临时日志清掉了。后面复盘和溯源全靠它们。
5.3 从日志里快速提取攻击线索
止损之后再做分析,第一个动作是查访问日志,看流量来源和请求特征。比如用一条简单命令统计 Nginx 访问日志里请求量最多的 IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20输出的前几名如果是几个陌生 IP 贡献了绝大多数请求,基本可以确认异常访问对象。再进一步看这些 IP 的请求路径:如果是同一个页面反复刷、相同 User-Agent 反复出现、或者在 URL 参数里能看到规律性的递增数字,那大概率就是机器人在跑。
网络层和传输层的攻击,日志里往往看不出太多东西,可以直接用系统命令看连接状态:
netstat -an | awk '{print $6}' | sort | uniq -c | sort -rn如果 SYN_RECV 状态的连接数量异常巨大,多半是受了 SYN Flood。按来源 IP 统计连接数也可以帮助判断哪些地址在持续建立连接:
netstat -an | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -20分析线索的目的不是为了现场“报仇”,而是判断攻击类型,从而决定后续的防御策略和是否升级防护等级。
6. 零基础能落地的防御体系:从配置到常态化运营
DDoS 防御没有银弹,但确实有一套从低到高的体系建设路径。零基础团队不需要一步到位,可以按顺序做。
6.1 本地基础防护配置与内核参数优化
如果还没有上云清洗,先把本地能做的做了。最常见的应用层防护配置是 Nginx 限流。下面这段配置将同一 IP 的请求速率限制在每秒 10 个以内,超过的请求直接返回 503,同时限制单个 IP 的同时连接数:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; limit_conn_zone $binary_remote_addr zone=conn_limit:10m; server { location / { limit_req zone=req_limit burst=20 nodelay; limit_conn conn_limit 20; } }内核参数优化方面,针对 SYN Flood 可以在/etc/sysctl.conf中加入以下配置:
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_syn_retries = 2生效后执行sysctl -p。第一行开启 SYN Cookie 机制,服务器在收到 SYN 时可以不分配资源,等到确认是完整连接才分配,是抗 SYN Flood 的关键参数。第二行和第三行分别扩大半连接队列上限、减少 SYN 重试次数,让恶意连接更快被清理。
防火墙层面也可以做简单的防洪泛配置。下面两条规则实现的效果是:每秒钟最多接受 1 个新的 SYN 包,超过的丢弃:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP注意,这类静态限速规则只是兜底手段,副作用是可能误伤正常的高并发业务,所以阈值要结合业务实际情况调整,不能照抄完就扔到生产环境不管。
6.2 什么时候必须上流量清洗服务
本地防护能扛住小规模攻击,但一旦攻击流量超过本地带宽上限,再多的内核参数优化和防火墙规则都没有意义,物理带宽就放在那里,超出部分进不来,业务依然会中断。
这时候要认清现实,选择接入专业的流量清洗服务。清洗的核心逻辑是三步:牵引、清洗、回注。攻击发生时,把目标 IP 的流量先引导到清洗中心,清洗中心过滤掉明显异常的流量,再把干净流量送回源站。源站看到的大部分流量都已经是“洗过”的。
决策上什么时候该上?我的判断标准很简单:只要业务对公网开放、有收入影响,就值得接入。这不是大企业才需要的奢侈品,小网站同样可能成为勒索对象。上了不一定每次都用到,但关键的一次就能避免重大损失。
6.3 常态化防御:一套能长期运作的运营机制
设备的采购和配置只是开始,真正决定防御效果的是平时的运营习惯。
首先是把监控告警做起来。云平台自带监控就可以,给带宽使用率、CPU、内存、连接数设一个合理阈值,超过就触发告警。告警不能只发一个人,要把运维、研发、管理都拉进去,保证任何时间都有人响应。
然后是定期演练。第一次做应急演练时,你会发现很多平时想当然的事情根本走不通:高防切换流程拖了二十分钟、联系人电话打不通、回源配置写错了地址。这些问题只有真练过才能暴露。哪怕只是用一个小流量模拟一次攻击流程,也比啥都不做强得多。
最后是建立应急手册,把关键信息写下来:IDC 或云服务商的联系电话、高防服务的使用流程、常见的攻击类型判断方法、切换防护的操作步骤。要确保一个新人照着手册就能完成基础处置,而不是所有的经验和信息都留在某个人的脑子里。
写在最后
真正完整的 DDoS 防御不是“被打之后才启动”的临时方案,而是一套平时就运转的运营节奏。我自己在经历了多次实际攻防之后,最大的体会是:防护设备的参数、规则、清洗方案都只是地基,真正决定成败的,是团队对流程的熟悉度和临场不乱的判断力。这套体系看起来不复杂,但每一项都需要扎扎实实地验证过。趁着业务平稳,找个周末把应急流程捋一遍,认真想一遍“流量真的打过来我会先做什么”,到了关键时刻你会感谢现在做的这些准备。