iptables connlimit模块可实时限制单IP并发连接数,适用于防CC攻击等场景;需确认xt_connlimit内核模块已加载;规则应置于ESTABLISHED规则之后,按服务类型设定合理阈值,并可与recent模块配合实现连接频率控制。

用 iptables 的 connlimit 模块限制单 IP 并发连接数,是防止连接耗尽最直接、低开销的手段。它不依赖日志、不引入延迟,对已建立的 ESTABLISHED/RELATED 连接实时统计并拦截,特别适合防 CC 攻击、SSH 占线、爬虫打满连接池等场景。
确认 connlimit 模块已就绪
该功能依赖内核模块 xt_connlimit,不是 iptables 自身带的。多数现代系统(CentOS 7+/Ubuntu 18.04+,内核 ≥3.10)默认启用,但需验证:
- 运行
lsmod | grep connlimit,有输出即表示已加载 - 若无结果,检查内核配置:
zcat /proc/config.gz | grep CONFIG_IP_NF_CONNLIMIT,确认值为y或m - 不支持时不能仅升级 iptables,必须更新内核或手动编译加载模块
写对规则:只限并发,不误伤正常流量
connlimit 统计的是每个源 IP 当前处于 ESTABLISHED 或 RELATED 状态的连接数,不包括 SYN_RECV 等半开连接,也不统计 UDP 或新建连接请求本身。典型写法如下:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 25 -j REJECT --reject-with tcp-reset- 务必把这条规则放在“允许已建连接”(
-m state --state ESTABLISHED,RELATED -j ACCEPT)之后,否则会拦截回包 - 优先用
REJECT --reject-with tcp-reset而非DROP,客户端能立刻断连,体验更友好
按服务类型设合理阈值
硬套“10 连接”容易误拦移动端多标签页、HTTP/2 复用、Keep-Alive 客户端等。应结合业务实际设定:
- 普通官网/博客:20–30(兼顾图片懒加载、JS 异步请求)
- API 接口(如 RESTful):50–100(客户端常长连接复用)
- HTTPS(443):25–40(TLS 握手开销大,连接生命周期更长)
- SSH(22)或数据库端口(3306/6379):≤3–5(非运维 IP 不该长期维持多个连接)
补充防护:connlimit + recent 防短时密集建连
connlimit 管“同时有多少连接”,recent 模块可补足“单位时间建多少新连接”。两者搭配更全面:
- 标记新连接:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name http_new --set - 5 秒内新建 ≥8 次即拒:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name http_new --update --seconds 5 --hitcount 8 -j REJECT - recent 是时间窗口控制,和 connlimit 的并发维度互不干扰,建议共存

















