Ответ
Хотя полноценная защита от DDoS требует специализированных инфраструктурных решений, на уровне приложения в Go можно реализовать несколько эффективных мер для смягчения атак.
1. Ограничение частоты запросов (Rate Limiting)
Это основной механизм для борьбы с флудом. Он ограничивает количество запросов, которое клиент может сделать за определенный промежуток времени. Для этого удобно использовать пакет golang.org/x/time/rate
.
import "golang.org/x/time/rate"
// 10 запросов в секунду с возможностью "всплеска" до 20
limiter := rate.NewLimiter(10, 20)
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !limiter.Allow() {
http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)
return
}
// ... обработка запроса
})
Для большей эффективности лимитер нужно создавать на основе IP-адреса клиента.
2. Установка таймаутов
Таймауты защищают от атак типа "Slowloris", когда злоумышленник устанавливает множество медленных соединений, исчерпывая ресурсы сервера. В http.Server
важно настраивать:
ReadTimeout
: Максимальное время на чтение всего запроса, включая тело.WriteTimeout
: Максимальное время на запись ответа.IdleTimeout
: Время, в течение которого открытое keep-alive соединение может простаивать.
srv := &http.Server{
Addr: ":8080",
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 60 * time.Second,
}
3. Ограничение количества одновременных соединений
Можно ограничить общее число активных соединений с помощью семафора (реализованного на буферизованном канале), чтобы предотвратить исчерпание файловых дескрипторов.
// Ограничиваем до 100 одновременных обработок
var connLimiter = make(chan struct{}, 100)
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
connLimiter <- struct{}{}
defer func() { <-connLimiter }()
// ... обработка запроса
})
Внешние уровни защиты
Важно помнить, что защита на уровне приложения — это лишь один из рубежей. Для надежной защиты необходимы:
- Reverse Proxy (Nginx, HAProxy): Могут выполнять rate limiting и кэширование до того, как запрос дойдет до Go-приложения.
- Firewall (iptables, nftables): Блокировка трафика с подозрительных IP на уровне ОС.
- Специализированные сервисы (Cloudflare, Akamai): Предоставляют глобальную сеть для фильтрации вредоносного трафика еще до того, как он достигнет вашей инфраструктуры. Это самый эффективный метод против масштабных DDoS-атак.