Какие подходы и инструменты в Go можно использовать для базовой защиты веб-сервера от DDoS-атак?

Ответ

Хотя полноценная защита от 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-атак.