IP 访问限频(Rate Limiting)并没有一个“放之四海而皆准”的固定数值,最佳配置取决于你的业务类型、服务器性能、目标用户群体以及当前的攻击情况。
盲目设置过严会误伤正常用户,过宽则无法抵御攻击。以下是一套科学的配置思路和不同场景下的参考建议:
1. 核心配置原则
在设定具体数字前,请遵循以下三个原则:
- 最小权限原则:只限制必要的接口(如登录、注册、支付、搜索),不要对静态资源(图片、CSS、JS)或健康检查接口进行严格限制。
- 渐进式策略:先设置较宽松的阈值观察日志,发现异常后再逐步收紧。
- 区分场景:区分“恶意爬虫/攻击”与“高频正常用户”(如直播弹幕、实时交易)。
2. 常见场景的参考阈值
以下是基于一般 Web 应用的经验值(单位:次/分钟 或 次/秒),你可以根据实际情况微调:
| 接口类型 | 推荐限制 (单 IP) | 说明与逻辑 |
|---|---|---|
| 登录/认证接口 | 3 ~ 5 次/分钟 | 最敏感接口。超过此频率极可能是暴力破解。可配合验证码机制。 |
| 短信/邮件验证码 | 1 ~ 2 次/5 分钟 | 防止短信轰炸。通常建议按天或小时级限制更稳妥。 |
| 注册接口 | 10 ~ 20 次/小时 | 防止批量注册僵尸号。 |
| 通用搜索/API | 60 ~ 100 次/分钟 | 普通用户操作频率。如果业务允许高频查询(如股票行情),可适当调高。 |
| 支付/下单接口 | 10 ~ 20 次/分钟 | 涉及资金安全,需严格限制,防止重放攻击或刷单。 |
| 静态资源 (图片/CSS) | 不限 或 极高 (如 1000+/秒) | 除非遭遇 DDoS,否则不应限制,以免导致页面加载失败。 |
| 健康检查/监控 | 不限 | 确保监控系统能正常轮询,避免被限流导致误报服务宕机。 |
3. 如何确定适合你的数值?
A. 基线测试法(推荐)
- 初始状态:将限频设为“无限制”或“极高”。
- 收集数据:运行一周,通过 Nginx 日志或 WAF 面板分析正常用户的平均请求频率(QPS)。
- 例如:95% 的用户每分钟请求不超过 10 次,但有个别用户达到 50 次。
- 设定阈值:将阈值设定在 99% 分位值 + 少量缓冲。
- 如果 99% 的用户 < 20 次/分,你可以设置为 30 次/分。这样既挡住了 99% 的正常波动,又保留了缓冲空间。
B. 动态调整法
- 白天 vs 夜间:电商大促期间,阈值应适当放宽;深夜闲时,阈值可收紧。
- 地域差异:某些地区网络延迟高,用户重试率高,可能需要针对特定 IP 段做差异化配置。
4. 实施建议与注意事项
-
使用滑动窗口算法:
不要使用简单的“每分钟计数”,推荐使用令牌桶(Token Bucket)或滑动窗口(Sliding Window)算法。这能防止用户在时间边界(如第 59 秒发 100 次,第 60 秒再发 100 次)瞬间突破限制。 -
分级响应策略:
- 第一次违规:返回
429 Too Many Requests,并提示“操作过于频繁,请稍后再试”。 - 第二次违规:强制弹出图形验证码。
- 第三次违规:暂时封禁 IP 15-30 分钟。
- 第一次违规:返回
-
关注“假”IP:
如果攻击者使用X_X池(Proxy Pool),单一 IP 的限制可能失效。此时需要结合:- 用户行为分析:同一账号下多个 IP 频繁操作。
- 指纹识别:识别非浏览器特征(User-Agent、TLS 指纹)。
- Cloudflare/WAF 防护:利用云厂商的自动清洗能力处理大规模 CC 攻击。
-
错误处理:
务必在限频触发时返回明确的 HTTP 状态码 429,并在 Header 中带上Retry-After字段,告知客户端多久后可以重试,这对前端用户体验和自动化脚本都很重要。
总结建议
如果你是首次配置,建议采取保守策略:
- 登录接口:3 次/分钟。
- 普通 API:60 次/分钟。
- 其他接口:100 次/分钟。
配置后观察 24-48 小时,如果发现大量 429 报错且伴随用户投诉,说明太严了,需调高;如果日志中仍出现明显的攻击流量,则需进一步调低。
CLOUD云