iptables的hashlimit模块通过令牌桶机制实现按源IP等维度的独立限流,支持突发容忍,需配合--hashlimit-mode、--hashlimit、--hashlimit-burst参数及后续DROP规则使用,确保业务接口防护精准有效。

用 iptables 的 hashlimit 模块做业务接口限流,核心是按请求来源(比如源 IP)独立计数,避免全局一刀切,同时支持突发容忍——这比基础 limit 模块更贴合真实业务场景。
明确限流维度和匹配粒度
业务接口通常暴露在特定端口(如 80/443/8080),限流必须绑定协议、端口,并指定“谁该被单独限制”。关键靠 --hashlimit-mode 参数:
- srcip:最常用,每个客户端 IP 独立限流(防单 IP 恶意刷量)
- srcip,dstport:适合多服务共用主机的场景,区分不同端口的流量
- srcip,srcport:极少数需识别客户端连接池复用的情况(如某些长连接 SDK)
不建议只用 dstip 或 dstport 单独匹配,否则无法隔离攻击源。
设置合理的令牌桶参数
hashlimit 底层是令牌桶模型,两个参数决定效果:
-
--hashlimit 5/sec:每秒补充 5 个令牌,即长期平均速率上限 -
--hashlimit-burst 15:桶最大容量 15,允许短时突发(比如页面加载带多个 AJAX 请求)
示例:限制 HTTP 接口每 IP 每秒最多 10 次请求,允许最多 30 次突发
iptables -A INPUT -p tcp --dport 8080 -m hashlimit \--hashlimit-name api-req \
--hashlimit 10/sec \
--hashlimit-burst 30 \
--hashlimit-mode srcip \
-j ACCEPT
注意:必须配后续的 DROP 规则,否则未匹配的包仍会继续走默认策略。
配套动作不能少
光加 ACCEPT 不够,完整链路要闭环:
- 紧接一条无条件 DROP 规则:放在 ACCEPT 后面,丢弃所有未通过限流检查的包
-
指定
--hashlimit-name:名字唯一,用于在/proc/net/ipt_hashlimit/下查实时状态,也避免规则冲突 -
考虑连接状态:若只限新建连接,可加
-m state --state NEW;若限全部数据包(含响应),则不加 -
保存规则持久化:执行
service iptables save或iptables-save > /etc/sysconfig/iptables
验证与调优提示
上线后别只看规则是否存在,要实测:
- 用
watch -n1 'cat /proc/net/ipt_hashlimit/api-req'查看各 IP 当前令牌余量 - 模拟压测时观察是否真触发限流(如 curl 多次返回超时或连接拒绝)
- burst 值不宜过大,否则失去限流意义;也不宜过小,否则影响正常用户首屏体验
- 对登录、支付等敏感接口,可叠加
connlimit控制并发连接数,形成双重防护

















