限制請求速率

頁面規則下拉選單中提供了多個已分類的動作選項。其中,“CC 攻擊防禦動作”類別包含用於控制請求流量的動作。

選擇限制請求速率動作:

請求速率限制基於漏桶演算法工作,我們可透過以下三個引數來進行請求管理:

  1. 關鍵字:預設為客戶端的 IP 地址,可透過下拉選單更改為 URI、URI 引數等,並且可以選擇一個或多個關鍵字。若選擇 URI 引數或 Cookie,還需額外指定一個相應的 Argument 欄位;詳見關鍵字說明
  2. 調節閾值:低於此速率的請求不受影響;速率介於此閾值與拒絕閾值之間的請求,將被延時處理;
  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 的限速。因此,加密 Cookie 必須和其它的關鍵字一起使用

達到限速條件後,系統可執行以下預設動作,預設為 返回錯誤頁

  • 關閉請求連線:立即終止與客戶端的連線,不再響應請求。
  • 返回錯誤頁,預設為狀態碼 503:限速生效時向使用者展示帶有 503 狀態碼的錯誤頁面,暗示伺服器暫時無法處理請求。
  • 完成 hCaptcha 驗證:要求使用者透過 hCaptcha 挑戰,以區分真人和機器行為。
  • 完成 OpenResty Edge Captcha 驗證:使用 OpenResty Edge 的驗證碼系統驗證使用者身份。
  • 重定向驗證:將請求重定向至驗證頁面,驗證透過後方可繼續訪問。
  • JavaScript 挑戰:要求使用者瀏覽器執行 JavaScript 程式碼,驗證非機器人操作。
  • 標記為拒絕:僅將請求標記為拒絕,繼續執行後續規則。此動作於 24.9.1-7 中首次引入。

預設情況下,該動作針對所有請求,在客戶端地址基礎上限速。這種規則可能過於寬泛,我們可以透過下述方式實現更細緻的條件控制。 如同動作設定,條件也按照 URI、請求、響應、客戶端資訊等類別整理。

示例 1:

這裡我們以客戶端資訊中的國家為例,設定僅對來自日本的請求執行上述動作:

輸入日本的國家程式碼 JP,所有大洲、國家、省份、城市的程式碼可在 Edge 文件中找到:client-country

完成動作和條件設定後,點選右下方的“建立”按鈕即可應用規則。頁面將自動跳轉回規則列表頁面。

示例 2:

接下來演示如何使用加密 Cookie加密 Cookie 應該和其他關鍵字一起使用,這樣當 Cookie 不存在時,才能回退成根據其他關鍵字限速。

關鍵字我們選擇了 客戶端地址加密 Cookie 作為關鍵字,一分鐘內只允許一個請求。

這裡我們沒有設定代理等其他動作,因此預期動作是正常請求會返回 404 狀態,被限速的情況會返回 503 狀態。儲存配置。

釋出配置。

接著傳送測試請求:curl localhost -H 'Host: test.com' -I

HTTP/1.1 404 Not Found
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw=; Path=/; Secure
Req-ID: 0000008000045ed343300002

此時返回了 Set-Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw=; Path=/; Secure,因為最初是沒有 Cookie 的,因此返回了一個。如果我們再次傳送不攜帶 Cookie 的請求,那麼將會按照 客戶端地址 進行限速。

傳送第二個測試請求 curl localhost -H 'Host: test.com' -I -H 'Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw='

HTTP/1.1 404 Not Found
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Req-ID: 0000008000045ed343300003

這是攜帶 Cookie 的第一個請求,因此沒有被限速。

傳送第三測試請求 curl localhost -H 'Host: test.com' -I -H 'Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw='

HTTP/1.1 503 Service Temporarily Unavailable
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Req-ID: 0000008000045ed343a80004

請求被限速了。