基于基线流量做对比,慢速攻击的核心特征是“连接不断、请求不完、数据不齐”,不建立正常流量的参照系,这三个“不”就很难被识别。
为什么基线流量能暴露慢速攻击的伪装
慢速攻击和CC攻击(Challenge Collapsar)的本质区别在于“量”,CC攻击靠海量请求瞬间打满带宽或连接数,特征像洪水,一眼就能看出来,慢速攻击正好相反,它用的连接数量很少,每个连接都表现得像真实用户,只是把请求拆得极慢,服务器像餐厅服务员,正常客人点单再慢也有个度,慢速攻击则是一群人坐下后,每隔几十秒才说一个字,把服务员活活耗在桌边。
多数防护设备对“大流量、高并发”敏感,对“低速率长连接”却容易忽视,不对比基线流量,你只会看到连接数略有增加,负载小幅上升,甚至误判成网络抖动或某个用户网络差。基线的价值在于定义了“正常”的边界,越界部分才有资格被怀疑。 没有基线,所有流量看起来都正常;有了基线,慢速攻击的低速率、长占用才显出原形。
慢速攻击 怎么发现:三步对比法
排查慢速攻击不靠直觉,靠对照,从抓取数据到锁定异常,遵循下面三步。
第一步:抓取同一时间窗口的历史流量
先准备一台能镜像流量的服务器,或用交换机端口镜像,抓一周的链路数据,注意覆盖业务高低峰,带宽、连接数、请求完成时长都要记录。
# 抓取后续用于对比的基线流量 tcpdump -i eth0 -nn -s 0 port 80 -w /data/baseline_$(date +%Y%m%d).pcap
建议抓取完整一周,只有一两天的数据容易撞上促销或攻击日,基线本身就失真,抓完后计算每个时间段的平均连接数、请求分布与处理时长,作为“正常”的样本。
第二步:对比连接生命周期
慢速攻击的关键不在连接数量,而在连接内的时间分布,将实时流量与基线做对比时,重点看三个指标:
- 连接存活时间中位数:正常静态资源的连接几秒内结束,慢速攻击能把一个TCP连接保持十几分钟。
- 请求头传输间隔:正常浏览器会在几十毫秒内连续发送多个Header,慢速攻击的Header之间停顿常超过30秒。
- 请求完成率:同一时间段内,完成请求数占新建连接数的比例,攻击时大量连接只开了头,不到尾。
通过对比这三个指标,即便连接总数没异常,也能捕捉到“时间维度”上的偏差,具体定位时,先用netstat或ss看连接状态:
# 查看当前所有TCP连接及状态
ss -ant | grep 'ESTAB' | awk '{print $6}' | sort | uniq -c | sort -rn
如果在TIME_WAIT和ESTABLISHED状态中,有大量连接长时间处于ESTABLISHED且发送/接收队列异常堆积,那就是值得深挖的信号。
第三步:针对三种常见变体做专项比对
慢速攻击只是一个总称,实际对抗中主要有三种变体,每种在基线对比下的异常表现不同:
| 攻击类型 | 基线下的正常表现 | 攻击时的可识别特征 | 排查操作 |
|---|---|---|---|
| Slowloris | 请求头完整且快速发送 | 连接建立了,但Headers迟迟不结束,每次只发一行 | nginx日志中出现大量“client timed out” |
| Slow POST | 请求体按Content-Length声明逐步上传 | Body发送速度远低于正常带宽,每分钟几字节 | 后台上传接口的并发长期占满 |
| Slow Read | 客户端窗口大小正常 | 服务端有大量待发送数据,但客户端窗口长期为0 | 观察TCP窗口大小,持续低于基线最小值 |
对比时建议用iftop或ntopng观察单IP流量,正常用户访问会产生持续且波动的上下行流量,慢速攻击的IP流量图则像一条近乎水平的细线,偶尔出现一个小的波形,然后继续沉寂,这种对比不需要多高深的工具,时间轴拉长后肉眼可辨。
服务器性能监控与基线对比工具的选择
要做持续的基线对比,手工抓包只能应急,日常巡检离不开性能监控工具,选型不需要追求大而全,按以下分类各挑一款就够用:
- 流量分析类:ntopng、Zeek,重点看连接时长分布和协议行为。
- 日志分析类:GoAccess、ELK,重点看请求完成率与耗时。
- 抓包取证类:Wireshark、tcpdump,用于攻击发生时留存证据。
用日志做对比时,nginx的$request_time和$upstream_response_time是核心字段,基线期记录各接口的耗时P50和P99值,当P99突然飙升而P50不变时,通常是少数恶意连接拖慢了整体表现,这个特征与慢速攻击的占用方式高度吻合。
网站慢速攻击排查方法:从告警到定位
假设一个具体场景:某电商网站工作日上午,监控大屏显示连接数没有明显上涨,但用户投诉页面加载缓慢,查看负载后发现CPU和带宽都正常,只有进程数偏高,这时如果不对比基线,很容易认为只是流量小高峰,实际上攻击者已经在消耗连接池了。
完整排查路径如下:
- 查服务器连接数:通过
ss -s看系统级连接统计,对比前三天同时段的输出,正常情况下,连接数波动在10%以内;异常时ESTABLISHED连接总数可能没变,但等待处理的队列变长。 - 看Web服务器状态:nginx的
ngx_http_stub_status_module会输出Active connections和Waiting计数,基线中Waiting通常较高,Reading和Writing很低;攻击时Reading会异常升高,说明有大量连接卡在读取请求头阶段。 - 核对单IP连接数:用脚本统计每个IP的并发连接数,与基线期做对比,慢速攻击不像DDoS那样单IP有几百上千的连接,它可能只有每个IP几个连接,但来自大量IP,所以看Top 10 IP意义不大,要关注“连接数排名靠前的IP数量是否增多”。
- 验证数据包规律:用
tcpdump -i eth0 'tcp[13] == 0x10'抓取ACK包,统计来源IP,如果大量IP每10-20秒发一个ACK再没下文,基本可以确认是Slowloris或Slow POST变种。
这套流程走完,通常能在5分钟内锁定攻击特征,防御上直接调整超时参数只能缓解,比如将client_header_timeout从60秒调低到15秒,但根本解法还是先在CDN或云防火墙层面对慢速连接做限速,据工信部网络安全管理局公开通报,近年来针对政企网站的慢速攻击占比持续上升,其中依托应用层协议特性发起的攻击最难以被传统DDoS清洗设备识别,将流量镜像到安全设备,与基线数据实时比对,是现阶段更可靠的检测路径。
把基线对比固化到日常安全巡检
基线对比不能只在大促或遭受攻击时做一次,应该纳入常态化的运维巡检里。
先给不同业务的流量“画像”
业务类型不同,基线差异很大,不能一概而论。
- 静态资源服务器:请求频率高、每个TCP连接生命周期短,85%以上的连接应在10秒内完成。
-
动态API和登录接口:连接时间长、交互次数多,请求头间隔通常在1-2秒以内。
- 文件上传服务:一旦出现Content-Length声明很大而实际发送极慢的连接,无论是否超过基线,都应直接封禁。
设定多级阈值而非单一固定值
阈值本身要有弹性,建议一次设定三级:
- 第一级:连接存活时间超过基线P95值3倍时,记录并观察。
- 第二级:超过P95值5倍且长期占用空闲连接,限制该IP并发数。
- 第三级:连接数与基线相比稳定但连接时长持续漂移,触发告警转人工审计。
很多团队会问要不要直接用云WAF,云WAF对百万级并发的大流量清洗效果好,对慢速攻击的覆盖参差不齐,主要取决于WAF是否维护了客户正常业务流量的动态基线,部署时可以同时开启WAF和本地流量分析,本地工具负责发现疑似慢速连接并打标记,WAF负责按标记自动下发拦截策略,分工明确。
慢速攻击基线对比常见问题解答
问:如果没有独立的安全团队,手工对比基线流量可行吗?
可行,先用计划任务每天凌晨导出前一天nginx访问日志,基于$request_time算出P50和P99值存为文本文件,再用diff对比每日数据,首次连续记录一周作为初始基线,之后每天关注P99值的漂移幅度,数据量不大时,这个方法投入成本很低,但能覆盖大多数慢速攻击场景。
问:云服务器上的流量镜像和本地抓包,哪种更适合做基线?
混合使用,流量镜像能看到全链路数据,包括入方向和出方向的完整报文,适合在VPC内部署Zeek做长期基线建模;本地tcpdump适合攻击发生时临时抓包做协议细节取证,能清晰看到TCP窗口、序列号等底层信息,只选一种的话,优先上流量镜像,覆盖面更大且不影响业务性能。
问:攻击者如果也盯着基线做“仿真”流量,对比法会不会失效?
理论上存在这种可能,但实际代价极高,攻击者要模拟正常流量,必须同时模拟TCP连接的时序、请求头的发送速率、页面资源的获取顺序,还需要分布式控制大量来源IP,成本和复杂度远高于直接打流量,基线对比法真正防住的不是高智商攻击者,而是绝大多数偷懒的攻击者他们依然沿用工具默认的30秒间隔或1字节窗口,这类行为在基线数据面前无所遁形。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/652410.html





