iptables的limit模块通过--syn匹配TCP新建连接实现单端口登录接口限流,需配合DROP规则闭环,但仅全局限速;精细化防护应改用hashlimit模块并分层部署。

用 iptables 的 limit 模块限制单 IP 对认证服务(如登录接口)的访问峰值,核心是控制“新建连接速率”,而非并发数或总请求数。它适合做轻量级、低开销的初步防护,比如防暴力撞库——但要注意:它不区分 IP、不维护状态映射,必须配合 --syn 和明确端口使用,否则容易误伤或失效。
匹配新建连接,避免误限已有会话
认证服务(如 SSH、自建登录 API)通常监听固定端口(22、8080、3000 等),限流目标应是“新建立的连接请求”,不是所有数据包。否则 ACK、心跳包等都会被统计,导致合法用户断连。
- 必须加
--syn:只匹配 TCP 三次握手的第一个 SYN 包 - 必须指定协议和端口:
-p tcp --dport XXX,防止规则泛化到其他服务 - 示例(限制登录接口 3000 端口,每秒最多 5 个新连接):
iptables -A INPUT -p tcp --dport 3000 --syn -m limit --limit 5/sec -j ACCEPT
搭配 DROP 规则形成闭环
仅写一条 ACCEPT 不起限流作用——limit 模块本身只是“有条件放行”,未匹配的包仍按默认策略处理。必须紧接一条无条件拒绝规则:
- 在
ACCEPT规则后立即添加:iptables -A INPUT -p tcp --dport 3000 --syn -j DROP - 顺序不能错:iptables 自上而下匹配,DROP 必须放在 ACCEPT 后面,且同链中位置靠后
- 若已存在宽松规则(如允许全部 ESTABLISHED),需确保这两条规则在它们之前,可用
-I INPUT 1插入最前
合理设置 limit 参数与突发容忍
--limit 支持多种时间单位,对认证场景推荐用 /sec 或 /minute,并配合 --limit-burst 缓冲首波请求:
-
--limit 3/minute:严格防爆破,但可能卡住正常用户输错两次密码后的重试 -
--limit 8/sec --limit-burst 20:允许短时集中点击(如页面加载+自动提交),之后回落到 8qps - burst 值建议设为 limit 值的 2–3 倍;过大会失去防护意义,过小会导致登录表单第一次提交就被拒
注意局限性,必要时升级方案
limit 模块按全局计数,所有 IP 共享同一个令牌桶。这意味着它无法实现“每个 IP 独立限速”——这正是 hashlimit 模块的专长。若你发现攻击来自多个 IP 扫描,或需精细化隔离恶意源,应切换为:
-m hashlimit --hashlimit-mode srcip --hashlimit 5/sec --hashlimit-burst 15- 再叠加
connlimit控制单 IP 并发连接数(如--connlimit-above 3),双保险更稳妥 - 生产环境关键认证接口,建议前端加 Nginx 的
limit_req,内核层用hashlimit,形成分层防护

















