防御DDoS攻击时,最棘手的问题往往不是“流量太大”,而是“不知道多大算大”。很多运维团队在遭受攻击的初期无法快速判断业务流量的异常,因为日常业务本身就存在波动,促销、定时任务、集中上报都可能让流量曲线突然拉高。如果没有一条清晰的业务流量基线,要么把正常高峰误判为攻击触发误清洗,要么在真实攻击面前反应迟钝,等业务已经大面积不可用才开始处理。建立业务流量基线,本质上就是给“正常”划定一个可量化、可比较、可告警的边界,让异常波动可以被快速识别。

业务流量基线不是简单的平均值

很多人误以为基线就是“过去一段时间流量的平均值”,这是最常见的错误。平均值会掩盖真实波动形态,例如每天凌晨三点流量极低、晚上九点流量极高,如果只取一个日均值,那么白天大部分时间都处于“高于均值”的状态,攻击告警会持续误报,而夜间真实攻击又可能因为绝对数值不大而被忽略。正确的基线必须包含三个维度:时间维度、指标维度、分布维度。

时间维度要求按业务周期建立分时段基线。至少要有工作日与周末的区分,最好再细分到小时甚至半小时粒度。一个典型的业务流量基线应该是“工作日10:00-10:30的入向带宽P95为1.2Gbps,P99为1.8Gbps,最大历史峰值为2.3Gbps”,而不是笼统的“日均800Mbps”。对于有明显月结、周结或活动周期的业务,还需要单独建立特殊日期的基线,否则每月一号的集中业务高峰会被当成异常。

指标维度要求不能只看带宽或PPS。DDoS攻击类型多样,有的攻击以带宽打满为主,有的以每秒包数打满防火墙会话表为主,有的以耗尽TCP连接数为主,有的以HTTPS新建连接打满服务器CPU为主。因此基线至少要覆盖入向带宽、出向带宽、入向PPS、出向PPS、新建连接速率、并发连接数、SYN包速率、分片包速率、特定端口流量占比等指标。只监控带宽这一个指标,遇到CC攻击或慢速连接耗尽型攻击时几乎无法察觉。

分布维度要求关注流量构成的比例变化。正常业务流量中,TCP与UDP的比例、HTTP与HTTPS的比例、国内与海外来源的比例、主要源端AS号分布、目的端口分布,这些比例在短时间内通常相对稳定。如果某天UDP流量占比从平时的5%突然上升到40%,即使总带宽没有明显增长,也极有可能是一次UDP反射攻击。基线需要把这些比例也纳入统计,而不是只记录绝对值。

如何采集和计算基线数据

建立基线需要依赖流量采集手段。常见的数据来源包括边界路由器或交换机的NetFlow/sFlow采样数据、防火墙会话日志、负载均衡器或反向代理的访问日志、云平台提供的流量监控API。对于自建机房,NetFlow或sFlow是最通用的方式,采样比建议设置在1:1000到1:2000之间,既能控制采集器负载,又能保留足够的统计精度。对于使用云服务的业务,云厂商通常提供流量监控接口,可以直接拉取分钟级数据。

采集到原始流量数据后,需要做聚合和分桶计算。建议以五分钟为一个统计桶,计算每个桶内的平均值、峰值、P95、P99。基线的核心是P95和P99,而不是最大值。最大值容易受偶发事件影响,比如某个用户突然上传大文件,会造成单个时间桶的流量尖刺,如果用最大值作为基线,阈值会偏高,导致真实攻击被漏报。P95和P99能更好地反映“绝大多数情况下流量不会超过多少”,同时保留对极端值的敏感性。

基线的更新频率也很关键。业务在增长,流量基线必须跟着演进。建议采用滚动窗口方式,例如取过去30天同一时段的数据计算基线,每天滚动更新一次。对于增长较快的业务,可以缩短到14天窗口;对于非常稳定的内部系统,可以拉长到60天。滚动窗口的好处是基线能自动适应业务增长,不需要人工频繁调整阈值。但要注意,如果过去30天内发生过真实攻击,攻击流量会污染基线数据,因此在计算前需要先剔除已知攻击时间段的数据。

异常波动的判定方法

有了基线之后,判定异常不能只靠“当前值超过基线阈值”这一条规则。单一阈值判定容易产生大量误报或漏报。比较实用的做法是组合多种判定条件,形成一套评分机制。

第一种判定方法是偏离度检测。计算当前五分钟流量与同一时段基线P95的比值,如果超过1.5倍,先标记为“关注”;超过2倍,标记为“可疑”;超过3倍,标记为“严重”。这个倍数需要根据业务实际情况调整,对于流量基数很大且波动剧烈的业务,阈值可以设高一些;对于流量平稳的小业务,1.3倍可能就已经是明显异常。

第二种判定方法是突增速率检测。有些攻击在极短时间内拉起,例如从100Mbps在十秒内冲到10Gbps。这种情况下五分钟的平均值可能还没有超过基线太多,但瞬时速率已经非常危险。因此需要对秒级或十秒级数据进行突增速率检测,例如“30秒内流量增长超过基线P95的80%”就触发快速告警。这种检测方式对反射放大攻击和突发型UDP Flood特别有效。

第三种判定方法是结构异常检测。即使总流量没有明显变化,流量构成比例的大幅偏移也应当触发告警。例如SYN包速率占比从平时的10%上升到60%,或者来自某个单一源端AS的流量占比从2%上升到35%,这些都是典型的攻击特征。结构异常检测需要预先定义好关键维度的正常比例范围,并设置合理的偏移阈值。

第四种判定方法是业务指标关联检测。流量异常最终要落到业务可用性上。将流量数据与业务指标关联起来看,比如HTTP 5xx比例、响应时延、连接超时率、用户活跃数等。如果流量上升的同时业务错误率也同步上升,基本可以确认是攻击;如果流量上升但业务指标正常,可能只是正常业务增长或大促活动。这种关联检测能大幅降低误报率。

基线告警的落地实践

在实际落地中,建议把告警分成三个等级。一级告警为“观察级”,触发条件可以是偏离度超过1.5倍或结构偏移超过阈值,此时不需要自动执行清洗,只通知运维人员关注。二级告警为“疑似攻击”,触发条件可以是偏离度超过2倍且持续两个统计周期,或者突增速率检测触发,此时可以自动切换到预定的观察策略,比如增加采样频率、拉取更详细的流量日志。三级告警为“确认攻击”,触发条件可以是偏离度超过3倍且业务指标同步恶化,此时应自动触发DDoS防护策略,包括流量牵引、限速、黑白名单过滤等。

告警阈值不能一成不变。建议每季度回顾一次基线和阈值设置,结合过去一个季度的误报和漏报情况做调整。误报太多说明阈值太紧,漏报太多说明阈值太松。同时要注意,DDoS攻击手法在变化,基线模型也需要不断补充新的指标维度。例如近年来针对TLS握手阶段的攻击增多,就需要把TLS握手速率和握手失败率纳入基线监控。

基线数据在攻击后的价值

业务流量基线不仅在攻击发生时用于识别异常,在攻击结束后也有重要价值。攻击溯源需要对比攻击前后的流量基线,确定攻击流量的具体特征,例如攻击源端口分布、载荷特征、反射放大器类型等。这些特征可以用于事后优化防护规则,也可以作为下一次攻击的早期识别依据。此外,完整的基线数据还能帮助运维团队向管理层或客户解释攻击影响,用数据说明“正常流量是多少、攻击流量是多少、防护效果如何”。

建立业务流量基线是一个持续迭代的过程,不可能一次性做到完美。初期可以先从带宽和PPS这两个最基础的指标入手,跑通采集、聚合、告警的完整链路,然后逐步增加指标维度和检测方法。关键是让基线真正反映业务自身的规律,而不是套用通用的模板。只有把基线做细、做准,DDoS攻击的异常波动才能在第一时间被识别出来,为后续的防护动作争取宝贵时间。