IP访问限频配置设置多少好?

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. 基线测试法(推荐)

  1. 初始状态:将限频设为“无限制”或“极高”。
  2. 收集数据:运行一周,通过 Nginx 日志或 WAF 面板分析正常用户的平均请求频率(QPS)。
    • 例如:95% 的用户每分钟请求不超过 10 次,但有个别用户达到 50 次。
  3. 设定阈值:将阈值设定在 99% 分位值 + 少量缓冲
    • 如果 99% 的用户 < 20 次/分,你可以设置为 30 次/分。这样既挡住了 99% 的正常波动,又保留了缓冲空间。

B. 动态调整法

  • 白天 vs 夜间:电商大促期间,阈值应适当放宽;深夜闲时,阈值可收紧。
  • 地域差异:某些地区网络延迟高,用户重试率高,可能需要针对特定 IP 段做差异化配置。

4. 实施建议与注意事项

  1. 使用滑动窗口算法
    不要使用简单的“每分钟计数”,推荐使用令牌桶(Token Bucket)滑动窗口(Sliding Window)算法。这能防止用户在时间边界(如第 59 秒发 100 次,第 60 秒再发 100 次)瞬间突破限制。

  2. 分级响应策略

    • 第一次违规:返回 429 Too Many Requests,并提示“操作过于频繁,请稍后再试”。
    • 第二次违规:强制弹出图形验证码。
    • 第三次违规:暂时封禁 IP 15-30 分钟。
  3. 关注“假”IP
    如果攻击者使用X_X池(Proxy Pool),单一 IP 的限制可能失效。此时需要结合:

    • 用户行为分析:同一账号下多个 IP 频繁操作。
    • 指纹识别:识别非浏览器特征(User-Agent、TLS 指纹)。
    • Cloudflare/WAF 防护:利用云厂商的自动清洗能力处理大规模 CC 攻击。
  4. 错误处理
    务必在限频触发时返回明确的 HTTP 状态码 429,并在 Header 中带上 Retry-After 字段,告知客户端多久后可以重试,这对前端用户体验和自动化脚本都很重要。

总结建议

如果你是首次配置,建议采取保守策略:

  • 登录接口:3 次/分钟。
  • 普通 API:60 次/分钟。
  • 其他接口:100 次/分钟。

配置后观察 24-48 小时,如果发现大量 429 报错且伴随用户投诉,说明太严了,需调高;如果日志中仍出现明显的攻击流量,则需进一步调低。