限制請求速率
頁面規則下拉選單中提供了多個已分類的動作選項。其中,“CC 攻擊防禦動作”類別包含用於控制請求流量的動作。
選擇限制請求速率動作:
請求速率限制基於漏桶演算法工作,我們可透過以下三個引數來進行請求管理:
- 關鍵字:預設為客戶端的 IP 地址,可透過下拉選單更改為 URI、URI 引數等,並且可以選擇一個或多個關鍵字。若選擇 URI 引數或 Cookie,還需額外指定一個相應的 Argument 欄位;詳見關鍵字說明
- 調節閾值:低於此速率的請求不受影響;速率介於此閾值與拒絕閾值之間的請求,將被延時處理;
- 拒絕閾值:超過此速率的請求執行指定的
拒絕動作
。 - 拒絕動作:指定在達到
拒絕閾值
後執行的動作。詳見拒絕動作說明
這兩個閾值引數預設單位是每秒請求數,也可以設定為每分鐘請求數。
若兩閾值設定相同,則超出該速率的請求會立即被拒絕。
請求將依據設定的關鍵字進行限速,可選關鍵字包括:
- 客戶端 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
請求被限速了。