这是一个非常实际的问题,但需要明确一点:没有一个适用于所有HTTP接口的“通用”IP限流阈值。 阈值的选择高度依赖于具体的业务场景、接口类型、服务器性能和安全策略。
不过,我们可以从不同场景和层级来探讨常见的实践和参考范围。
核心原则:阈值是动态的,需要根据监控调整
设定阈值不是一劳永逸的,必须结合实时监控(QPS、响应时间、错误率、服务器负载)和业务数据(正常用户行为模型)进行持续调整。
常见场景下的参考阈值(按严格程度排序)
1. 严格防护型(安全优先)
适用于:登录接口、注册接口、短信/邮件验证码接口、支付接口、抢购入口。
- 典型阈值:每分钟 5 – 60 次请求/每IP
- 说明:这类接口是攻击者(撞库、爆破、垃圾注册、短信轰炸)的主要目标,也是业务关键点。阈值设定得非常低,旨在允许正常人类操作(如尝试登录几次),但阻止自动化脚本。
- 登录/注册:通常为 5-20次/分钟。超过即触发验证码或临时锁定。
- 短信验证码:通常为 1-5次/分钟,且会结合手机号、IP、设备指纹等多维度进行更严格的限制(如1小时不超过10次)。
2. 业务保护型(平衡体验与安全)
适用于:核心API、查询接口、内容提交接口(如评论、发帖)。
- 典型阈值:每分钟 60 – 1000 次请求/每IP
- 说明:这类接口需要防止恶意爬虫、刷量或CC攻击,但也要保障正常用户和合作伙伴的流畅使用。阈值通常基于业务逻辑设定。
- 普通API:100-300次/分钟 是一个常见起点。
- 搜索/列表查询:可能放宽到 500-1000次/分钟,因为用户可能频繁翻页或筛选。
3. 宽松限制型(防滥用为主)
适用于:公开的静态资源、低频的只读接口、文档页面。
- 典型阈值:每分钟 1000 – 10000+ 次请求/每IP
- 说明:主要目的是防止个别IP耗尽带宽或产生异常流量,对正常用户几乎没有影响。阈值设定得较高。
4. 基于用户等级的差异化限流
适用于:拥有用户体系的成熟产品(如云服务API)。
- 免费/匿名用户:严格限制(如 60次/分钟/每IP)。
- 认证用户:根据套餐限制(如 基础版 1000次/分钟,企业版 10000次/分钟)。此时限流主体是
UserID或API Key,IP作为辅助维度。
技术实现的关键策略(比单一阈值更重要)
-
分层分级:
- 全局网关层限流:在Nginx、API Gateway层面设置一个较宽松的底线(如 10000次/分钟),防住最基础的洪水攻击。
- 业务层限流:在应用代码或微服务网关中,针对具体接口路径设置精细化的阈值。
-
滑动时间窗口 vs 固定时间窗口:
- 固定窗口(如每分钟重置计数器):实现简单,但可能在窗口切换时承受双倍流量。
- 滑动窗口(如最近1分钟内的计数):更平滑准确,是更优选择。常用Redis + Lua脚本或
redis-cell模块实现。
-
多维度组合限流:
- 单纯IP限流容易被XXIP或NAT出口IP(如学校、公司)误伤。应结合:
- 用户会话/Token
- 设备指纹
- 手机号/账号
- 例如:
同一IP + 同一账号在登录接口的阈值应远低于单独IP的阈值。
- 单纯IP限流容易被XXIP或NAT出口IP(如学校、公司)误伤。应结合:
-
响应策略(而非简单拒绝):
- 返回429状态码:告知客户端“请求过多”。
- 启用验证码:对于疑似恶意的超额请求,要求进行人机验证,通过后继续服务。
- 请求排队/延迟响应:对超出部分进行延迟处理,减缓攻击节奏。
- 临时封禁:对于持续恶意攻击的IP,可以升级为封禁一段时间(如1小时)。
总结与建议
- 从保守值开始:对于关键接口,从一个较低的阈值开始(如 10-30次/分钟),观察日志和监控,看是否有大量正常请求被误拦截。
- 监控与分析:建立仪表盘,重点关注被限流拦截的请求。分析它们的IP、User-Agent、行为模式,区分是恶意攻击还是正常高流量用户(如爬虫)。
- 进行压力测试:了解你的单机/集群在各类接口上的实际承载能力,将限流阈值设定在最大能力的70%-80%左右,为流量波动留出缓冲。
- 参考行业实践:
- GitHub API:对于未认证请求,每IP每小时60次;基础认证后,每用户每小时5000次。
- 很多云服务商的免费层API限制在每分钟几十到几百次。
最终,一个合理的IP限流阈值,是你通过监控、分析和业务理解,在“安全防护”、“用户体验”和“系统负载”三者之间找到的动态平衡点。 建议从上述“严格防护型”的阈值作为起点,逐步迭代优化。
CLOUD技术笔记