做了快十年运维,我最怕的不是磁盘满,也不是半夜bug上线,而是某个凌晨突然收到流量告警:入口带宽从5Gbps一路飙升到200Gbps,20分钟内打了40倍。这种典型的DDoS攻击场景我经历过不止一次,每次复盘都会发现:真正让我们脱险的,不是某台设备有多强,而是事前把攻击防护方案选对了,架构想透了。
这篇文章不准备讲那些厂商PPT里的概念,而是从选型决策的角度,把DDoS攻击防护方案从需求梳理、架构选型、策略落地到日常运营的完整链路捋一遍。适合正在选型或准备升级防护体系的运维、安全和架构同事参考。尤其是那些既没有无限预算、又没有专职安全团队的团队,这篇文章里踩过的坑和经验,应该能帮你少走不少弯路。
1. 威胁图谱:现在的DDoS到底长什么样
1.1 从流量型到应用层的攻击分层
DDoS的概念大家都懂,分布式拒绝服务。但“分布式”三个字的含义这几年变化很大。早期的DDoS攻击主要打带宽和连接数,用大量僵尸网络发包,让交换机、防火墙、服务器被流量淹没。这种属于典型的容量耗尽型攻击,特征是攻击流量大、协议单一、检测相对简单。现在呢?攻击者更喜欢混打,比如先来一波大流量SYN Flood打漏洞,紧接着上HTTP慢速攻击,再配合DNS放大和CC应用层峰值请求,一轮攻击里同时涵盖了L3、L4、L7三个层级的压力。用一句话概括:现在你面对的往往不是一支军队,而是一支带侦察兵、空袭部队和地面炮兵的混合编队。
从协议角度看,常见的有UDP Flood、SYN Flood、ICMP Flood、DNS Query Flood等。其中SYN Flood是最经典的,利用TCP三次握手的设计盲区,发送大量不完成握手的SYN包,让被攻击设备占满半连接队列。ICMP Flood虽然技术含量不高,但配合反射放大时威力惊人。还有利用NTP、memcached、SSDP等协议反射放大的攻击,放大倍数轻易达到十倍百倍,这让攻击者的成本极低,防护成本却极高。这也是为什么很多防护方案都在强调“清洗算法”而不是单纯堆带宽——带宽永远追不上反射放大这种杠杆式的成本结构。
1.2 真实攻击案例的规模与时间线
我参与处理过一个比较典型的案例。客户是一个在线教育平台,平时业务平稳,峰值在线大概3万人。某天早上九点半,正是直播课高峰时段,监控上的入流量曲线突然像导弹发射一样直冲。从探测来看,攻击总流量峰值大约600Gbps,持续了将近四个小时,期间经历了三轮明显的波峰。攻击类型从最初的SYN Flood,逐步升级为TCP反射放大加HTTP CC混合,最后还出现了针对登录接口的撞库式请求。这个案例的典型性在于它把几乎所有常见打法都来了一遍,说明攻击者是有步骤、有目的地在试探和穿透防线。
另一个数据值得注意:攻击持续时间的分布。我们内部统计过最近两年的防护记录,超过65%的攻击持续时间在15分钟到2小时之间,超过5小时的比例并不高。什么概念?我见过不少团队辛辛苦苦配好防护规则,结果一场攻击打完规则还没热完。这说明防护动作必须快,几乎要在攻击发生后三分钟内完成确认和处置。这也是为什么现在的防护方案都强调自动触发清洗、自动切换线路,靠人盯屏根本跟不上一场60秒内飙到峰值的流量变化。
1.3 哪些行业和系统最容易成为靶子
想清楚防护方案之前,先要明白自己大概率会面对多大强度的攻击。从实战经验看,游戏行业常年是重灾区,尤其是新游戏上线、活动开服的时间点,几乎必然遭遇一波“开服攻击”,目标就是把服务器打瘫,让玩家骂客服。金融行业虽然单次攻击规模不一定最大,但攻击者的耐心和复杂程度更高,经常是低慢型CC打配合,纯粹为了让业务系统卡顿、体验下降。电商与零售在促销节点也是高发期,大促当天入口流量本身就高,攻击混杂在正常流量里,清洗难度直线上升。
还有一个很容易被低估的群体:政务、医疗、教育等公共服务类系统。这类系统资源丰富、业务重要,但安全预算往往有限,用的还是老旧的硬件防火墙,面对一百多Gbps的攻击,基本没有还手之力。前阵子我们帮一家医院做评估,对方的信息科主任坦言,一台防火墙用了六年,日志都没人看,更别提什么清洗策略。这种情况不是个例。如果你是这类系统的负责人,选型时尤其要注意方案的弹性和成本结构,因为攻击虽然来的猛,但预算不会因为攻击而变得充足。同时,还要把现有团队的运维能力算进去,方案再先进,没人会维护就等于零。
2. 选型之前必须想清楚的几个关键问题
2.1 业务容忍度:RTO/RPO与服务降级标准
选防护方案的第一个关键变量,不是技术参数,而是业务对故障的容忍度。你得先回答几个问题:业务中断五分钟会损失多少收入?会有多少用户投诉?公司对服务可用性的内部承诺是几个九?再把这些问题拆成技术指标:RTO(恢复时间目标)和RPO(数据恢复点目标)分别是多少?在DDoS场景下,RPO的概念主要涉及会话状态保持,比如用户登录态、购物车、考试答题记录。一场攻击如果持续十分钟,你用黑洞路由把所有流量丢弃,恢复后用户数据会不会丢、会话会不会断,这些都要提前想清楚。
举个例子,一个B2B门户网站,访问量不高但每笔询盘都值钱,它更需要的可能是低误杀的精细防护,宁可偶尔放过去一点攻击流量,也不要错杀正常客户。而一个短视频平台,短时间断流影响有限,恢复快就行,反而应该选择大带宽硬抗加快速清洗。所以选型之前,我建议先做一张业务影响分析表,把核心业务、依赖资源、可容忍中断时间、用户影响面列出来,这张表比任何产品手册都重要。如果这张表都懒得做,那后面无论买多贵的方案,都很难说清楚它到底值不值。
2.2 预算、带宽与清洗能力的三角关系
DDoS防护本质上是一个成本和能力的取舍。你要么自己准备足够大的带宽来吸收攻击流量,要么把流量交给第三方清洗中心,要么两者组合。自己买带宽看起来简单,但成本极不划算。假设你业务正常带宽需求5Gbps,却为了抗住100Gbps攻击去采购100Gbps带宽,那平时99%的时间都在烧钱。IDC机房的大带宽价格不是线性增长的,从5G到20G可能还好,到100G就是一倍一倍的翻,这种预算大多数企业根本背不动。
因此,主流的做法是“本地接入带宽适当冗余 + 第三方清洗兜底”的组合。正常流量直接走本地链路,攻击流量通过路由协议(BGP/MPLS等)牵引到清洗中心,清洗完再把干净流量回注。这里面有个成本细节:清洗服务通常按保底带宽加弹性带宽计费。保底带宽是每月固定费用,弹性带宽按实际使用峰值计费。采购时怎么定保底值?我建议参考自己业务近三个月的峰值流量再乘1.5倍作为保底,既不至于浪费钱,也不会在中小攻击时动不动就触发弹性计费。这个数字是我们踩过几次坑之后总结出来的,一开始定低了,每月账单都超出预期,后来定高了又心疼平时闲置。
2.3 合规要求与第三方清洗的必要性
有些团队对“把流量交给第三方”天然有顾虑,担心数据安全、担心延迟,这个可以理解。但实际部署中,第三方清洗中心的优势不只是带宽,还有清洗算法库的更新频率和7x24小时值守能力。一个自建团队要做到24小时值班盯流量,人力成本可能比清洗服务费还高。而且清洗算法是一个需要持续迭代的东西,攻击手法不停变化,今天有效的规则明天可能就被绕过,第三方服务商因为服务大量客户,能够更快沉淀新的攻击特征并更新到清洗设备里,这一点单靠一家企业自建很难做到。
当然,合规和数据安全确实要考虑。如果在金融、医疗等敏感行业,建议采用“BGP牵引到清洗中心 + 回注干净流量”的模式,但提前要求服务商提供数据安全承诺、清洗日志审计和独立的网络托管区,避免敏感流量直接暴露在共享设备上。合规方面,国内对网络安全的等级保护要求也越来越细化,选型时最好先和法务确认清楚,你所在的行业是否要求流量清洗系统有相关资质或备案。这块宁可多花点时间,也别等检查时补作业。
3. 防护架构的几种主流形态与对比
3.1 云清洗平台 + 高防IP模式
当前企业用得最多的形态,就是把关键业务的入口IP换成高防IP,实际解析时客户访问的是高防IP,后面回源到你的源站。高防IP背后的清洗平台一般部署在多个城市,每个城市具备几百Gbps到数Tbps的防护能力。当检测到攻击流量打到高防IP上时,清洗中心的流量调度系统把攻击流量导到分布式清洗集群,把正常流量放行并回源。
这个模式的优点很直接:部署快、操作简单,几乎不需要改业务代码,只需要改DNS解析和回源配置。对于大多数中小团队,这是性价比最高的起步方案。缺点是成本会随着防护峰值上涨,而且高防IP本身可能成为单点,如果攻击方盯住了你的源站IP,只要回源绕过防护直接打到源站,高防IP就形同虚设了。所以用高防IP模式的团队,必须做好源站IP的隐藏与访问控制,比如只允许高防回源IP段访问源站、定期模糊化源站域名、避免在响应头泄露真实IP。这一条看着基础,但我见过太多因为源站IP泄露导致整个防护体系失效的案例,根源往往只是某次测试的时候用真实源站域名直接访问了一次。
3.2 本地/IDC端防护设备与流量牵引
如果你有自己的机柜、IDC托管或私有云环境,可以考虑在机房入口部署本地防护设备,比如专业抗DDoS网关或带清洗功能的防火墙。这种模式的优势是流量不需要离开本地,延迟最低,数据不出本地网络,对敏感行业友好。劣势同样明显:本地设备的性能天花板受硬件限制,当攻击流量超过设备处理能力的瞬间,设备反而会成为新的瓶颈。所以本地设备的定位通常不是“扛一切”,而是“快速识别 + 粗过滤 + 告警”,把大部分明显异常的流量先挡掉,大幅缩小进入上层业务的压力。
关键的技术点是流量牵引。当攻击规模超出本地设备能力时,需要自动或人工触发BGP引流,把流量切换到清洗中心。这个动作能不能自动化、切换时间有多快,直接决定了防护体系的上限。我们当时的做法是:在路由器上预先写好远程黑洞路由和清洗路由策略,与清洗服务商之间建立BGP会话,并设置阈值自动触发断言。实测下,从触发到流量完全切换,耗时控制在两到三分钟以内。这个自动切换的稳定性,我建议选型时一定要实操验证,光看PPT上的“秒级切换”是没用的。有些设备宣称秒级,真正压测时才发现路由收敛要等半天,那就尴尬了。
3.3 CDN+边缘防护的分布式吸收
另一条思路是利用CDN的分布式节点来吸收攻击流量。你让网站内容全部走CDN,攻击者的请求到达最近边缘节点,天然被分散到全国或全球的几百个节点上。如果攻击规模不足以同时打瘫全部节点,那源站几乎感觉不到压力。更重要的是,CDN边缘节点通常天然具备缓存、限速、WAF等能力,可以在边缘直接把很多L7层的CC或慢速攻击挡掉,根本不回源。这种方式非常适合内容是静态为主或可缓存的业务场景。
但CDN方案有个前提条件要清醒认识:如果你的业务大量是动态接口、需要回源拉数据,CDN能分担的只是一部分静态压力和连接层压力,回源流量会被源站带宽局限。攻击者只要盯住回源链路,持续拉高回源带宽,整个方案就会出现缺口。所以用CDN模式时,一定要在源站侧额外叠加访问控制和高防回源,或者在CDN和源站之间加一层清洗网关,形成“边缘CDN挡第一波、清洗网关挡第二波、源站只接受信任流量”的纵深结构。别指望一个CDN解决所有问题,它是防线中的一环,不是全部。
3.4 分层混合架构的搭建逻辑
说实话,没有一种单一方案可以应对所有攻击场景。我比较推崇的是“分层混合”的思路:最外层是高防IP或者清洗中心兜底大流量,中间加CDN边缘节点优化体验并分担常规流量,业务侧再配合Nginx/Lua限流、应用层动态令牌等机制做最后一层防御。每一层负责不同的攻击类型和量级,各司其职,不会因为某一层被打穿就全盘崩溃。
分层的时候也要想清楚数据的流向。正常用户访问的路径可能是“DNS解析到高防IP → 高防IP回源到CDN → CDN命中缓存,未命中回源到业务集群”,攻击流量如果被高防识别,直接清洗,不进CDN。如果攻击穿透了高防但到了CDN边缘,CDN又挡了一部分。只有到最后两层都放过且刻意放行的流量,才能接触到真实业务服务器。这样的架构下,用户感知的是高防IP的地址,真实IP被层层保护起来,源站的安全性大幅提升。架构不是越复杂越好,而是分层清晰、每层职责明确。我见过很多团队把所有安全功能堆在同一个网关里,结果一次配置失误就把正常业务也误杀了,那是另一种灾难。
4. 从DNS到应用的防护策略落地细节
4.1 DNS层面的质询与解析防护
DNS层是DDoS攻击的重要入口。DNS Query Flood、DNS放大攻击的目标就是你对外提供的解析服务。防护的第一个动作是隐藏主域名服务器,尽量让对外可见的都是一些高防解析服务商或分布式解析节点,把真正的权威服务器藏在内部。第二,在DNS服务器上开启递归查询限制,只允许已知网段做递归查询,其他一律只提供权威解析。第三,针对UDP 53端口要启用RRL(响应速率限制),防止对外发出大量响应被放大。
实操中还有一个常见的坑:很多人把DNS解析服务直接放在业务服务器上,比如让Nginx服务器兼任DNS服务器。一旦DNS被攻击,业务彻底歇菜。我的建议是无论如何,DNS都要独立拆分出来,并采用至少两个不同运营商的解析线路互备。域名解析本身很小、不占资源,但可用性要求是性命攸关的,拆出来以后哪怕业务被攻击,用户至少还能通过静态页面看到公告,而不是完全失联。而且DNS拆分后,日常巡检也方便很多,出问题时排查范围一目了然。
4.2 网络层防火墙、ACL与速率限制
到了接入层,防火墙和ACL是第一道硬防线。这里的原则是“白名单优先,默认拒绝”做一个基础的收敛:业务正常的来源端口、目标端口、协议类型列清楚,不相关的协议直接drop。针对SYN Flood,在防火墙上设置SYN Cookie,把半连接队列保护起来;针对UDP Flood,可以按源IP、目标端口设置限速,超出阈值的直接丢弃。
但要注意,网络层的防护配置如果过于激进,容易产生“反向防护错误”。比如你一看到某种协议流量大就限速,结果正好把正常业务流量误伤了。所以我一般建议网络层的规则按业务白名单思维来收敛,而在核心业务之外再设置一条较宽的高水位阈值作为兜底,不要试图在这一层做精细识别,那是应用层的事。网络层要做的是“快、稳、便宜”,快速识别明显攻击,稳定扛住第一波,便宜意味着不占太多计算资源。让防火墙去干WAF的活,往往两边都干不好。
4.3 应用层CC防护与动态验证
CC攻击是应用层的顽疾,本质上是模拟正常用户的请求,让服务器处理大量无意义任务。检测CC的难点在于攻击报文和正常报文几乎一模一样,传统限速规则很难区分。实操中比较有效的组合拳是:第一层,在入口网关根据IP维度的访问频率做动态限速,比如单IP每秒超过30次请求就触发校验;第二层,对高风险接口(登录、注册、下单)引入动态令牌或点选验证,高频请求直接打回验证页;第三层,在WAF或应用网关配置URL粒度的请求频次规则,比如对某个接口每分钟最大QPS做限额。
动态验证的方案要小心用户体验。如果你在正常大促时也弹出验证码,用户直接流失。所以验证策略要带“风险分级”:只有来源IP异常、行为特征偏离、且频率超阈值时才触发高强度验证;普通访问略过。这里四面喷洒的方法一定不行,打击的是攻击,从来没想过会误伤正常用户,这是我在多个项目里反复强调的一点。好的CC防护方案应该是“无症状时透明,有风险时精准拦”,上线前一定要拿正常业务流量做压测,看看触发阈值会不会误伤。
4.4 业务架构侧的设计
最后也是容易被忽视的:业务代码和应用架构本身的抗攻击能力。如果一个接口的响应时间需要2秒,攻击者只需发起时并发1000个请求,就能把CPU打满;如果接口设计了缓存、异步削峰、限流熔断,那抗打击能力就完全不一样了。在应用框架层面,至少要做到:所有外部接口尽量有缓存层、高频接口做聚合查询减少数据库压力、核心服务配置线程池和信号量限流、下游依赖设置超时和熔断。
这部分的收益是长期的,它不影响选型方案的买不买,但决定了在攻击最激烈时、前面几层防线是否会被击穿后依旧有生存能力。打个比方,防护架构是城墙,业务架构是城内管网配置;城墙再高,如果城内一炮弹就瘫痪,那也是白搭。而且架构侧做过压力测试的团队,通常比只靠买防护服务的团队更能从容应对攻击后的恢复,因为你知道自己的系统在极限压力下到底是什么表现。别等攻击来了才去压测,平时每季度做一轮混沌工程式的演练,把各种依赖挂掉的情况提前体验一遍,比什么都强。
5. 实战复盘:一次混合型DDoS的完整处理链路
5.1 发现与确认的First 60秒
某次周五晚上,我收到监控平台的电话告警。电话还没响完,工作群里已经有人把流量图贴出来了:入口带宽在60秒内从5Gbps冲到了180Gbps。我当时的处置顺序是这样的:
第一件事,不是立即打开防火墙看规则,而是先看“当前业务的正常流量特征”。确认监控面板上业务QPS有没有异常波动,如果业务本身就淡季,流量突然暴涨,这基本就是攻击。第二件事,登录入口路由器查看接口流量和源IP分布,判断攻击的类型和方向。180Gbps的攻击只要盯住几个主要源IP段,用特征码在ACL里先临时drop掉,能立刻释放一部分压力。第三件事,就是触发牵引动作。如果清洗中心已经配置好BGP会话,直接在手边上触发流量牵引,把入口流量切到清洗中心。前两步大概用了两分钟,第三步在五秒内完成。这五分钟的节奏,靠的全是平时演练攒下来的肌肉记忆,临时翻手册根本来不及。
5.2 牵引清洗与源站保护操作
流量切到清洗中心后,本地链路压力很快降了下来。但清洗中心只是把攻击流量过滤掉,真正把它挡掉的还是清洗算法。这时要和清洗服务商的对口人确认几条关键信息:攻击报文的主要特征、清洗后的回注流量是否正常、源站回源链路有没有异常。我当时遇到一个问题:清洗后的流量回注到源站后,源站防火墙还是收到了大量畸形包,排查发现清洗中心只回注了HTTP端口,但攻击者的UDP Flood还在尝试打源站的其他端口。好在源站防火墙提前配置了接口白名单策略,UDP 53以外的UDP包直接丢弃,这部分攻击没造成实质影响。
这个案例给我们的经验很简单:源站侧的ACL和端口收敛必须在攻击开始之前就做好,不要等到攻击时才临时改防火墙。你在十分钟手忙脚乱改配置时,攻击者正在疯狂刷新你的业务,一秒钟都等不了。临时改配置不仅容易出错,而且人多手杂,还有可能把正常流量也封掉。后来我们索性把源站的默认策略改成“只放行80/443和必要的管理端口”,其他全部拒绝,安全性和规范性都提升了一大截。
5.3 事后分析与策略固化
攻击结束后,最值钱的工作是复盘。我让团队导出三个东西:清洗中心的攻击事件报告、源站防火墙的会话和丢弃日志、业务服务器的访问日志。三方一对照,能准确还原整个攻击的时间线和攻击手法。那次复盘发现,攻击者在前两个小时内先用了SYN Flood试探,然后切到CC,再切回大流量攻击,本质上是一套“动态调整”的打法,不是脚本一键启动的静态攻击。这说明什么?说明单靠静态规则永远被动,必须让防护策略也具备动态调整的能力。
复盘之后,我们把策略固化下来:本地防火墙上加上SYN Cookie和UDP丢弃规则,清洗中心的回注策略按业务端口白名单收紧,DNS解析服务增加了一个备用线路,业务侧对登录接口加上了动态验证。还专门写了一份《DDoS应急手册》,把发现、确认、牵引、回注、复盘每个环节的负责人、操作步骤、时间要求都固定下来。这份手册后来在几次小规模攻击里发挥了大作用,团队内部的响应时间从平均十几分钟压缩到了五分钟以内。防护不是一次买断的事,而是需要持续迭代的运营工作。
6. 日常运维中我总结的经验与容易踩的坑
聊完实战链路,再补充几条日常运营中我觉得最有价值的经验。这些东西不在产品手册里,也很少有人系统性地讲,但往往决定了一套防护方案能不能在关键时刻正常发挥。
6.1 别把误杀当小事
说到DDoS防护,我第一个想提醒的就是误杀。很多团队为了把攻击打下去,把限速规则调得非常激进,结果攻击没了,正常用户也访问不了。曾经有个客户,为了防CC攻击把单IP每秒请求数限制到5次,结果内部员工的公共出口IP一多,直接触发验证,大家纷纷反馈系统“坏了”。这种问题在选型和配置阶段就要预防,规则永远要留出业务正常波动的余量,宁可多冗余10%。误杀造成的业务损失,往往比攻击本身还大。而且误杀的影响还会延续到攻击结束之后,用户反复被验证码折腾几次,下次可能就不愿意再来了,这种隐性流失很难量化,但真实存在。
6.2 监控告警要分级,别一告警就全员出动
早期我们监控告警设置得非常粗糙,带宽超过30%就短信轰炸,一天能收两百条告警,慢慢就变成狼来了,真出大事时反而没人第一时间响应。后来我们做了分级:带宽超过正常2倍且持续时间超过2分钟是黄色告警,推送值班组;超过5倍或出现服务降级是红色告警,直接电话拉群。实践证明,分级告警让团队的响应更精准,也避免把有限的人力浪费在琐碎告警上。同时,告警里一定要带上当时的流量趋势图和源IP分布摘要,让值班同事在不开电脑的情况下就能初步判断严重程度,响应速度能快不少。
6.3 演练比买设备重要
最后一点经验:再贵的防护方案,不演练等于没买。我建议每个季度做一次小规模DDoS防护演练,可以请清洗服务商配合做一次模拟攻击,或者内部用工具对测试环境打一些常规流量。演练的主要目标是验证三件事:BGP牵引是否能按预期触发、清洗后的回注流量是否正常、应急手册里的步骤是否还有人记得住。第一次演练时八成会发现问题,比如配置被改过导致自动触发失效、值班人换了没交接、清洗中心的API密钥过期了,这些在真实攻击时都是致命伤,但在演练里都是小问题。演练的费用相比一场真实事故的损失,性价比高到无法言喻。
做了这么多年运维,我越来越深的体会是,DDoS防护从来不是买下一个产品就完事,它是选型、部署、监控、复盘、演练组成的完整闭环。方案选得再漂亮,日常运营跟不上,关键时刻一样掉链子。尤其是演练那一条,我无论如何都劝你别省。上面这些经验和思路,希望能让你少踩几个我当年踩过的坑,把防护体系从纸面变成实战里真正靠得住的防线。以后碰到什么新打法、新套路,也欢迎回来一起交流,咱们把这块的坑继续填上。