怎样通过 Apache 对动态接口进行频率限制

作者:袖梨 2026-07-14
Apache需借助mod_security等模块实现动态接口精细化限频,应精准识别/api/等业务路径、排除静态资源与健康检查,采用IP+User-Agent或参数哈希组合计数,规则置于phase:1并设合理expirevar与阈值。

Apache 本身不支持直接对动态接口做带时间窗口、跨请求计数的精细化频率限制,必须借助第三方模块(如 mod_securitymod_evasive)配合路径识别和状态管理来实现。关键不是“全量限速”,而是精准聚焦业务接口、避开静态资源与健康检查,同时避免误杀正常用户。

只对真实动态接口路径启用限频

动态接口通常有明确特征:路径含 /api//v1//login/search 等,且方法多为 GET/POST。应严格排除非业务流量:

  • SecRule REQUEST_URI ".(js|css|png|jpg|woff2)$" "phase:1,nolog,allow" 跳过所有静态资源
  • SecRule REQUEST_URI "^/health$" "phase:1,nolog,allow" 放行健康检查
  • 仅对目标路径生效,例如:SecRule REQUEST_URI "^/api/login$" "phase:1,pass,nolog,setvar:ip_login=+1"

用组合维度计数,防 CDN/NAT 下误封

单靠 IP 计数在共享出口环境下极易误伤。应按接口语义选择更稳定维度:

  • 登录类接口:用 IP + User-Agent 组合,降低共用公网 IP 的误判率
  • 搜索类接口:用 IP + 参数哈希(如 @md5(%{ARGS.q})),防止恶意枚举相同关键词
  • 避免使用 DOSSiteCount 这类全局统计,它无法区分首页刷新和爆破后台

规则放在 phase:1,禁用日志,拦截返回 429

高频规则若在 phase:2 执行,需解析请求体(尤其 POST),CPU 和内存开销陡增。优化要点:

  • 所有计数规则统一放在 phase:1(仅解析请求行和头,不读 body)
  • nolog,pass,不记录匹配过程;只在真正触发拦截时写日志
  • 拦截动作用 status:429,不跳转、不渲染页面,减少响应开销

设合理 expirevar 时间与阈值

变量生命周期太长会堆积内存,太短则失去限速意义。按场景分级设置:

  • 防爬虫瞬时打点(如 /search?q=test):expirevar 设 10 秒,阈值 @gt 30
  • 防暴力登录(如 /api/login):expirevar 设 60 秒,阈值 @gt 5
  • 定期检查 /var/cache/mod_security 目录大小,持续超 50MB 说明变量未清理,需核查 expirevar 是否生效

相关文章

精彩推荐