限制单位时间内的请求数

在页面规则的动作下拉列表中,我们可以找到"CC 攻击防御动作"类别下的 限制请求数 选项。这个功能用于控制指定时间段内的请求数量,是一种有效的流量控制机制。

配置详解

配置界面

  1. 关键字:默认使用客户端的 IP 地址,但可以通过下拉菜单选择其他选项,如 URI、URI 参数等。支持选择多个关键字。选择 URI 参数或 Cookie 时,需要额外指定相应的 Argument 字段。详细说明请参见关键字说明

  2. 拒绝阈值: 当指定时间窗口内的请求数超过此值时,系统将向客户端返回 503 错误。

  3. 时间窗口: 计数的时间区间,以秒为单位。每进入新的时间窗口,计数器会重置为零。

  4. 拒绝动作:指定达到拒绝阈值后要执行的操作。详情请查看拒绝动作说明

关键字选项

系统会根据设定的关键字进行限速,可选的关键字包括:

关键字详情

  • 客户端 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 时,系统需要回退到其他限速策略。

拒绝动作选项

当达到限速条件时,系统可以执行以下预设动作(默认为 返回错误页):

拒绝动作选项

  • 关闭请求连接:立即终止与客户端的连接,不再响应请求。
  • 返回错误页(默认状态码 503):向用户展示带有 503 状态码的错误页面,表明服务器暂时无法处理请求。
  • 完成 hCaptcha 验证:要求用户通过 hCaptcha 挑战,以区分人类和机器行为。
  • 完成 OpenResty Edge Captcha 验证:使用 OpenResty Edge 的验证码系统验证用户身份。
  • 重定向验证:将请求重定向至验证页面,验证通过后才能继续访问。
  • JavaScript 挑战:要求用户浏览器执行 JavaScript 代码,验证非机器人操作。
  • 标记为拒绝:仅将请求标记为拒绝,但继续执行后续规则。此功能于 24.9.1-7 版本中引入。

配置示例

示例配置

以上配置表示:在每个 60 秒的时间窗口内,如果来自同一终端的请求超过 1 个,系统将返回 503 错误。

发布配置后,我们可以通过 curl 命令模拟客户端访问来测试效果。

第一次访问不会触发限制,但会返回 404 错误,因为请求的页面不存在:

$ curl -i -H 'host: test.com' http://node-host/404.html
HTTP/1.1 404 Not Found
Date: Fri, 04 Sep 2020 04:43:20 GMT
Content-Type: text/html
Content-Length: 150
Connection: keep-alive
Server: openresty+

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>openresty</center>
</body>
</html>

紧接着再次发送相同的请求,这次将会触发限速,返回 503 错误:

$ curl -i -H 'host: test.com' http://node-host/404.html
HTTP/1.1 503 Service Temporarily Unavailable
Date: Fri, 04 Sep 2020 04:43:21 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Server: openresty+

<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>openresty</center>
</body>
</html>

通过这个示例,我们可以清楚地看到限速功能的实际效果。