iptables connlimit模块可实时限制单IP并发连接数,仅统计ESTABLISHED/RELATED状态TCP连接,需内核支持xt_connlimit,配合recent模块可兼顾长连接与短时高频新建连接防护。

用 iptables 的 connlimit 模块限制单 IP 并发连接数,是防止单个客户端耗尽服务器连接资源最直接有效的方式。它不看请求内容、不依赖日志,只统计每个源 IP 当前处于 ESTABLISHED 或 RELATED 状态的 TCP 连接数,实时拦截超限连接,对 CC 攻击、爬虫乱建连、误配脚本等场景特别管用。
确认 connlimit 模块已就绪
该功能依赖内核模块 xt_connlimit,不是 iptables 自身带的插件:
- 运行
lsmod | grep connlimit,有输出说明已加载 - 若无结果,检查内核配置:
zcat /proc/config.gz | grep CONFIG_IP_NF_CONNLIMIT,确认值为y或m - 不支持时不能靠升级 iptables 解决,必须更新内核或重新编译模块
写对规则:匹配目标 + 明确动作
典型命令结构如下(以限制 HTTP 80 端口为例):
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 25 -j REJECT --reject-with tcp-reset
-
--dport 80:只作用于目标端口 80 的流量 -
--connlimit-above 25:当前 ESTABLISHED 连接数 >25 即触发 - 推荐用
-j REJECT --reject-with tcp-reset,比DROP更友好——客户端能立刻收到 RST 包,避免长时间卡在 connect() 或 read() 超时 - 规则应放在“放行已建立连接”(
-m state --state ESTABLISHED,RELATED -j ACCEPT)之后、“允许 SSH”等白名单规则之前,防止误拦
按服务类型设合理阈值
硬套“10 连接”容易误伤正常用户。需结合协议特性与访问习惯:
- 普通官网/博客页面:20–30(考虑多标签页、图片/JS 并行加载)
- HTTPS(443)服务:25–40(TLS 握手开销大,浏览器倾向复用连接)
- RESTful API 接口:50–100(客户端常启用 Keep-Alive,连接生命周期长)
- SSH(22)、MySQL(3306)、Redis(6379)等管理/后端端口:≤3–5(非运维 IP 不该长期连入)
精准控制范围:IP 还是网段?
默认按单个 IPv4 地址(/32)统计,如需放宽到子网,用 --connlimit-mask:
-
--connlimit-mask 32:精确到单 IP(默认行为,可省略) -
--connlimit-mask 24:按 C 类网段(如 192.168.1.0/24)汇总计数,适合内网网关统一限流 -
--connlimit-mask 16:按 B 类网段(如 192.168.0.0/16)统计,慎用,易误伤
补充防护:只靠 connlimit 不够
connlimit 控制“同时在线连接数”,但对短时高频新建连接(如 1 秒内狂建 20 个新会话)无感。建议搭配 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 DROP - 两者叠加,既防长连接占坑,也防快连风暴

















