首页 > 后端开发 > Golang > 如何通过速率限制来阻止 Go 中的 DDoS 攻击

如何通过速率限制来阻止 Go 中的 DDoS 攻击

DDD
发布: 2024-11-30 01:22:13
原创
991 人浏览过

How to Stop DDoS Attacks in Go with Rate Limiting

速率限制是缓解 DDoS 攻击的最有效技术之一。在其变体中,按 IP 速率限制 因其有针对性的方法而脱颖而出:它根据每个客户端的 IP 地址单独强制执行请求限制。这可以防止任何单个用户压垮服务器,同时为合法用户保持公平的访问级别。

在本文中,我们将介绍每个 IP 速率限制的工作原理、为什么它是阻止 DDoS 攻击的最佳策略之一,以及如何使用速率包在 Go 中实现它。

为什么要进行速率限制

速率限制被广泛使用,因为它平衡了安全性和可用性。这就是为什么它是首选方法:

  1. 高效的资源管理: 通过限制每个客户端的请求数量,即使在攻击期间,服务器也可以避免不堪重负。
  2. 公平性: 合法用户可以继续访问服务器,而恶意客户端则受到限制。
  3. 可定制: 可以根据使用案例调整速率限制,例如公共 API 与私有服务的不同限制。
  4. 可扩展性: 速率限制机制可以很好地适应现代基础设施,特别是与负载均衡器或反向代理结合使用时。

它与其他技术相比如何

  1. 防火墙规则: 根据预定义的规则在网络级别阻止流量。虽然对于大规模过滤有效,但它的灵活性较差,并且可能会在误报期间阻止合法用户。
  2. 内容交付网络 (CDN): 跨多个服务器分配流量。虽然 CDN 对于减少 DDoS 的影响很有帮助,但它并不能解决应用程序级别的滥用流量问题。
  3. 工作证明(PoW): 要求客户端在访问服务器之前解决计算难题。有效,但会增加合法用户的延迟,并且可能会占用客户端的资源。
  4. 速率限制: 提供细粒度的控制,可扩展性良好,并且不会增加大量开销。它通常是保护应用程序级端点的最佳选择。

实施

在每个 IP 速率限制中,为每个客户端 IP 维护一个单独的限制器。以下是如何使用 golang.org/x/time/rate 包来实现它。

第 1 步:安装所需的软件包

费率包是Go扩展模块的一部分。安装它:

狂欢

去获取 golang.org/x/time/rate

第 2 步:编写每个 IP 速率限制器

主包

导入(

`"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)`
登录后复制

}

说明

  1. 访客地图: 为每个 IP 地址维护一个速率限制器。访客地图包含这些限制器,由 IP 地址 (r.RemoteAddr) 键入。当请求传入时,getVisitor 函数会检查该 IP 是否已存在限制器。
  2. 限制器创建: 每个限制器允许每秒 1 个请求,突发容量为 5。如果不存在,则会使用特定规则(每秒 1 个请求,突发容量为 5)创建一个新的限制器。限制器允许一些初始突发请求,但此后强制执行稳定的速率。
  3. 自动清理: Goroutine 在 1 分钟后清理空闲限制器以节省内存。为了防止内存增长,代码包含一个清理机制。每当创建新的限制器时,就会启动 goroutine,并等待 1 分钟的不活动状态,然后从访问者映射中删除相应的条目。这确保了限制器只保留给活跃的客户端。
  4. 速率限制逻辑: 处理程序检查限制器是否允许该请求。 如果请求超出定义的限制,则会返回 429 Too Many Requests 错误;否则,它会处理该请求。

Go 中的每 IP 速率限制是在应用程序级别减轻 DDoS 攻击的绝佳方法。它提供对流量的精确控制,确保合法用户可以访问您的服务,同时有效限制恶意用户。

这种方法可以有效地限制滥用 IP,而不影响合法用户,为缓解 DDoS 攻击提供可扩展且高效内存的解决方案。

以上是如何通过速率限制来阻止 Go 中的 DDoS 攻击的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板