区分DDoS攻击流量和正常业务流量,本质上是在高噪声环境下完成一次实时分类任务。真正有效的做法不是依赖单一特征,而是把请求的速率、行为模式、协议指纹、设备环境和业务逻辑组合起来判断。攻击流量无论伪装得多像真实用户,最终都会在统计分布或交互逻辑上露出异常,因为攻击者追求的是资源消耗效率,而真实用户的行为天然带有随机性和业务目的性。

从流量速率和连接密度入手

最直观的区分维度是速率和连接密度。正常业务流量通常呈现平滑的波动,比如午间和晚间的访问高峰,增长和回落都有过渡。DDoS攻击尤其是HTTP Flood和SYN Flood,往往在几秒内将请求量拉升到正常值的数十倍甚至数百倍。这里的判断不能只看整体QPS,还要看单IP连接数、每秒新建连接数、以及连接持续时间。一个真实浏览器访问页面,会建立有限的TCP连接,完成请求后保持短时间的keep-alive,而攻击脚本可能在短时间内发起数千个半开连接或者复用连接疯狂发包。把单源IP的请求速率和连接建立速率与全网基线对比,超过阈值且无业务合理解释的,基本可以判为攻击流量。

但速率阈值不能单独作为金标准。大型促销活动或者热点事件也会带来瞬时高并发,此时需要引入第二个维度:请求的多样性和分布。真实业务流量中,用户访问的URL、资源类型、Referer、User-Agent都呈现长尾分布。攻击流量尤其是工具生成的,往往集中在少数几个URL上,User-Agent高度一致,或者Referer缺失、伪造。对请求头做熵值计算,正常流量的UA字符串熵值高、种类多,攻击流量的熵值低、重复率高。同样,正常用户请求的资源大小分布符合业务逻辑,HTML、CSS、JS、图片的请求比例相对稳定,攻击流量可能只打首页或者某个重接口,导致资源类型比例严重失衡。

协议行为与TCP/IP指纹分析

网络层和传输层的指纹是区分攻击流量的重要依据。SYN Flood攻击中,攻击者发送大量SYN包但不完成三次握手,或者伪造源IP使服务器无法收到ACK。通过监控半开连接队列的占用率、SYN重传次数、以及SYN与ACK的比例,可以快速识别这类攻击。正常用户的TCP握手成功率接近100%,而攻击流量的握手完成率会显著下降。此外,TCP窗口大小、TTL值、IP分片行为、TCP选项字段的排列,都能形成设备指纹。真实用户来自各种操作系统和网络环境,指纹分布广泛;攻击流量如果来自固定的攻击工具或僵尸网络,指纹会呈现聚类特征。

UDP Flood和反射放大攻击则更容易通过协议特性识别。正常业务中UDP流量占比通常很低,除非是DNS、游戏或音视频服务。如果某个UDP端口突然收到海量来自不同源IP的响应包,且响应包远大于请求包,基本可以确定是反射放大攻击。检查UDP载荷的内容,正常DNS响应包含合法的域名解析记录,攻击响应往往是固定模板或者异常大的TXT记录。对于TCP四层攻击,还可以观察RST包的比例。真实用户在连接中断时会发送合理的RST,攻击流量在耗尽资源后可能产生大量异常RST或根本无响应。

应用层行为建模与业务逻辑校验

应用层攻击最难区分,因为HTTP请求在协议层面完全合法。此时必须深入业务逻辑。一个有效的做法是建立用户行为的状态机。真实用户在网站上的操作有先后顺序:先访问首页,再浏览列表,点击详情,加入购物车,最后结算。每个步骤之间存在时间间隔,且间隔服从人类反应时间的分布。攻击脚本往往跳过中间步骤,直接请求结算接口或登录接口,请求间隔极短且机械。对关键业务接口做访问路径分析,如果大量请求没有前置页面访问记录,或者前置页面与当前请求的关联性极低,这些流量就值得高度怀疑。

另一个强特征是Cookie和Session的合法性。正常用户在首次访问时会获得服务器下发的Cookie,后续请求携带该Cookie,Session中记录了用户的浏览历史。攻击流量如果未携带合法Cookie,或者Cookie是伪造的、Session状态异常,就可以直接拦截。对于需要登录的接口,检查Token的有效性和绑定关系。攻击者可能通过撞库或凭证填充发起攻击,此时登录失败率会异常升高,同一账号或同一IP的失败次数远超正常水平。对登录失败率、密码错误类型、账号活跃度做实时统计,能有效识别凭证类攻击。

设备环境和浏览器指纹也是应用层区分的重要手段。真实用户的浏览器会执行JavaScript,拥有完整的DOM环境、Canvas指纹、WebGL信息、屏幕分辨率和时区。攻击工具如果使用简单的HTTP客户端,这些环境信息缺失或高度一致。通过注入JavaScript挑战,要求客户端计算一个动态令牌,可以区分真实浏览器和脚本。但要注意,这种挑战会增加正常用户的延迟,适合在怀疑流量异常时按需启用,而不是全量开启。对于API接口,可以校验请求头中的自定义签名、时间戳和Nonce值,防止重放攻击和伪造请求。

统计模型与机器学习方法

当攻击流量规模大且特征多变时,人工规则难以覆盖所有情况,需要引入统计模型和机器学习。一种常用的方法是对正常流量进行离线建模,提取多维特征向量,包括请求速率、URL熵、UA熵、连接持续时间、请求间隔分布、TCP标志位比例等。然后用孤立森林、One-Class SVM或自编码器做异常检测。这些模型在训练时只使用正常流量,学习正常行为的边界,在线检测时对偏离边界的流量打上异常分数。异常分数超过阈值的请求进入验证流程,比如弹出JavaScript挑战或要求输入验证码。

更精细的做法是使用有监督学习,前提是能获得标注好的攻击样本。特征工程可以加入时间序列特征,比如过去1分钟、5分钟、15分钟的滑动窗口统计量,捕捉攻击的突发性。模型选择上,梯度提升树在表格型特征上表现稳定,能处理特征间的非线性关系。深度学习中的LSTM或Transformer可以捕捉请求序列的时序模式,识别低频慢速攻击。但机器学习模型需要定期更新,因为攻击手法在不断演化,模型会逐渐失效。线上部署时还要注意推理延迟,复杂模型可能成为新的性能瓶颈。

统计方法中有一个实用技巧是基线自学习。系统在正常运行期间持续计算每个维度的均值和标准差,形成动态基线。当实时指标偏离基线超过一定倍数时触发告警和拦截。基线的更新周期要合理,太短容易被攻击流量污染,太长则无法适应业务变化。可以采用指数加权移动平均,让近期数据权重更高,同时设置异常数据剔除机制,避免攻击流量拉偏基线。

结合业务优先级的分级处置策略

区分出攻击流量后,处置策略同样关键。不能把所有异常流量一刀切地丢弃,因为可能存在误判。建议采用分级处置:对于高置信度的攻击流量,直接在边缘节点丢弃或黑洞路由;对于中等置信度的可疑流量,进行人机验证、限速或降级服务;对于低置信度的异常,只记录日志并继续观察。业务接口也要分级,核心交易接口的防护阈值设置得更严格,静态资源接口可以适当放宽。

在实际部署中,将检测点前置到边缘网络能大幅减轻源站压力。CDN节点、负载均衡器和反向代理层都可以做初步的速率限制和特征过滤。源站只接收通过边缘验证的流量。对于大型DDoS攻击,还需要与上游运营商联动,通过BGP Flow Spec或RTBH进行近源压制。但近源压制会误伤同网段的正常用户,需要谨慎评估。

最后要强调的是,DDoS攻击流量与业务流量的区分是一个持续对抗的过程。攻击者会不断调整攻击工具,模拟更真实的浏览器行为,使用代理池分散源IP,降低单IP速率以规避阈值。防御方需要结合多种信号,从网络层到应用层建立纵深检测体系,同时利用业务自身的逻辑作为最强判别器。没有任何单一技术能永久解决这个问题,只有持续监控、持续学习、持续优化策略,才能在攻击与防御的动态平衡中保持业务的可用性。