limit模块限单IP新建连接本质是控SYN包速率,需配合--state NEW,仅对NEW状态TCP包采样,防暴力破解;典型配置为--limit 3/min --limit-burst 3,必须先ACCEPT后DROP且置于INPUT链靠前。

用 iptables 的 limit 模块平滑限制单 IP 请求速率,关键不在“堵死”,而在“控节奏”——它不拦已建立的连接,只对新连接请求(TCP SYN 包)做速率采样,响应快、开销低,适合做第一道轻量防护。
只匹配新建连接,避免误伤正常通信
limit 模块本身不识别 IP 或连接状态,必须配合 -m state --state NEW 才能精准作用于“发起连接”的瞬间。漏掉这句,规则会误匹配 ACK、RST 甚至数据包,导致网页打不开、SSH 卡住、HTTPS 握手失败。
- 正确写法:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 15/minute --limit-burst 30 -j ACCEPT - 错误写法:
iptables -A INPUT -p tcp --dport 80 -m limit ...(没加 --state NEW,所有 TCP 包都参与限速)
合理设置 limit 和 burst,兼顾防御与体验
limit 是长期平均速率,burst 是初始允许的“弹性窗口”。比如 --limit 5/minute --limit-burst 10 表示:前 10 次请求可立即通过;第 11 次起,每 12 秒才放行 1 个(60÷5=12),直到桶内令牌补满。
- 登录页、重置密码等敏感接口:建议
--limit 3/minute --limit-burst 8 - 静态资源或 CDN 回源:可放宽至
--limit 50/minute --limit-burst 100 - 避免用
/second:浏览器一次页面加载常触发 6–8 个并行连接,极易误触发
规则顺序必须严格:先放行,再兜底
两条规则必须成对出现,且第二条必须紧跟在第一条之后,否则限速失效:
- 第一行:带 limit 的 ACCEPT 规则(匹配即放行)
- 第二行:无条件 DROP 规则(所有未被上一行放行的新建连接全部丢弃)
- 务必用
-A追加(不是-I插入),确保它们处于 INPUT 链靠后但仍在默认策略之前
验证是否生效,别只看规则存在
加完规则后,立刻检查三件事:
- 执行
sudo iptables -L INPUT -n | grep ':80',确认输出中含limit: avg 15/min burst 30 - 用
curl -s http://localhost/ && echo OK快速连 20 次,观察从第 16 次起是否明显变慢或超时 - 临时清空计数器调试:
sudo iptables -Z INPUT(注意:仅用于测试,勿在生产环境随意执行)
不复杂但容易忽略:它防的是自动化探测,不是人工点按;调参核心是观察真实访问模式,而不是堆高数字。

















