速率限制是缓解 DDoS 攻击的最有效技术之一。在其变体中,按 IP 速率限制 因其有针对性的方法而脱颖而出:它根据每个客户端的 IP 地址单独强制执行请求限制。这可以防止任何单个用户压垮服务器,同时为合法用户保持公平的访问级别。
在本文中,我们将介绍每个 IP 速率限制的工作原理、为什么它是阻止 DDoS 攻击的最佳策略之一,以及如何使用速率包在 Go 中实现它。
速率限制被广泛使用,因为它平衡了安全性和可用性。这就是为什么它是首选方法:
在每个 IP 速率限制中,为每个客户端 IP 维护一个单独的限制器。以下是如何使用 golang.org/x/time/rate 包来实现它。
费率包是Go扩展模块的一部分。安装它:
狂欢
去获取 golang.org/x/time/rate
走
主包
导入(
`"fmt"` `"net/http"` `"sync"` `"time"` `"golang.org/x/time/rate"`
)
var (
`mu sync.Mutex` `visitors = make(map[string]*rate.Limiter)`
)
// getVisitor 检索给定 IP 的速率限制器,如果不存在则创建一个。
func getVisitor(ip string) *rate.Limiter {
`mu.Lock()` `defer mu.Unlock()` `limiter, exists := visitors[ip]` `if !exists {` `limiter = rate.NewLimiter(1, 5) // 1 request/second, burst of 5` `visitors[ip] = limiter` `// Clean up limiter after 1 minute of inactivity` `go func() {` `time.Sleep(1 * time.Minute)` `mu.Lock()` `delete(visitors, ip)` `mu.Unlock()` `}()` `}` `return limiter`
}
//rateLimitedHandler 应用每个 IP 的速率限制
funcrateLimitedHandler(w http.ResponseWriter, r *http.Request) {
`ip := r.RemoteAddr` `limiter := getVisitor(ip)` `if !limiter.Allow() {` `http.Error(w, "Too many requests. Please try again later.", http.StatusTooManyRequests)` `return` `}` `fmt.Fprintln(w, "Request successful.")`
}
func main() {
`http.HandleFunc("/", rateLimitedHandler)` `fmt.Println("Starting server on :8080")` `http.ListenAndServe(":8080", nil)`
}
Go 中的每 IP 速率限制是在应用程序级别减轻 DDoS 攻击的绝佳方法。它提供对流量的精确控制,确保合法用户可以访问您的服务,同时有效限制恶意用户。
这种方法可以有效地限制滥用 IP,而不影响合法用户,为缓解 DDoS 攻击提供可扩展且高效内存的解决方案。
以上是如何通过速率限制来阻止 Go 中的 DDoS 攻击的详细内容。更多信息请关注PHP中文网其他相关文章!