在 OpenResty Edge 中限制請求速率(使用自定義鍵)
OpenResty Edge 的速率限制可以按自定義鍵(客戶端 IP 地址、URI、URI 引數或 Cookie)限制請求速率,並使用兩個閾值:軟限制 “Shape at” 速率會延遲超出的請求,硬限制 “Reject at” 速率會直接拒絕它們。當客戶端傳送請求過快時(例如在拒絕服務攻擊下),這可以同時保護你的閘道器伺服器和源伺服器,使其不會過載。下面我們將一步步新增一個速率限制頁面規則,用 wrk 測試它,並把相同的限制擴充套件到 SSL 握手。
在 OpenResty Edge 中新增限制請求率的頁面規則
讓我們進入 OpenResty Edge 的 Admin Web 控制檯。這是我們控制檯的樣本部署。每個使用者都有自己的本地部署。
我們可以繼續使用之前的示例應用,test-edge.com。進入該應用程式。
我們已經定義了一個頁面規則。
這個頁面規則設定了一個反向代理,將請求轉發到一個預先定義的上游,此時並沒有限制請求速率。
現在讓我們編輯現有的頁面規則來新增速率限制。新增一個新的動作,並搜尋 “Limit request rate”。
首先,我們需要指定速率限制的 Key。
有多種 Key 型別可選——客戶端 IP 地址、URI、URI 引數、Cookie,以及更多。現在先選擇預設的 Key 型別,客戶端 IP 地址。這樣限制就針對每個單獨的客戶端 IP 地址。
“Shape at” 速率是一個軟限制。當客戶端試圖傳送比這個速率更快的請求時,閘道器伺服器會延遲這些過度的請求以匹配這個速率。因此,客戶端傳送請求的速度越快,閘道器新增的延遲就越長。這裡我們指定每秒 50 個請求的速率。
因為我們把 Key 型別設定為客戶端 IP 地址,所以限制會應用於每個單獨的客戶端 IP 地址。
“Reject at” 速率是一個硬限制。當客戶端傳送請求的速度快到超過這個硬限制時,我們可以採取更積極的動作,比如立即阻止它們而無需等待。在這裡指定每秒 100 個請求的速率。
我們可以選擇不同的攔截動作——比如立即關閉當前連線、返回錯誤頁面,或者返回驗證碼頁面來阻止機器人。選擇預設的 “Error Page”(錯誤頁面)動作,它會透過 HTTP 返回一個錯誤頁面。
此處使用預設的 HTTP 狀態碼 503,表示服務不可用。
儲存對這個頁面規則的修改。然後像往常一樣,我們釋出來推送這些改動。
釋出後,新的頁面規則會同步到我們所有的閘道器伺服器。
現在,新的頁面規則已經被推送到所有的閘道器叢集和伺服器。我們的配置變化不需要伺服器過載、重啟或二進位制升級,所以它非常高效且可擴充套件。
使用 wrk 測試速率限制
接下來,我們將驗證新速率限制的效果。
在終端上,我們可以透過名為 wrk 的開源工具,非常快速地傳送大量的請求。
wrk -c 50 -d 1s http://test-edge.com/
這裡我們首先使用 50 的併發級別,注意 -c 選項。
執行該命令,實際請求率約為每秒 50 個請求。這就是我們的 “Shape at” 速率。
然後我們提高併發級別,使 wrk 傳送請求的速度更快。
wrk -c 128 -d 1s http://test-edge.com/
注意 128 的併發級別。
執行!請注意,有很多被拒絕的請求返回了錯誤響應。
這次的請求速率很高,只是因為伺服器拒絕那些過度請求的速度非常快。
限制 SSL/TLS 握手的速率
除了限制請求速率,OpenResty Edge 還可以限制 HTTPS 請求的 SSL 或 TLS 握手的速率。
在這個頁面,我們可以配置 SSL 握手速率限制。開啟開關即可顯示配置引數。它們與請求速率限制功能相同——選擇一個 Key,然後設定 “Shape at” 和 “Reject at” 速率。
速率限制處理的是應用層的請求洪峰,對超量請求做軟限速或硬拒絕。它與 OpenResty Edge 的其他安全層協同工作:內建 WAF 負責過濾惡意請求——效能表現參見 OpenResty Edge WAF 與 ModSecurity 的效能基準對比;網路層的大流量攻擊則由核心中的 XDP DDoS 緩解直接攔截。
OpenResty Edge 速率限制常見問題
OpenResty Edge 速率限制如何決定限制哪些請求?
它按你選擇的 Key 進行限制。預設的 Key 是客戶端 IP 地址,因此限制會應用於每個單獨的客戶端 IP 地址;你也可以按 URI、URI 引數、請求 Cookie、X-Forwarded-For 中的地址或某個請求頭來作為 Key。
“Shape at” 和 “Reject at” 速率有甚麼區別?
“Shape at” 是軟限制:閘道器會延遲超出該速率的請求以匹配它,客戶端傳送得越快,得到的延遲就越長。“Reject at” 是硬限制:一旦客戶端超過它,閘道器會採取更積極的攔截動作,而不是等待。
超出速率限制的請求會怎樣?
你可以為硬限制選擇攔截動作:立即關閉連線、返回錯誤頁面,或返回驗證碼頁面來阻止機器人。預設的 “Error Page” 動作會返回 HTTP 狀態碼 503(服務不可用)。
OpenResty Edge 也能限制 SSL/TLS 握手的速率嗎?
可以。除了請求速率,OpenResty Edge 還能限制 HTTPS 請求的 SSL 或 TLS 握手速率,使用與請求速率限制相同的 Key、“Shape at” 和 “Reject at” 引數。
速率限制的更改需要過載或重啟伺服器嗎?
不需要。這些配置更改不需要伺服器過載、重啟或二進位制升級。你只需釋出,它就會同步到所有的閘道器叢集和伺服器。
如果你喜歡這個教程,請訂閱這個部落格網站和我們的 YouTube 頻道 或 B 站頻道。謝謝!
關於作者
章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。
章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,並編寫過 60 多個開源軟體庫。
關注我們
如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:
翻譯
我們提供了英文版原文和中譯版(本文) 。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!









































