速率限制是緩解 DDoS 攻擊的最有效技術之一。在其變體中,按 IP 速率限制 因其有針對性的方法而脫穎而出:它根據每個客戶端的 IP 位址單獨強制執行請求限制。這可以防止任何單一使用者壓垮伺服器,同時為合法使用者保持公平的存取等級。
在本文中,我們將介紹每個 IP 速率限制的工作原理、為什麼它是阻止 DDoS 攻擊的最佳策略之一,以及如何使用速率套件在 Go 中實現它。
為什麼要進行速率限制
速率限制被廣泛使用,因為它平衡了安全性和可用性。這就是為什麼它是首選方法:
-
高效率的資源管理:
透過限制每個客戶端的請求數量,即使在攻擊期間,伺服器也可以避免不堪負荷。
-
公平性:
合法用戶可以繼續存取伺服器,而惡意用戶端則受到限制。
-
可自訂:
可以根據使用案例調整速率限制,例如公用 API 與私有服務的不同限制。
-
可擴充性:
速率限制機制可以很好地適應現代基礎設施,特別是與負載平衡器或反向代理結合使用時。
它與其他技術相比如何
-
防火牆規則:
根據預定義的規則在網路層級阻止流量。雖然對於大規模過濾有效,但它的靈活性較差,並且可能會在誤報期間阻止合法用戶。
-
內容傳遞網路 (CDN):
跨多個伺服器分配流量。雖然 CDN 對於減少 DDoS 的影響很有幫助,但它並不能解決應用程式層級的濫用流量問題。
-
工作證明(PoW):
要求客戶端在存取伺服器之前解決計算難題。有效,但會增加合法用戶的延遲,並可能佔用客戶端的資源。
-
速率限制:
提供細粒度的控制,可擴展性良好,並且不會增加大量開銷。它通常是保護應用程式級端點的最佳選擇。
實作
在每個 IP 速率限制中,為每個客戶端 IP 維護一個單獨的限制器。以下是如何使用 golang.org/x/time/rate 套件來實現它。
第 1 步:安裝所需的軟體包
費率包是Go擴充模組的一部分。安裝它:
狂歡
去取得 golang.org/x/time/rate
第 2 步:寫出每個 IP 速率限制器
走
主包
導入(
)
var (
)
// getVisitor 檢索給定 IP 的速率限制器,如果不存在則建立一個。
func getVisitor(ip string) *rate.Limiter {
}
//rateLimitedHandler 應用每個 IP 的速率限制
funcrateLimitedHandler(w http.ResponseWriter, r *http.Request) {
}
func main() {
}
說明
-
訪客地圖:
為每個 IP 位址維護一個速率限制器。訪客地圖包含這些限制器,由 IP 位址 (r.RemoteAddr) 鍵入。當請求傳入時,getVisitor 函數會檢查該 IP 是否已存在限制器。
-
限制器建立:
每個限制器允許每秒 1 個請求,突發容量為 5。如果不存在,則會使用特定規則(每秒 1 個請求,突發容量為 5)建立新的限制器。限制器允許一些初始突發請求,但此後強制執行穩定的速率。
-
自動清理:
Goroutine 在 1 分鐘後清理空閒限制器以節省記憶體。為了防止記憶體增長,程式碼包含一個清理機制。每當建立新的限制器時,就會啟動 goroutine,並等待 1 分鐘的不活動狀態,然後從訪客對映中刪除對應的條目。這確保了限制器只保留給活躍的客戶端。
-
速率限制邏輯:
處理程序檢查限制器是否允許該請求。 如果請求超出定義的限制,則會傳回 429 Too Many Requests 錯誤;否則,它會處理該請求。
Go 中的每 IP 速率限制是在應用程式層級減輕 DDoS 攻擊的絕佳方法。它提供對流量的精確控制,確保合法用戶可以存取您的服務,同時有效限制惡意用戶。
這種方法可以有效地限制濫用 IP,而不影響合法用戶,為緩解 DDoS 攻擊提供可擴展且高效內存的解決方案。
以上是如何透過速率限制來阻止 Go 中的 DDoS 攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!