iptables的limit模块通过令牌桶算法限制单位时间内新建连接请求数,需配合-s或recent模块实现单IP限频,仅对--syn包及NEW状态生效,burst值建议设为平均速率的1.5倍。

用 iptables 的 limit 模块限制单个 IP 建立连接的频率,本质是控制「单位时间内允许通过的新建连接请求数」,适用于防 CC、慢速攻击等场景。它不统计已建立连接数,只对带 --syn 标志的 TCP 握手包生效,且需配合 -m state --state NEW 或显式 --syn 使用。
核心原理与前提
limit 模块基于令牌桶算法做速率整形:每秒(或每分钟)发放固定数量“令牌”,每个匹配的新建连接请求消耗一个令牌;无令牌则跳过该规则,交由后续规则处理(如 DROP)。它本身不识别 IP,必须结合 -s 或其他条件限定源地址范围。
- 必须作用于
NEW状态连接,不能用于已建立连接或数据包 - 默认不区分 IP,若要限制“单个 IP”,需搭配
-s IP地址或用recent模块辅助 -
--limit-burst决定初始可突增请求数,避免正常访问被误限
限制指定单个 IP 的连接频率(如 192.168.1.100)
以下规则表示:来自 192.168.1.100 的 HTTP 新建连接,每分钟最多放行 15 个,超出后全部丢弃:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -m state --state NEW -m limit --limit 15/minute --limit-burst 5 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j DROP
-
--limit 15/minute:平均速率上限为每分钟 15 个 -
--limit-burst 5:允许前 5 个请求立即通过(缓冲突发),之后严格按速率放行 - 第二条
DROP规则是兜底,确保未被 limit 放行的请求被拦截
限制所有 IP 的连接频率(通用防护)
若想对所有访问 80 端口的 IP 统一限频(更常见),去掉 -s 即可:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 10/minute --limit-burst 8 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j DROP
- 每 IP 实际仍受此规则约束,因为每个新建连接都独立匹配规则链
- burst 值建议设为平均速率的 1.5 倍左右,兼顾弹性与防护效果
- 注意规则顺序:limit + ACCEPT 必须在 DROP 规则之前,否则无效
进阶:配合 recent 模块实现“单 IP 独立限频”
当需要真正按 IP 维护独立计数器(比如 60 秒内每个 IP 最多 20 次),limit 不适用,应改用 recent 模块:
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name http_limit --rcheck --seconds 60 --hitcount 20 -j DROP iptables -A INPUT -p tcp --dport 80 --syn -m recent --name http_limit --set -j ACCEPT
-
--rcheck检查该 IP 在 60 秒内是否已触发 20 次,是则丢弃 -
--set对每次匹配的 SYN 包记录时间戳,供下次检查 - 这种方式才是真正的“每个 IP 各自计数”,比 limit 更精准










