Linux 如何限制单 IP 连接数?

发布时间 - 2026-01-25 00:00:00    点击率:
iptables 用 connlimit 模块可轻量限制单 IP 并发连接数,需正确指定链(如 INPUT 或 DOCKER-USER)、加 --syn 限制新连接,并注意 nf_conntrack 依赖及 IPv4/IPv6 掩码差异。

iptables 如何用 connlimit 限制单 IP 并发连接数

直接用 iptablesconnlimit 模块最轻量、最常用,不需要额外服务或用户态程序。它工作在内核 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)记录的连接条目,主要包含 ESTABLISHEDSYN_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-USERFORWARD 链处理了。

  • 正确做法:把规则加到 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 必须在宿主机上配,容器内配无效。
真正难的不是写那条命令,而是想清楚你要控的是哪一层的连接:是宿主机原生服务?Docker 映射端口?还是 Kubernetes 的入口流量?不同场景下,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有啥区别_空格与外边距的使用场景【说明】