iptables无法直接限制每秒新建连接数,但可通过limit或hashlimit模块结合syn包识别实现等效控制:limit适用于全局限速,hashlimit支持按源ip独立限速,二者均需配合状态检查和正确规则顺序。

iptables 本身不直接提供“每秒新建连接数”这个语义的限制能力,但可以通过 limit 或更推荐的 hashlimit 模块,配合 TCP SYN 包识别和连接状态判断,实现等效效果。关键在于:你限制的不是“连接”,而是“新建连接触发的 SYN 数据包”的到达速率。
用 limit 模块做全局新建连接限速(适合轻量防护)
limit 是最基础的令牌桶限速模块,它统计的是匹配规则的数据包数量,不是连接数。但搭配 --syn 和 --state NEW,就能间接控制新连接频率。
- 必须成对使用:先
ACCEPT合规包,再DROP超限包,否则所有 SYN 都被拦住 - 所有 IP 共享同一个计数器,无法区分攻击源,适合防扫描或低强度洪水
- 示例:每秒最多放行 5 个新 SSH 连接(即 5 个 SYN 包)
iptables -A INPUT -p tcp --dport 22 --syn -j DROP
用 hashlimit 按源 IP 精准限速(推荐用于生产环境)
hashlimit 为每个源 IP 维护独立计数器,支持老化、突发容错和多维分组,是防 CC、暴力破解和 UDP 反射的核心手段。
- 参数
--hashlimit-mode srcip表示按客户端 IP 统计 -
--hashlimit-above设定阈值,超限才触发动作;--hashlimit-burst防止误杀(比如短时合法请求高峰) - 示例:每个 IP 对 Web 服务每秒最多发起 8 个新连接
--hashlimit-above 8/sec \
--hashlimit-burst 20 \
--hashlimit-mode srcip \
--hashlimit-name http_conn_rate \
-j ACCEPT
iptables -I INPUT -p tcp --dport 80 --syn -j DROP
必须配合连接状态与链路顺序
仅靠限速不够,还需确保规则生效逻辑正确:
- 务必在规则开头放行已建立连接:
-m state --state ESTABLISHED,RELATED -j ACCEPT,避免影响正常业务 - 限速规则要放在状态检查之后、端口开放之前,否则可能被跳过
- UDP 服务需加
-m state --state NEW(TCP 则常用--syn更精准) - 若需记录日志,可在
-j DROP前加一条-j LOG规则
注意 limit 和 connlimit 的区别
很多人混淆“新建速率”和“并发连接数”:
-
limit/hashlimit:管的是“单位时间新建多少次”,对应 SYN 包频率 -
connlimit:管的是“当前有多少 ESTABLISHED 连接”,防长连接占满资源 - 真实防护建议组合使用:先限新建速度,再限并发数量,形成双层控制











