iptables hashlimit模块可实现按IP独立限速、允许突发流量的精准API防护,需绑定端口、设合理令牌桶参数(如8/sec+24 burst)、配ACCEPT/DROP闭环规则并持久化。

要用 iptables 的 hashlimit 模块给业务 API 做精准防护,关键不是“堵死”,而是“按 IP 独立控速 + 允许合理突发 + 规则闭环”。它比 limit 模块更贴合真实流量特征,尤其适合 HTTP/HTTPS、RESTful 接口这类暴露在公网、需防单 IP 刷量的场景。
明确限流维度和匹配条件
API 通常走固定端口(如 8080、3000、8443),必须绑定协议与端口,并决定“谁该被单独限制”:
- 最常用:--hashlimit-mode srcip——每个客户端 IP 单独计数,防恶意脚本高频调用
- 多服务共存时:--hashlimit-mode srcip,dstport——避免不同服务(如 API 和管理后台)互相干扰
- 不建议单独用 dstport 或 dstip——无法区分攻击源,等于全局限速,容易误伤正常用户
设置合理的令牌桶参数
hashlimit 底层是令牌桶模型,两个参数直接决定防护效果:
- --hashlimit 8/sec:每秒补充 8 个令牌,即长期平均请求上限(例如页面加载带 3–5 个 AJAX,8/s 足够覆盖)
- --hashlimit-burst 24:桶最大容量 24,允许短时集中请求(如登录后连续拉取用户信息、订单、通知)
示例规则(保护 8080 端口的 API):
iptables -A INPUT -p tcp --dport 8080 -m hashlimit \--hashlimit-name api-8080 \
--hashlimit 8/sec \
--hashlimit-burst 24 \
--hashlimit-mode srcip \
-j ACCEPT
配套动作必须闭环
只加 ACCEPT 不起作用,必须形成完整处理链:
- 紧接一条无条件 DROP 规则:iptables -A INPUT -p tcp --dport 8080 -j DROP,丢弃所有未通过限流检查的包
- 指定唯一 --hashlimit-name(如 api-8080),便于后续查状态:cat /proc/net/ipt_hashlimit/api-8080
- 若只想限制新建连接(如防暴力注册),可加 -m state --state NEW;若要控全部数据包(含响应重传),则不加
- 规则生效后务必持久化:iptables-save > /etc/sysconfig/iptables(CentOS)或 netfilter-persistent save(Debian/Ubuntu)
上线前验证与调优要点
规则写完不能只看是否加载成功,要实测行为是否符合预期:
- 用 watch -n1 'cat /proc/net/ipt_hashlimit/api-8080' 观察各 IP 当前令牌余量变化
- 用 curl 循环请求(如 for i in {1..30}; do curl -s -o /dev/null http://x.x.x.x:8080/api/test; done),确认第 25 次起开始丢包或超时
- burst 值不宜设过高(如超过 3×limit),否则失去限流意义;也不宜过低(如 burst=5),否则影响首屏加载或表单提交体验
- 对登录、支付等敏感接口,可叠加 -m connlimit --connlimit-above 2 控制并发连接数,形成速率+连接双保险

















