DDoS防护中的连接数限制是对抗慢速连接攻击最直接、最有效的手段之一。慢速连接攻击(Slowloris、Slow POST等)的核心原理是通过极低速率的数据传输,长时间占用服务器连接资源,最终耗尽服务器的并发连接上限,导致正常用户无法访问。解决这个问题的关键在于:在网络层或应用层设定合理的连接数阈值,配合超时断开机制、请求频率检测和动态限流策略,从根本上阻断慢速攻击的资源消耗路径。下面我会把这套防御体系从头到尾讲透,包括原理、配置方法、实战参数和进阶策略。
一、慢速连接攻击到底是怎么回事
慢速连接攻击不像传统的流量型DDoS那样用海量数据包砸你,它走的是"以少胜多"的路线。攻击者建立大量TCP连接后,以极其缓慢的速度发送HTTP请求头部,比如每隔几十秒才发一个字节,或者分多次发送不完整的请求头。服务器为了等待完整请求,会一直保持这些连接不释放。当连接数达到服务器上限(比如Apache默认的MaxRequestWorkers),新的合法请求就进不来了,服务直接瘫痪。
常见的慢速攻击类型有三种:Slowloris攻击针对HTTP连接,通过不完整的请求头占住连接;Slow POST攻击针对POST请求体,以极慢速度发送数据;还有一种叫RUDY(R-U-Dead-Yet),专门针对表单提交场景。这三种攻击的共同点就是——单个请求看起来完全正常,传统的流量检测很难识别,必须从连接行为层面去防御。
二、连接数限制防御的核心逻辑
连接数限制防御的本质是给服务器设定一个"并发连接上限",一旦某个来源IP的连接数超过阈值,就直接拒绝或限流。这套逻辑分为三个层次:第一层是操作系统内核级别的连接跟踪限制,第二层是Web服务器软件的并发控制,第三层是反向代理或WAF层面的智能限流。三层配合才能形成完整的防御链。
具体来说,当一个IP在短时间内建立了超过设定数量的连接(比如50个),系统就判定该IP存在异常行为,自动将其加入临时黑名单或者降低其连接优先级。对于慢速攻击来说,攻击者通常需要几百甚至上千个连接才能打垮一台服务器,而连接数限制可以把单个IP的可用连接数压到个位数,攻击者的攻击效率会直接归零。
三、操作系统层面的连接数限制配置
在Linux系统中,可以通过iptables或nftables的connlimit模块来实现单个IP的连接数限制。这是最底层、最硬核的防御手段,直接在内核层面拦截,性能损耗极小。以下是具体的iptables规则示例:
# 限制单个IP的HTTP连接数不超过20个 iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT # 限制单个IP的HTTPS连接数不超过20个 iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT # 限制单个IP的总TCP连接数不超过50个 iptables -A INPUT -p tcp -m connlimit --connlimit-above 50 --connlimit-mask 32 -j DROP
上面的规则中,--connlimit-above 20表示超过20个连接就触发动作,--connlimit-mask 32表示按单个IP(/32)来计算。如果你的业务正常用户并发较高,可以适当调高这个值,但建议不要超过50。同时,一定要留出足够的余量给CDN节点和爬虫等合法高频访问源。
除了iptables,还可以调整系统内核参数来增强连接跟踪能力。在/etc/sysctl.conf中加入以下配置:
# 增大连接跟踪表的大小 net.netfilter.nf_conntrack_max = 262144 # 缩短TIME_WAIT状态的超时时间 net.ipv4.tcp_fin_timeout = 15 # 开启SYN Cookie防止SYN Flood net.ipv4.tcp_syncookies = 1 # 缩短ESTABLISHED状态的空闲超时 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 5
这些参数调整后需要执行sysctl -p生效。特别是nf_conntrack_max这个值,如果你的服务器同时处理大量连接,默认的65536远远不够,建议至少设到20万以上。
四、Web服务器层面的并发控制
以Nginx为例,它天然支持连接数限制,而且配置非常灵活。在nginx.conf的http块中可以这样设置:
# 定义连接数限制区域,按IP地址限制,每个IP最多10个连接
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
# 应用连接限制,burst设为5表示允许短暂超出
limit_conn addr 10;
# 同时限制请求速率,每秒最多5个请求
limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s;
limit_req zone=req burst=10 nodelay;
# 超时设置,慢速连接30秒不发送数据就断开
client_body_timeout 30s;
client_header_timeout 30s;
keepalive_timeout 15s;
}
这里的limit_conn addr 10就是每个IP最多10个并发连接,burst=5允许短时间内超出到15个,但超出部分会被排队等待而不是直接拒绝。limit_req则是从请求速率维度做限制,每秒5个请求对于正常用户完全够用,但对于需要大量连接的慢速攻击者来说,效率会被极大压缩。
Apache的配置逻辑类似,在httpd.conf中:
# 限制最大连接数 MaxRequestWorkers 256 MaxConnectionsPerChild 1000 # 超时设置 Timeout 30 KeepAliveTimeout 15
需要注意的是,Apache的MaxRequestWorkers决定了整个服务器能处理的最大并发数,如果设得太高,慢速攻击更容易打满;设得太低,正常流量又受影响。一般建议根据服务器内存大小来算,每个工作进程大约占10-20MB内存,8GB内存的机器设200-400比较合理。
五、超时机制是慢速攻击的克星
连接数限制解决的是"量"的问题,超时机制解决的是"时间"的问题。慢速攻击之所以有效,就是因为服务器愿意等。如果我们把等待时间大幅缩短,攻击者还没来得及建立足够的连接,旧连接就已经被清理掉了。
具体建议:HTTP请求头超时设为10-15秒,请求体超时设为20-30秒,TCP KeepAlive探测间隔设为30秒,探测5次无响应就断开。在Nginx中这些参数前面已经展示过了。在应用层,如果你用的是Tomcat,也要在server.xml中配置connectionTimeout:
<Connector port="8080"
connectionTimeout="15000"
keepAliveTimeout="15000"
maxConnections="500"
acceptCount="100" />
connectionTimeout单位是毫秒,15000就是15秒。maxConnections是最大并发连接数,acceptCount是等待队列长度。这三个参数配合使用,可以有效防止慢速连接长时间占用资源。
六、智能限流与行为分析
单纯的固定阈值限制有一个问题:正常用户在高峰期也可能触发限制。所以更高级的做法是引入动态限流和行为分析。比如基于滑动窗口算法,统计每个IP在过去60秒内的连接数和请求数,如果超过动态计算的阈值就限流。这种方式比固定阈值更智能,不会误伤正常用户。
在实际部署中,可以使用Fail2ban这类工具来自动化这个过程。Fail2ban可以监控Nginx或Apache的日志,当发现某个IP在短时间内建立了大量连接或产生了大量超时,就自动在iptables中将其封禁。配置示例:
[nginx-slowloris] enabled = true filter = nginx-slowloris logpath = /var/log/nginx/access.log maxretry = 5 findtime = 60 bantime = 3600 action = iptables-multiport[name=Slowloris, port="http,https"]
这段配置的意思是:如果某个IP在60秒内触发了5次慢速连接相关的日志记录,就封禁该IP一小时。filter文件需要自定义,匹配那些请求时间异常长、连接数异常多的日志条目。
七、多层防御架构的实战建议
单一的防御手段总有被绕过的可能,真正有效的方案是多层叠加。我建议的架构是:最外层用CDN或高防IP做流量清洗,把明显的异常流量挡在外面;中间层用Nginx或HAProxy做连接数限制和超时控制;内层用WAF或应用防火墙做行为分析和动态限流;最底层用操作系统内核参数做兜底。
在参数调优方面,有几个经验值可以参考:单IP连接数限制在10-30之间比较安全,请求速率限制在5-20r/s之间,超时时间根据业务类型调整,API接口可以短一些(10秒),文件上传接口可以长一些(60秒)。同时一定要做好白名单,把CDN回源IP、监控探针IP、内部服务IP排除在限制之外,否则会影响正常业务。
还有一个容易被忽视的点:慢速攻击往往是分布式的,攻击者会用大量不同的IP同时发起攻击。这种情况下,单IP限制的效果会打折扣,需要配合全局连接数监控和异常流量模式识别。如果发现总连接数在短时间内激增但单IP并不突出,就要考虑是分布式慢速攻击,需要在负载均衡层做全局限流。
八、总结与核心要点
DDoS防护中的连接数限制对抗慢速连接攻击,核心就是三板斧:限制单个IP的并发连接数、缩短连接超时时间、配合动态行为分析自动封禁。操作系统层用iptables connlimit做硬限制,Web服务器层用Nginx或Apache的并发控制做精细管理,应用层用超时机制和智能限流做兜底。三层联动,才能在不影响正常用户体验的前提下,把慢速攻击的威胁降到最低。记住一个原则:防御不是越严越好,而是在安全和可用性之间找到平衡点,根据自己的业务特点反复调优参数,才是真正有效的防护策略。
