菜单

速率限制与DDOS防护

相关源文件

目的与范围

本文档介绍了如何通过速率限制机制来保护 Node.js 应用程序免受过多流量和潜在的分布式拒绝服务 (DDoS) 攻击。速率限制限制了客户端在特定时间范围内可以发出的请求数量,从而防止了可能导致应用程序无响应的资源耗尽。

来源: sections/security/limitrequests.md3-5

深入理解 Node.js 中的速率限制

速率限制是一种关键的防御机制,可以保护您的应用程序免受过多并发请求的压垮。这种保护对于 Node.js 应用程序尤其重要,因为它们运行在单线程事件循环上,可能被过多的处理请求阻塞。

为什么速率限制很重要

速率限制具有多种重要的安全和稳定性目的

  1. 防范暴力破解攻击 - 减缓密码猜测或凭证填充的尝试
  2. DDoS 攻击缓解 - 将传入请求速率限制在正常用户的典型值
  3. 资源管理 - 防止上游应用程序服务器过载
  4. API 使用控制 - 确保公平使用您的服务并防止滥用

来源: sections/security/limitrequests.md59-62

速率限制架构

速率限制流程图

来源: sections/security/limitrequests.md5-6

实现方法

对于 Node.js 应用程序的速率限制实现,有几种方法,每种方法都有不同的特性,适用于各种部署场景。

实施选项比较

方法优点缺点最佳用途
外部服务(nginx)减少应用程序开销,专用于此任务需要额外的基础设施生产部署
应用程序中间件设置简单,直接访问请求上下文消耗应用程序资源小型到中型应用程序
Redis 支持的速率限制器跨多个实例扩展,跨重启持久化需要 Redis 基础设施分布式应用程序

来源: sections/security/limitrequests.md5-6

速率限制组件和数据流

速率限制组件图

来源: sections/security/limitrequests.md7-39

Node.js 的实施选项

1. 使用 rate-limiter-flexible 的纯 Node.js

`rate-limiter-flexible` 包为纯 Node.js 应用程序中的速率限制提供了一种灵活的方式。它可以与各种存储后端(包括 Redis)一起使用,以维护速率限制状态。

关键配置选项

  • points:在持续时间内允许的最大请求数
  • duration:时间窗口(秒)
  • blockDuration:超过限制后阻止请求的时间(秒)

实施示例: sections/security/limitrequests.md9-37

该实施创建了一个基于 Redis 的速率限制器,允许每秒 20 个请求。当超过限制时,它会返回 429 状态码,表示“请求过多”。

来源: sections/security/limitrequests.md7-39

2. Express.js 速率限制中间件

对于 Express 应用程序,`express-rate-limit` 中间件提供了一种简单的方法来对特定路由或全局实施速率限制。

关键配置选项

  • windowMs:时间窗口(毫秒)
  • max:每个窗口允许的最大请求数
  • trust proxy:如果您的应用程序位于代理后面,这是一个重要的设置

实施示例: sections/security/limitrequests.md41-57

此示例创建了一个速率限制器,将对 `/user/` 路由的请求限制为每 15 分钟 100 次。

来源: sections/security/limitrequests.md41-57

高级速率限制策略

分级速率限制

分级速率限制图

分布式架构下的速率限制

对于运行在多个实例上的应用程序,使用像 Redis 这样的集中式存储来进行速率限制状态至关重要,以确保所有实例之间速率限制的一致性。

分布式速率限制图

与其他 DDoS 防护措施的集成

速率限制应作为更广泛的 DDoS 攻击防护策略的一部分。其他补充措施包括

  1. Web 应用程序防火墙 (WAF) - 用于过滤恶意流量
  2. CDN 服务 - 在流量到达您的源服务器之前进行吸收和过滤
  3. 流量分析工具 - 用于检测和响应攻击模式
  4. 资源隔离 - 防止在高负载期间一个服务影响其他服务

可能需要防护的 DDoS 向量

向量描述防护策略
HTTP 洪水用看起来合法的 HTTP 请求压垮服务器每个 IP 的速率限制,行为分析
慢速 HTTP 攻击故意缓慢地发送 HTTP 请求请求超时,连接限制
RegEx DoS导致过度 CPU 使用的恶意 RegEx避免易受攻击的 RegEx 模式,使用经过验证的库
CPU/内存耗尽消耗过多资源的请求速率限制,资源配额

来源: sections/security/regex.md1-6

速率限制实施最佳实践

  1. 使用合适的标识符 - 考虑按 IP、用户 ID、API 密钥或组合进行速率限制
  2. 选择合适的限制 - 在限制滥用和允许合法用户之间取得平衡
  3. 实施适当的错误响应 - 返回 429 状态码并提供清晰的信息
  4. 添加标头信息 - 包括 X-RateLimit-LimitX-RateLimit-RemainingRetry-After 等标头
  5. 分级响应 - 对重复违规行为应用越来越严格的限制
  6. 监控和调整 - 定期审查速率限制的有效性并根据需要进行调整

何时使用外部速率限制服务

虽然应用程序级别的速率限制是有效的,但当出现以下情况时,请考虑使用 Nginx 或云提供商解决方案等专用外部服务

  1. 您需要防范大规模 DDoS 攻击
  2. 您的应用程序运行在多个实例上
  3. 您希望减轻速率限制的性能影响
  4. 您需要更复杂的流量分析

结论

速率限制是 Node.js 应用程序必不可少的安全措施,用于防止资源耗尽和 DDoS 攻击。通过实施适当的速率限制策略,您可以保护您的应用程序,同时确保合法用户能够持续访问您的服务。

请记住,速率限制应作为更广泛安全策略的一部分,其中包括此 wiki 中记录的其他实践,例如输入验证、错误处理和安全编码实践。