封锁请求

封锁请求动作持续观察请求处理速率。当同一关键字的请求速率连续多个时间窗口达到封锁条件时,系统在指定时间内对该关键字执行拒绝动作。封锁时间结束后,系统解除封锁并重新开始观察。

适用场景

  • 客户端持续高频访问,短时请求速率限制不足以阻止其反复重试。
  • 希望区分偶发突发与持续异常,只封锁连续触发阈值的请求分组。
  • 需要在一段时间内对异常客户端持续执行验证码、错误页或连接关闭等处置。

封锁请求作用于页面规则识别出的请求。如果需要在操作系统层面丢弃来源 IP 的所有数据包,请使用封禁来源 IP

工作原理

该动作在观察时间窗口内计算每个关键字的请求处理速率:

  1. 请求速率低于调节阈值时,不进行限制。
  2. 请求速率达到调节阈值但尚未达到拒绝阈值时,请求会被延迟。
  3. 请求速率达到拒绝阈值时,系统执行拒绝动作。
  4. 请求速率连续指定数量的时间窗口达到封锁条件后,系统在封锁时间内持续执行拒绝动作。
  5. 封锁时间结束后,该关键字解除封锁,连续窗口计数重新开始。

配置方法

在目标应用的页面规则中选择 CC 攻击防御动作 > 封锁请求

选择封锁请求动作

参数说明

  1. 关键字:用于对请求分组并分别观察。默认使用客户端 IP 地址,也可以组合 URI、URI 参数等关键字。选择 URI 参数或 Cookie 时,还需要指定相应的参数或 Cookie 名称。详见关键字
  2. 调节于:请求速率低于该值时不受限制;达到该值但尚未达到拒绝阈值时,请求将被延迟。
  3. 拒绝于:请求速率达到该值后,系统执行拒绝动作。
  4. 时间窗口:每次观察请求速率的时间区间。
  5. 封锁阈值:触发封锁所需的连续时间窗口数量。
  6. 封锁时间:封锁持续时间。该时间结束后,系统解除封锁并重新统计连续窗口。
  7. 拒绝动作:达到拒绝条件或进入封锁状态后执行的操作。详见拒绝动作

调节阈值和拒绝阈值可以按每秒请求数或每分钟请求数设置。两个阈值设置为相同值时,不保留调节区间,达到该速率后将直接执行拒绝动作。

关键字

封锁请求的关键字选项

可选的关键字包括:

  • 客户端 IP 地址:例如 1.1.1.1
  • URI:例如 /openresty
  • URI 查询参数:例如 /openresty?arg1=val1 中的 arg1
  • 请求 Cookie:例如 Cookie: c1=v1 中的 c1
  • X-Forwarded-For 中的第一个 IP 地址:例如 X-Forwarded-For: 1.1.1.1, 1.1.1.2 中的 1.1.1.1
  • X-Forwarded-For 中的最后一个 IP 地址:例如 X-Forwarded-For: 1.1.1.1, 1.1.1.2 中的 1.1.1.2
  • 指定的 HTTP 请求头:例如 Host
  • 加密 Cookie:根据 OpenResty Edge 生成的加密 Cookie 区分客户端。请求没有携带加密 Cookie 时,系统需要回退到其他关键字,因此加密 Cookie 必须与其他关键字组合使用

使用 X-Forwarded-For 前,应确保该请求头由可信代理维护,不能由客户端任意伪造。

拒绝动作

达到拒绝条件或进入封锁状态后,系统可以执行以下预设动作。默认动作为 返回错误页

封锁请求的拒绝动作

  • 关闭请求连接:立即终止与客户端的连接,不再响应请求。
  • 返回错误页:返回错误页面,默认状态码为 503。
  • 完成 hCaptcha 验证:要求客户端通过 hCaptcha 挑战。
  • 完成 OpenResty Edge Captcha 验证:使用 OpenResty Edge 的验证码系统验证用户。
  • 重定向验证:将请求重定向到验证页面,验证通过后才能继续访问。
  • JavaScript 挑战:要求客户端浏览器执行 JavaScript 代码,以区分浏览器和简单的自动化程序。
  • 私有访问 Token:请求客户端认证,没有有效 Token 时执行配置的回退动作。 需要配置回退动作、必要的页面模板和 清除时间(默认 60 秒)。详见 私有访问 Token。 此动作在 OpenResty Edge 26.9.1-1 中首次引入。
  • 标记为拒绝:仅将请求标记为拒绝,并继续执行后续规则。此动作于 24.9.1-7 中首次引入。

验证方法

发布配置后,使用受控客户端持续发送能够命中规则的请求,并依次确认:

  1. 低于调节阈值时,请求正常处理。
  2. 进入调节区间后,请求延迟增加。
  3. 达到拒绝阈值后,拒绝动作生效。
  4. 连续达到封锁条件后,后续请求在封锁时间内持续受到处置。
  5. 封锁时间结束后,请求恢复,连续窗口重新统计。

注意事项

  • 时间窗口过短可能对瞬时抖动过于敏感,过长则会延迟对持续攻击的识别。应根据正常流量的波动周期调优。
  • 封锁阈值越小,越容易快速进入封锁状态,也越需要关注误报。
  • 只按客户端 IP 地址统计时,共享 NAT 或代理后的用户可能被作为同一个客户端处理。
  • 对可能包含正常浏览器用户的流量,优先使用验证码等可恢复的拒绝动作。