服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-08-23 更新于 2026-08-23 简米科技 4,568 字 11 分钟阅读

慢速攻击如何利用协议耐心机制拖垮线程池,服务器防护方法

导读先弄清它靠协议耐心机制做了什么慢速攻击(Slow Attack)本质上是在合法协议内“磨时间”,用极低的发送速率长期占用服务器连接,最终把线程池和并发连接表彻底塞满,让正常访客连握手都完不成,它不靠流量洪峰,靠的是服务器“等”得比你久,防御慢速度攻击,核心思路不是加带宽,而是把服务器的“耐心值”调到比攻击者更低……

先弄清它靠协议耐心机制做了什么

慢速攻击(Slow Attack)本质上是在合法协议内“磨时间”,用极低的发送速率长期占用服务器连接,最终把线程池和并发连接表彻底塞满,让正常访客连握手都完不成。它不靠流量洪峰,靠的是服务器“等”得比你久,防御慢速度攻击,核心思路不是加带宽,而是把服务器的“耐心值”调到比攻击者更低。

慢速攻击为什么能拖垮线程池:协议耐心的设计初衷

HTTP协议和TCP协议在设计时,默认网络环境是不可靠且慢速的,为了让弱网用户也能正常访问,服务器必须容忍长时间的“半连接”或“部分请求”状态,这个容忍窗口,就是协议耐心机制,慢速攻击盯上的,就是这段窗口。

攻击者的游戏:用最小流量占住最贵资源

攻击者打开一个连接后,不发送完整请求,而是每隔几分钟发一个字节,或者发完请求头后迟迟不发送请求体,服务器端,接收线程、内存缓冲区、Socket文件描述符、进程控制块,全部被这些半死不活的连接占着。

线程池模型下每个连接会绑定一个线程,线程要等请求数据到齐才能释放。当攻击者同时开几千个这样的慢连接,线程池就瞬间见底,后续的连接请求全部排队或者直接拒绝。

线程池模型下的连锁崩溃

线程池的设计目标是限流和复用,它假设请求会在毫秒或秒级完成,慢速攻击直接把请求完成时间从毫秒拉到分钟甚至小时级,线程的周转率直线下降,再大的线程池也会在几分钟内耗尽,更麻烦的是,很多服务器对半连接的超时设置是60秒到300秒,攻击者只要赶在超时前“喂一口”,连接就能一直存活。

slowloris攻击原理和Slow POST:两种最典型的耐心消耗器

防御慢速攻击,必须先认识两个最经典的工具,它们在原理上都在利用协议耐心机制,但侧重点不同。

slowloris:请求头永远差一行

slowloris攻击的原理是:向目标服务器建立大量连接,发送一个不完整的HTTP请求头,比如只发GET / HTTP/1.1和几个头字段,然后循环发送X-a: b这样的空头字段,让服务器看着像“还在传输”,但请求永远不结束。

行业共识认为,slowloris对Apache等每连接一个进程或线程的服务器杀伤力最大,因为Apache默认会等待完整的请求头,而这个等待没有合理的上限时,Worker进程会被全部卡死。

Slow POST:请求体永远差一点

Slow POST攻击把耐心戏法用在了请求体上,攻

慢速攻击如何利用协议耐心机制拖垮线程池,服务器防护方法

击者正常发送请求头,声明一个较大的Content-Length,比如100MB,随后以极低的速率(比如每10秒1字节)发送请求体,服务器接收请求体的逻辑会一直等待,连接长期占用,线程池持续被消耗,这类攻击针对Nginx、IIS、Tomcat等常见应用服务器普遍有效,因为大多数服务器默认不限制请求体接收的超时时间和速率

慢速攻击和普通DDoS攻击有什么区别:流量与耐心的对比

很多站长把慢速攻击和DDoS混为一谈,实际上两者的防护方案完全不同。

对比维度 普通DDoS(如SYN Flood、UDP Flood) 慢速攻击(Slowloris、Slow POST)
攻击流量 大流量,常达数十Gbps 极小流量,每个连接仅数个字节
攻击目标 占满带宽、耗尽CPU资源 占满连接表、拖垮线程池
特征识别 容易通过流量清洗发现 隐蔽性强,普通流量监控不易发现
常见防御 高防IP、流量清洗、黑洞 调低超时、限速、反代层缓冲

从防御角度看,防大流量DDoS的硬件设备未必能防慢速攻击,因为慢速攻击的每一条连接看起来都“正常”,单个IP的连接频率也不夸张,传统清洗设备可能根本没触发告警,但服务器的线程池已经被拖垮了,这就是慢速攻击最阴险的地方。

慢速攻击来临时,服务器日志和监控里有什么信号

慢速攻击不是无迹可寻的,在攻击发生时,你可以在服务器监控面板和日志里看到明显的异常模式:

  • 连接数异常但CPU占用不高:大量ESTABLISHED状态连接,但请求处理量很低,系统负载没有明显上涨。
  • 访问日志中大量超时记录:日志里出现大量client timed outupstream timed out,而真实业务请求量没有变化。
  • 线程池监控爆满:如果使用Tomcat,JMX监控里的busyThreads持续接近最大值;如果使用Nginx,worker_connections很快被耗尽。
  • 同一IP的请求间隔异常均匀:攻击者的发包间隔往往固定,用抓包工具能看到请求数据包以极其稳定的节奏到达。

你可以用netstat -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n快速统计各IP的连接数,排查是否存在集中式的慢连接,也可以用ss -s查看系统的Socket整体状态,观察ESTABLISHED连接数量是否远超日常水平。

慢速攻击如何利用协议耐心机制拖垮线程池,服务器防护方法

慢速攻击防御实操:把服务器的耐心调回到合理数值

防御慢速攻击,思路是限制服务器等待半连接的时间,并限制单IP的并发连接数,下面给出常见的配置方法。

Nginx配置层面的基础加固

Nginx的client_header_timeoutclient_body_timeout是防御慢速攻击的关键指令,默认值往往为60秒,建议调整:

http {
    # 请求头超时,超过则返回408
    client_header_timeout 10s;
    # 请求体超时,超过则408
    client_body_timeout 10s;
    # 单个请求的连接超时
    keepalive_timeout 10s;
    # 限制请求体大小,防止超大Content-Length声明消耗资源
    client_max_body_size 1m;
    # 限制单IP并发连接数
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    # 限制单IP请求速率
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s;
    server {
        # 每个IP最多同时10个连接
        limit_conn conn_limit_per_ip 10;
        # 每IP每秒最多2个请求,突发5个
        limit_req zone=req_limit_per_ip burst=5 nodelay;
    }
}

配置后需要执行nginx -t校验语法,再nginx -s reload生效。关键在于超时值不要设置得过低,否则会干扰移动网络用户的正常访问,比如弱网环境下用户可能确实需要较长时间上传图片。

Apache的防护配置

Apache使用mod_reqtimeout模块来防御慢速攻击,这个模块专门用来限制接收请求头和请求体的等待时间:

LoadModule reqtimeout_module modules/mod_reqtimeout.so
<IfModule mod_reqtimeout.c>
    # 接收请求头,40秒内必须收到完整头部
    RequestReadTimeout header=20-40,MinRate=500
    # 接收请求体,10秒内数据速率至少为500字节/秒
    RequestReadTimeout body=10,MinRate=500
</IfModule>

Apache的事件型MPM(event worker)比多进程型MPM更能抵抗慢速攻击,因为空闲Worker线程可以承载更多连接,建议在虚拟主机配置中启用KeepAliveTimeout 5,过长的KeepAlive时间也会被攻击者利用。

高防IP和CDN在慢速攻击下的作用

当服务器直连无法完全防住慢速攻击时,CDN或高防服务反而比传统DDoS防护设备更有效,因为把真实源站隐藏在CDN后面后,攻击者需要先穿透CDN节点的防御层。

选择高防服务时,需要关注防护类型中是否明确包含“慢速攻击防护”或“连接型攻击防护”,多数高防IP价格套餐中会附带连接数阈值,超出阈值的连接会被丢弃,这个层面对慢速攻击的拦截作用相当明显,常见的几个主流云厂商的高防产品,都在近年针对这类细节做过加固。

慢速攻击如何利用协议耐心机制拖垮线程池,服务器防护方法

慢速攻击常见场景有哪些:什么时候最容易被盯上

慢速攻击的应用场景很明确,攻击者通常选择资源受限、单点部署、没有CDN前置的目标下手,公有云上的单台云服务器是重灾区,因为这类服务器线程池和连接数都有上限,且默认配置没有做超时收敛。

API接口暴露较多的站点也容易中招,攻击者可以对某个动态接口发起慢速POST,占用服务器FastCGI进程池里的进程,PHP-FPM默认的request_terminate_timeout如果不设置,进程就会一直等待慢速请求的数据。

运维考核和上线前的压力测试场景中,慢速攻击也是一个常被遗漏的压测维度,压测工具如slowlorisslowhttptest本身就是很好的自测工具,用slowhttptest -c 1000 -H -g -o my_test -u http://你的域名/压测一下,很快就能看出服务器在1000个慢连接下会不会拒绝新请求。

慢速攻击怎么防御的底线思维:防住不代表彻底消除

慢速攻击的变体非常多,协议层面封堵不够彻底,持续调整才是常态,即使做了超时控制和连接限制,攻击者依然可以通过分布式慢速攻击(每个IP只发起少量连接)绕过单IP限制,这时需要结合接入层最前面的过滤设备,如WAF的速率策略,或者负载均衡的并发连接策略,在进入Web服务器之前就做拦截。

业内专家指出,防御慢速攻击的本质是让服务器对连接的耐心短于攻击者愿意等待的时间,任何单一配置都不是一劳永逸的,定期审视超时参数和连接数阈值,才是长期有效的做法。

慢速攻击不可怕,可怕的是不知道它利用了你的“等待”,把服务器协议耐心压缩到合理范围,你的线程池才能真正用来服务正常用户。

慢速攻击和普通DDoS的区别是什么?常见回答

问:慢速攻击会导致服务器CPU飙升吗?

通常情况下不会,慢速攻击主要耗尽的是线程池和连接表,CPU占用率和带宽占用都不会有异常波动,正因为“很安静”,很多运维人员是在用户反馈网站打不开之后,检查才发现TCP连接数和线程池状态不正常。

问:只通过调整服务器配置能完全防住慢速攻击吗?

不能完全防住,配置可以极大提高攻击门槛,但分布式慢速攻击和变种攻击依然可能穿透,最优方案是前置一层CDN或负载均衡,同时开启WAF的速率控制,后端服务器再配置合理的超时时间,三层叠加才能形成防御闭环。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱