Rate limiting is one of the most effective techniques to mitigate DDoS attacks. Among its variations, per-IP rate limiting stands out for its targeted approach: it enforces request limits individually for each client, based on their IP address. This prevents any single user from overwhelming the server while maintaining a fair level of access for legitimate users.
In this article, we’ll cover how per-IP rate limiting works, why it is one of the best strategies to stop DDoS attacks, and how to implement it in Go using the rate package.
Rate limiting is widely used because it balances security and usability. Here’s why it’s a preferred approach:
In per-IP rate limiting, a separate limiter is maintained for each client IP. Here’s how to implement it using the golang.org/x/time/rate package.
The rate package is part of Go’s extended modules. Install it with:
bash
go get golang.org/x/time/rate
go
package main
import (
`"fmt"` `"net/http"` `"sync"` `"time"` `"golang.org/x/time/rate"`
)
var (
`mu sync.Mutex` `visitors = make(map[string]*rate.Limiter)`
)
// getVisitor retrieves the rate limiter for a given IP, creating one if it doesn't exist.
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 applies the per-IP rate limit
func rateLimitedHandler(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)`
}
Per-IP rate limiting in Go is an excellent way to mitigate DDoS attacks at the application level. It provides precise control over traffic, ensuring that legitimate users can access your service while malicious users are effectively throttled.
This approach efficiently throttles abusive IPs without impacting legitimate users, offering a scalable and memory-efficient solution for mitigating DDoS attacks.
The above is the detailed content of How to Stop DDoS Attacks in Go with Rate Limiting. For more information, please follow other related articles on the PHP Chinese website!