iptables的limit模块仅限包速率而非字节速率,通过令牌桶机制平滑限制单IP新建连接频率,需配合--state NEW使用,避免误伤已建连接。

iptables 的 limit 模块本身不能限制“流量”(字节数或带宽),它只统计并控制单位时间内匹配的数据包数量——即“包速率”,不是“字节速率”。所谓“平滑限制单 IP 访问峰值流量”,在 limit 模块语境下,实际是指:平滑限制单 IP 发起的新连接请求频率,从而间接压制高频探测、短时刷量等行为,避免服务被 SYN 洪水或登录爆破冲击。
理解 limit 的“平滑”本质
limit 模块采用“令牌桶+平均速率”机制,并非硬性截断:
-
--limit 设定长期平均速率(如
10/minute),代表令牌补充速度 -
--limit-burst 设定初始桶容量(如
20),允许合法用户短时重试、页面加载多资源并发等场景 - 超出 burst 后,后续包按 --limit 速率逐步“放行”,未达速率的请求会被直接丢弃(-j DROP)
- 它不记录 IP 状态,每个包独立匹配,无跨连接上下文,因此轻量但不精准
关键配置要点(以 Web 接口为例)
必须配合 --state NEW,仅作用于 TCP 握手首包(SYN),否则会误伤已建连接的数据流:
- 插入两条规则,顺序不可颠倒:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 12/minute --limit-burst 25 -j ACCEPTiptables -A INPUT -p tcp --dport 80 -m state --state NEW -j DROP - HTTPS 同理,仅需将
--dport 80改为443 - 使用
-I(插入)而非-A(追加)可确保规则位于 INPUT 链靠前,避免被前置 ACCEPT 规则绕过
阈值设置建议(兼顾防护与体验)
避免套用固定数值,应按接口敏感度和访问特征调整:
-
静态页面 / CDN 回源:较宽松,如
50/minute,burst=60 -
登录页 / 密码重置:收紧,如
5/minute,burst=10(允许输错两次+刷新重试) -
管理后台 / API 密钥校验:极严,如
3/minute,burst=5 - 若出现误限(如用户快速刷新被拦),优先调高
--limit-burst,而非盲目提高--limit
验证与注意事项
加完规则后务必验证:
- 执行
iptables -L INPUT -n | grep ':80',确认含limit字样及正确顺序 - 用
watch -n1 'iptables -L INPUT -nv | grep :80'实时观察 pkts 计数变化 - 切勿使用
--limit X/second(如10/second),浏览器单页加载常触发 6–10 个并发 SYN,极易误伤 - limit 不适合替代应用层限流或 hashlimit;真正需要按 IP 独立控速且容忍突发,应选
hashlimit模块

















