Linux 如何限制单 IP 连接数?
发布时间 - 2026-01-25 00:00:00 点击率:次iptables 用 connlimit 模块可轻量限制单 IP 并发连接数,需正确指定链(如 INPUT 或 DOCKER-USER)、加 --syn 限制新连接,并注意 nf_conntrack 依赖及 IPv4/IPv6 掩码差异。
iptables 如何用 connlimit 限制单 IP 并发连接数
直接用 iptables 的 connlimit 模块最轻量、最常用,不需要额外服务或用户态程序。它工作在内核 netfilter 层,对性能影响极小。
常见错误是写成匹配「已建立连接」却忘了加 --syn 或放错链(比如误配到 FORWARD 而非 INPUT),导致规则不生效。
- 限制 SSH(端口 22)单 IP 最多 3 个并发连接:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT --reject-with tcp-reset
- 限制所有 TCP 连接(非特定端口):
iptables -A INPUT -p tcp -m connlimit --connlimit-above 10 -j DROP
- 只限制新连接(避免误伤已有长连接):必须加
--syn,否则会匹配所有包(包括 ACK、数据包等):iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j REJECT
为什么 connlimit 默认统计的是 ESTABLISHED + SYN_RECV 状态
connlimit 统计的是当前被内核连接跟踪子系统(nf_conntrack)记录的连接条目,主要包含 ESTABLISHED 和 SYN_RECV 状态。这意味着:
- 它不区分「是否完成三次握手」——
SYN_RECV算一个连接,哪怕只是半开连接; - 它依赖
nf_conntrack模块启用,若系统关闭了连接跟踪(如某些高性能转发场景),connlimit将完全失效; - 如果
nf_conntrack_max设置过小(默认常为 65536),高并发下可能因哈希表溢出导致新建连接失败,此时限制逻辑本身也会异常; - IPv4 和 IPv6 各自独立计数,
--connlimit-mask 32(IPv4)和--connlimit-mask 128(IPv6)需分别配置。
替代方案:fail2ban 适合按请求频率封禁,不是连接数限制
很多人混淆「连接数限制」和「请求频率封禁」。fail2ban 是基于日志分析的,它看到 Nginx 日志里某 IP 1 分钟内发了 100 次 /login 请求,才触发封禁——这跟 TCP 连接数无关。
如果你的真实需求是防暴力破解或爬虫扫端口,fail2ban 更合适;但如果是防连接耗尽(如 SYN Flood、连接池打满),connlimit 是唯一合理选择。
-
fail2ban无法感知未记录日志的连接(如直接 telnet 扫描 22 端口); - 它有延迟(至少几十秒),而
connlimit是实时拦截; - 它需要配置 jail、filter、action,复杂
度远高于一条
iptables命令。
注意 connlimit 在 Docker / Kubernetes 环境下的失效点
Docker 默认使用 iptables 规则做 NAT 和端口映射,且会在 DOCKER-USER 链插入规则。如果你把 connlimit 规则加在 INPUT 链,它可能根本匹配不到容器暴露的端口流量——因为包先被 DOCKER-USER 或 FORWARD 链处理了。
- 正确做法:把规则加到
DOCKER-USER链(Docker 官方推荐的用户自定义链),并指定目标容器端口和协议:iptables -I DOCKER-USER -p tcp --dport 8080 -m connlimit --connlimit-above 20 -j REJECT
- Kubernetes 中,
connlimit对 Service ClusterIP 流量无效(走的是 iptables kube-proxy 规则,不进INPUT);只有 NodePort 或 HostNetwork 暴露的端口才适用; - 容器内应用若自己监听
0.0.0.0,且宿主机没开防火墙,connlimit必须在宿主机上配,容器内配无效。
connlimit 的链位置、掩码值、甚至是否可用,全都不一样。
# linux
# node
# docker
# nginx
# 防火墙
# ipv6
# 端口
# ai
# proxy
# 爬虫
# kubernetes
# Filter
# 并发
# input
# ssh
# 的是
# 连接数
# 掩码
# 容器内
# 也会
# 你要
# 最多
# 不需要
# 已有
# 很多人
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
Laravel如何配置任务调度?(Cron Job示例)
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
java中使用zxing批量生成二维码立牌
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
如何在Ubuntu系统下快速搭建WordPress个人网站?
Swift中swift中的switch 语句
如何在腾讯云服务器上快速搭建个人网站?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
如何快速搭建虚拟主机网站?新手必看指南
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
Android利用动画实现背景逐渐变暗
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
如何用5美元大硬盘VPS安全高效搭建个人网站?
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
如何在万网自助建站平台快速创建网站?
如何自定义建站之星模板颜色并下载新样式?
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
Python高阶函数应用_函数作为参数说明【指导】
如何撰写建站申请书?关键要点有哪些?
如何快速配置高效服务器建站软件?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel中的withCount方法怎么高效统计关联模型数量
如何在阿里云服务器自主搭建网站?
如何用免费手机建站系统零基础打造专业网站?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Thinkphp 中 distinct 的用法解析
LinuxCD持续部署教程_自动发布与回滚机制
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
如何快速打造个性化非模板自助建站?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Linux系统运维自动化项目教程_Ansible批量管理实战
python中快速进行多个字符替换的方法小结
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Internet Explorer官网直接进入 IE浏览器在线体验版网址
详解jQuery中基本的动画方法
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
微信小程序 scroll-view组件实现列表页实例代码
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
js代码实现下拉菜单【推荐】
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】


