检测慢速攻击,别只盯着总流量和请求数,每连接平均发送速率才是更直接的判据,慢速攻击的典型表现就是单连接速率被压得极低,连接时间被拉得很长,服务器资源在不知不觉中被耗尽。
慢速攻击和CC攻击的区别:为什么每连接平均发送速率能一眼看穿
慢速攻击像一个故意拖长结账时间的顾客,单个动作不凶,但占着窗口不放手,CC攻击则像一群人同时冲进来快速下单,流量大、请求多、时间短,两者都会耗尽服务器资源,但判断方法完全不同。
- CC攻击:并发连接数大,单个连接发送速率正常甚至偏高,连接生命周期短,总流量大,CPU和带宽有直观压力。
- 慢速攻击:并发连接数不一定大,单个连接每隔几秒甚至十几秒才发一个字节或一个头部,生命周期很长,总流量不大,CPU和带宽看起来不高。
- 每连接平均发送速率:CC攻击多数连接速率接近正常HTTP请求;慢速攻击的连接速率明显低于日常基线,通常只有几十字节/秒甚至更低。
在慢速攻击检测里,每连接平均发送速率是比总流量、总请求数更敏锐的指标,用一张表对比:
| 维度 | CC攻击 | 慢速攻击 |
| 连接速率特征 | 单连接发送速率正常或较高 | 单连接发送速率极低 |
| 连接持续时间 | 短,快速完成或断开 | 长,可能持续数十秒到数分钟 |
| 总流量压力 | 大 | 小 |
| 常见症状 | CPU、带宽打满 | 连接表占满,响应变慢 |
怎么判断服务器被慢速攻击?先看单个连接发送速率
判断服务器是否被慢速攻击,第一步不是看CPU图表,而是看有多少连接处于建立状态,并且每个连接平均发了多少数据。
具体路径:
- 登录服务器,执行
ss -tanp | grep ESTAB | grep ':80 ',观察是否存在大量长时间建立状态的连接。 - 用
ss -tanio查看每个连接的发送队列和接收队列,慢速攻击连接通常接收队列很小但保持时间很长。 - 抓包统计每连接字节数,计算速率。
每连接平均发送速率的计算与阈值参照
每连接平均发送速率的计算并不复杂:统计一个TCP连接在单位时间内发送的应用层字节数,再除以连接持续时间,公式可以写作:
- 每连接平均发送速率 = 该连接发送字节数 / 连接持续时间
例如一个连接建立了60秒,只发送了600字节,速率就是10字节/秒,正常HTTP短连接可能在1秒内发送几十千字节甚至更多,速率差距非常明显。
用tcpdump和tshark快速统计连接字节数
Linux环境可以用tcpdump抓取80或443端口流量,再用tshark按连接聚合统计。
具体步骤:
- 抓取HTTP流量:
tcpdump -i eth0 -nn 'tcp port 80' -w slow.pcap
- 等待30秒或更长时间后按Ctrl+C停止。
- 用tshark查看TCP会话统计:
tshark -r slow.pcap -q -z conv,tcp
- 输出中可以看到每个TCP会话的总字节数和持续时间,手动计算速率。
如果连接数量较多,可以导出到CSV后用awk或Python脚本批量计算每连接速率。
用ss配合watch观察连接持续时间
不抓包时,ss也能给出快速线索:
- 查看当前80端口建立连接:
ss -tanp | grep ESTAB | grep ':80 '
- 每隔5秒刷新连接数:
watch -n 5 'ss -tanp | grep ESTAB | grep ":80 " | wc -l'
- 如果同一批客户端IP长时间不释放,且TCP状态保持ESTAB,就需要进一步核算速率。
阈值怎么定:低到多少需要警惕
没有绝对标准,主要看服务器日常基线,行业共识认为,当大量连接的每连接平均发送速率持续低于日常基线的十分之一时,就需要启动慢速攻击排查,比如正常用户平均每秒发送几千字节,慢速攻击连接可能每秒只有几十字节,差距很大,移动网络或弱网用户偶尔也会出现低速,但不会长时间保持大量连接。
网站被慢速攻击怎么办:从检测到拦截的实操路径
确认慢速攻击后,处理顺序应该是先识别攻击特征,再在协议层和防火墙层做限制,最后配合应用层规则持续观察。
先验证攻击类型,避免误杀正常低速客户端
慢速攻击常见三种:
- Slowloris:建立连接后每隔一段时间发送一个不完整的HTTP头部。
- Slow POST:声明较大Content-Length,但请求体发送极慢。
- Slow Read:客户端接收响应时故意把TCP窗口调小,迫使服务器慢速发送。
可以通过抓包查看请求是否完整、头部是否结束、POST体速率是否异常,不要一看到低速率就封IP,尤其国内移动网络用户可能因信号问题出现短时低速率。
Nginx与Apache的慢速攻击防御参数
Nginx侧可以调整超时和最小速率参数:
client_header_timeout 5s;定义客户端发送完整请求头的超时时间。client_body_timeout 5s;定义请求体的读取超时。send_timeout 10s;限制向客户端发送响应的超时。limit_rate 20k;限制单个连接响应速率,但要注意不影响正常下载业务。
Apache侧可以使用:
RequestReadTimeout header=5,MinRate=500 body=10,MinRate=500- 其中
MinRate=500表示每秒至少接收500字节,低于此值会触发超时。
配置后执行 nginx -t 或 apachectl configtest 验证语法,再重载服务。
用iptables限制单IP连接数和新建速率
防火墙层可以挡住一部分攻击连接:
- 限制单IP对80端口的并发连接数:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
- 限制新建连接速率,避免短时间建立大量慢速连接:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 10/s --limit-burst 20 -j ACCEPT
- 注意规则顺序,确保正常流量先放行。
服务器慢速攻击检测工具免费推荐
检测慢速攻击不一定需要商业设备,以下免费工具可以覆盖多数自查场景。
- tcpdump:免费命令行抓包工具,几乎每个Linux发行版自带。
- tshark/Wireshark:免费分析抓包文件,按会话统计字节数和速率。
- ngrep:免费实时匹配HTTP请求内容,适合观察慢速请求头。
- slowhttptest:免费慢速攻击模拟工具,用来验证防御配置是否生效。
- Nginx/Apache日志:结合自定义日志格式记录请求处理时间,查找耗时异常连接。
用slowhttptest模拟慢速连接并观察速率
防御配置生效前,可以先用slowhttptest在测试环境验证:
- 模拟慢速头部攻击:
slowhttptest -c 200 -H -g -o slowhttp -i 10 -r 200 -t GET -u http://测试IP/ -x 24 -p 3
- 参数含义:
连接数,-c
-H慢速头部模式,-i发送间隔秒数,-r每秒连接数,-x攻击时长,-p超时时间。 - 测试期间在服务器上用前面命令观察每连接平均发送速率,并检查是否触发超时断开。
国内服务器慢速攻击检测的常见误区
国内服务器部署环境多样,检测慢速攻击时有几个坑需要避开。
- 只看带宽和CPU占用:慢速攻击流量小,带宽压力不大,但连接表会先被打满。
- 只统计请求总数:慢速攻击请求数不多,但每个请求持续时间极长。
- 把弱网用户误判为攻击:移动4G/5G信号不稳定时,部分连接也会出现低速,需结合持续时间判断。
- 忽略TLS握手后攻击:HTTPS站点可能在TLS握手完成后才进行慢速读取,抓包要关注443端口应用层速率。
正确做法是建立每连接平均发送速率基线,结合连接持续时间、IP集中度、请求完整性综合分析,单看任何一个指标都容易漏判。
检测慢速攻击的核心始终是每连接平均发送速率,把总流量、总请求数放到一边,先看单个连接在单位时间内发了多少数据,很多隐蔽攻击会立刻现形。
Q&A:检测慢速攻击每连接平均发送速率相关问题
检测慢速攻击时每连接平均发送速率多少算异常?
异常没有固定数字,要和自身业务基线比较,多数正常HTTP短连接的速率在每秒几千字节以上,慢速攻击连接往往只有每秒几十字节甚至更低,当大量连接连续几分钟都低于日常基线的十分之一,就应当重点排查。
每连接平均发送速率低就一定是慢速攻击吗?
不一定,弱网、移动网络切换、某些长连接API轮询都可能出现低速率,判断时要同时看连接数量、持续时间、源IP集中度和请求内容完整性,单一低速率连接可能是正常用户,大量同源低速连接才是攻击特征。
服务器慢速攻击检测工具免费能用吗?
可以用,tcpdump、tshark、ngrep、slowhttptest都是免费开源工具,能完成抓包、统计、模拟验证等核心检测工作,商业设备的价值主要体现在自动化分析和集群联动上,对于单台服务器的慢速攻击检测来说,免费工具配合系统参数和防火墙规则已经足够完成大部分排查任务。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/636411.html





