限制同一个IP服务器的连接数量,核心方法包括防火墙规则、应用层限流和系统内核参数调整,其中最常用且效果显著的是iptables的connlimit模块和Nginx的limit_conn模块。 很多站长在服务器上线后都会遇到一个现实问题某个IP突然发起大量并发连接,轻则挤占带宽,重则导致服务瘫痪,限制单个IP的连接数,已经成为服务器基础防护的标配动作,下面从不同层面拆解具体的操作和配置。
如何用iptables限制单个IP连接数
iptables是Linux系统上最直接的防火墙工具,通过connlimit模块可以精准限制单个IP的并发连接数,对于TCP服务(如HTTP/HTTPS),配置起来非常直观。
iptables connlimit模块详解
connlimit模块允许你针对每个源IP地址匹配连接数,超过阈值后直接拒绝或丢弃,语法如下:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT
这条命令表示:对目的端口80的TCP SYN包进行匹配,当单个源IP的并发连接数超过20个时,拒绝后续连接。
- –connlimit-above 20:设定阈值,可根据服务器性能调整。
- -j REJECT:拒绝连接,也可以使用DROP静默丢弃,但REJECT能更快让客户端感知。
- 如果同时限制443端口,再写一条即可。
使用recent模块提高灵活性
如果只想限制短时间内频繁发起连接的IP,可以结合recent模块实现,限制每分钟内新连接超过10个的IP:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set --name HTTP
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --name HTTP -j DROP
这种方式更适用于防御短时突发攻击,对正常用户影响较小。
配置持久化
iptables规则重启后失效,需要保存,以CentOS为例:
- 使用
service iptables save保存规则到配置文件。 - 或者将规则写入
/etc/rc.local实现开机自加载。
业内专家指出,在服务器入口处即防火墙层面做限制,能够有效减轻应用层压力,是防御CC攻击的第一步。
Nginx限制单个IP连接数配置详解
对于Web服务器,Nginx自带的限流模块比iptables更精细,支持基于连接数和请求速率的双重控制,这是nginx限制单个ip连接数最常用的方法。
ngx_http_limit_conn_module模块
该模块限制单个IP的并发连接数,配置在http块中先定义共享内存区域,再在server或location块中引用。
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
location / {
limit_conn addr 10;
...
}
}
}
- limit_conn_zone:定义一个名为addr的区域,大小为10MB,用于存储客户端IP地址。
- limit_conn addr 10:限制每个IP最多同时建立10个连接。
注意:这个限制是针对所有连接(包括请求中的长连接),如果只限制HTTP请求的并发,建议配合keepalive_timeout设置。
结合limit_req模块限制请求速率
如果只想限制请求频率,可以使用limit_req模块,限制每个IP每秒处理不超过5个请求:
http {
limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s;
...
server {
location / {
limit_req zone=req burst=10 nodelay;
...
}
}
}
- rate=5r/s:平均速率,每秒5个请求。
- burst=10:允许突发10个请求的缓冲队列。
- nodelay:在burst范围内不延迟处理。
多站点场景下的配置技巧
如果你的服务器上有多个网站,可以针对不同server块设置不同的阈值,下载站可以放宽连接数,而API接口要严格限制,行业共识认为,Nginx层限流对正常用户影响最小,适合与iptables组合使用。
Windows服务器限制IP连接数的方法
Windows系统没有原生的iptables,但可以通过高级安全Windows防火墙或netsh命令实现类似功能,这是
windows服务器限制ip连接数的常见方案。
使用Windows防火墙的IP安全策略
- 打开“高级安全Windows防火墙”,选择“入站规则”。
- 新建规则,选择“端口”,指定TCP 80/443。
- 在“作用域”选项卡中,可以限制远程IP地址范围,但无法直接限制单个IP的连接数。
- 要限制连接数,需要借助第三方工具或编写PowerShell脚本动态拦截。
利用netsh命令动态过滤
Windows Server 2008 R2及以上版本支持netsh的wfp筛选器,但配置较复杂,更简单的方式是使用IIS的“IP地址和域名限制”功能:
- 在IIS管理器中,选中站点,双击“IP地址和域名限制”。
- 添加允许或拒绝规则,但同样无法限制并发连接数。
对于Windows环境,服务器并发连接数限制通常需要借助第三方安全软件(如瑞星、360安全卫士的企业版)或购买硬件防火墙来实现,如果你需要精细控制,建议迁移至Linux平台或使用专业的Anti-DDoS设备。
服务器连接数限制方案对比
不同方法各有优劣,选择时需结合业务场景和服务器性能,下表展示了服务器连接数限制方案对比的关键点:
| 方案 | 适用场景 | 配置复杂度 | 性能影响 | 精确度 |
|---|---|---|---|---|
| iptables connlimit | 所有TCP服务,尤其是非Web服务 | 低 | 极低 | 按连接数精确 |
| Nginx limit_conn | Web服务,反代场景 | 低 | 低 | 按连接数,可结合请求速率 |
| Nginx limit_req | 接口防刷,登录保护 | 中 | 低 | 按请求速率 |
| 系统内核参数 | 全局连接数调整 | 中 | 高(影响整个系统) | 粗粒度 |
| Windows防火墙+IIS | 纯Windows环境 | 高依赖第三方 | 不确定 | 有限 |
场景推荐
- 高防服务器:建议在iptables层面做第一层连接数限制,配合Nginx的请求速率限制,构成双重防护。
- 论坛或社区:使用Nginx的limit_conn限制同一IP最大连接数,避免大量爬虫拖慢数据库。
- API接口:优先使用limit_req,限制每秒请求次数,防止恶意调用。
- 文件下载站:放宽连接数限制,但限制单个IP的下载速率,避免带宽被占满。
Q&A:限制IP连接数常见问题
限制单个IP连接数会不会影响正常用户?
正常用户通常不会建立大量并发连接,对于普通网页浏览,一个页面加载可能需要几个到十几个连接(包括CSS、JS、图片等),如果阈值设置合理(如20-30个连接),完全不影响正常体验,但如果你设置的阈值过低,比如5个,可能导致用户打开多标签页时被拒绝,建议根据网站平均页面资源数调整阈值。
服务器连接数过大怎么快速排查?
使用以下命令可以快速查看当前IP连接统计:
- Linux:
netstat -an | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn查看每个IP的连接数。 - Windows:
netstat -ano | findstr :80后通过任务管理器查看PID。
如果发现某个IP连接数异常高,可临时追加iptables规则将其封禁,再分析攻击类型。
限制连接数后服务还是不稳定,可能是什么原因?
可能是阈值设置不够低,或者攻击流量来自大量不同IP(分布式攻击),此时需要结合速率限制和IP黑名单,甚至使用CDN或高防IP,也要检查服务器自身处理能力,比如Nginx的worker_connections是否足够,系统最大文件打开数是否限制。服务器并发连接数限制是一个综合性工程,从防火墙、应用层到系统层都需要协同调整。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/595136.html




