短视频平台遭遇大流量DDoS攻击时,最直观的感受不是带宽跑满,而是用户刷到第三条视频就开始无限转圈。攻击者早已摸透了CDN的缓存策略,专挑动态接口下手——用户登录态校验、弹幕投屏信令、实时推荐算法回源请求,这些无法缓存的节点才是真正的七寸。去年某头部平台在晚高峰被600G混合流量冲击,攻击持续72分钟,直接损失超过八位数。事后复盘发现,攻击流量中60%是模拟正常用户行为的慢速连接耗尽,30%是UDP反射放大,剩下10%才是传统的SYN Flood。这说明单纯堆带宽和清洗设备已经过时了,攻击者比你更懂你的业务逻辑。

攻击流量指纹提取与动态过滤

第一件事不是买清洗服务,而是从现有日志里把攻击指纹捞出来。大流量DDoS攻击看似杂乱,实际上每个攻击工具包都会留下特征:TCP窗口大小固定值、IP分片偏移量规律、HTTP Header顺序异常、TLS指纹与宣称User-Agent不匹配。在流量入口部署轻量级抓包,用tcpdump配合自定义BPF过滤器抓取前100个字节就够用了。关键命令如下:

tcpdump -i eth0 -c 10000 -w attack_sample.pcap 'tcp[tcpflags] & (tcp-syn) != 0'

拿到pcap文件后用Zeek或者自研脚本分析,重点关注TCP握手阶段的初始序列号分布、IP生存时间值的集中度、以及TLS ClientHello中的密码套件顺序。正常移动端设备的TLS指纹千差万别,但攻击脚本往往使用固定版本的OpenSSL库,密码套件排列完全一致。把这些特征抽象成规则,下发到前置的XDP/DPDK防火墙,在内核旁路直接丢弃匹配流量,单台x86服务器就能扛住200Gbps的过滤压力。某短视频平台用这个方法过滤掉了攻击流量中80%的UDP反射包,因为反射放大的响应包TTL值普遍集中在240-255之间,而真实用户经过运营商NAT后的TTL分布要分散得多。

动态接口的令牌化改造

攻击者最爱打的是那些需要回源验证的动态接口。用户每次下拉刷新推荐流,客户端会带上一个签名参数向推荐引擎请求新内容列表,这个签名算法一旦被逆向,攻击者就能用少量计算资源伪造海量合法请求直捣后端数据库。解决方案不是把签名算法搞得更复杂,而是引入一次性的会话令牌机制。具体做法是在CDN边缘节点部署轻量级验证逻辑,用户首次建立连接时,边缘节点向中心令牌服务申请一个绑定该会话ID的临时通行证,有效期30秒,过期后需要携带上一个视频流的校验码才能续期。这样一来,即使攻击者拿到了签名算法,没有经过完整观看流程拿不到校验码,伪造的请求在边缘层就被拦截了。

实现上可以用Redis集群做令牌存储,每个令牌只占几十字节,单节点支撑百万级并发毫无压力。边缘节点用Lua脚本在Nginx或者OpenResty里完成校验,逻辑很简单:检查令牌是否存在、是否绑定当前会话ID、是否在有效期内,三个条件任意一个不满足就直接返回空列表,连后端都不用回源。这套机制上线后,某平台推荐接口的无效请求量下降了94%,真正做到了让攻击者算力白费。

业务感知的智能限速

传统的令牌桶和漏桶算法在大流量面前有个致命缺陷:它们分不清一个用户疯狂刷新是因为网络卡顿还是攻击脚本在跑。短视频场景下,正常用户的请求频率是有规律可循的——看完一个15秒视频才会请求下一个,中间穿插点赞和评论操作,时间间隔符合人类操作节奏。而攻击工具的请求间隔要么是固定毫秒级,要么是完全随机,这两种模式在频谱分析下差异巨大。

在网关层对每个会话的请求间隔做实时傅里叶变换不现实,但可以做简化版的时序分析。维护一个滑动窗口记录最近20次请求的时间戳,计算间隔的标准差。正常人类操作的间隔标准差通常在2-8秒之间,而脚本攻击的标准差要么接近0,要么超过30秒。当标准差低于阈值时,逐步降低该会话的优先级,把它的请求放到低优先级队列;如果标准差仍然异常且持续超过60秒,直接断开连接并封禁IP和设备指纹的映射关系。这个策略的精妙之处在于,它不会误伤那些网速慢反复重试的真实用户,因为网络波动导致的请求间隔标准差反而偏大,和攻击特征正好相反。

多层级资源隔离与降级

当攻击流量大到一定程度,任何过滤手段都会消耗资源。这时候要做的是保住核心功能,牺牲非关键模块。把短视频平台的功能拆成三个等级:核心级包括视频流播放、用户登录、支付结算,这些服务部署在独立集群上,物理机和网络链路都和其他业务隔离开,即使其他模块全部瘫痪,用户至少还能刷视频。次要级包括评论、点赞、关注,这些功能在遭受攻击时可以降级为异步处理,用户操作后显示一个假成功状态,实际写入消息队列排队处理,前端无感知。可抛弃级包括弹幕实时推送、在线人数显示、热门榜单更新,这些功能在检测到异常流量时直接关闭,节省出来的计算资源全部让给核心服务。

资源隔离的关键在于网络层面的物理分光。不要把所有业务都挂在同一个负载均衡器后面,而是用多个VIP分别承载不同等级的服务。核心服务的VIP配置严格的ACL规则,只允许经过清洗中心验证的流量进入;次要服务的VIP可以承受一定程度的丢包,配置更激进的连接超时参数;可抛弃服务的VIP在攻击发生时直接通过BGP宣告撤销路由,让攻击流量打到黑洞里。某平台在一次800G攻击中靠这套架构保住了视频播放成功率维持在99.2%,虽然用户暂时看不到弹幕和在线人数,但至少内容消费没断,留存影响降到了最低。

基于eBPF的内核级异常检测

应用层的检测再快也快不过内核协议栈的处理速度。当SYN Flood达到一定量级,服务器的CPU根本不是花在处理业务逻辑上,而是全部消耗在TCP三次握手的中断处理上。eBPF技术可以在网卡驱动层面就把异常流量识别出来,连内核协议栈都不用进。编写一个XDP程序挂载到网卡驱动上,对每个进来的包检查五元组和标志位,如果同一个源IP在1秒内发送超过100个SYN包且没有完成过任何一次完整握手,直接丢包并记录到eBPF Map里。这个Map可以同时被用户态程序读取,用于实时更新黑名单。

更进阶的用法是把eBPF和机器学习模型结合起来。在用户态用Python训练一个轻量级的随机森林模型,输入特征是包长分布、到达间隔、协议类型比例、端口号熵值等维度,然后把模型参数导出,在内核态用eBPF实现推理逻辑。虽然eBPF指令集有限,不支持浮点运算,但随机森林的判断本质就是一系列if-else条件判断,完全可以用eBPF实现。这样每个数据包在网卡层面就能得到恶意评分,高分的直接丢弃,整个流程延迟不超过微秒级。某平台在生产环境部署这套方案后,单台边缘服务器的有效吞吐量提升了3倍,因为CPU终于不用处理那些注定要被丢弃的攻击包了。

全局流量调度与IP信誉库联动

大流量攻击往往不是从一个方向来的,攻击者会租用全球各地的僵尸网络同时发起攻击。如果所有清洗能力都集中在单一节点,很容易被打穿。短视频平台通常已经部署了多机房多CDN的架构,关键在于调度系统能不能在攻击发生时快速切换流量。自研的全局负载均衡需要具备秒级生效的能力,不能依赖DNS这种生效慢的机制。做法是在客户端SDK里内置多个备用接入点,当主接入点连续三次请求超时,自动切换到备用点,同时上报切换原因。调度中心汇总所有客户端的切换报告,一旦发现某个机房的切换率异常飙升,立刻触发流量调度策略,把该机房的BGP宣告权重降低,让上游运营商把流量导到其他机房。

IP信誉库的作用被很多人低估了。攻击源的IP虽然变化多端,但很多僵尸网络的主控节点IP是相对固定的,这些IP通常托管在特定云服务商的低信誉网段。维护一个动态更新的IP信誉库,数据来源包括公开威胁情报、行业共享的攻击IP列表、以及自家业务日志中挖掘出的恶意IP。在流量入口对每个请求的源IP查询信誉库,低信誉IP的请求直接降权处理,限制其访问频次和可调用的接口范围。这个策略的效果是累进式的,信誉库越丰富,攻击者的可用资源就越少。某短视频平台经过两年积累,自研信誉库已经覆盖了全球超过3000万个恶意IP,日常就能拦截掉40%的扫描和探测流量。

实战复盘与持续优化

每次攻击结束后,必须做完整的复盘。复盘不是写报告交差,而是要把攻击过程中暴露的弱点逐一修补。分析维度包括:攻击流量最先打穿的是哪个环节、哪个防护策略没生效、哪个降级操作导致了用户可感知的体验下降、清洗设备的策略更新延迟有多大。把这些发现转化为具体的优化项,排进下一个迭代周期。攻击者的手法在进化,防护策略也必须跟着进化。那些认为买一套清洗设备就能高枕无忧的团队,最终都会在某个深夜被告警电话惊醒。真正有效的防护是一套活的体系,它从流量指纹、业务逻辑、内核网络栈、全局调度四个层面层层设防,让攻击者每前进一步都要付出巨大成本,直到攻击的收益远低于成本,攻击自然就停止了。