Защита сайта от DDoS (L7) в Nginx: Настройка модуля testcookie

Защищаем сервер от умных ботов с помощью модуля testcookie. Полный гайд: от установки зависимостей и сборки .so файла до настройки белых списков для Google/Yandex. В конце — разбор частых ошибок компиляции.

Обычные методы ограничения запросов (limit_req) могут не спасти от умных ботнетов, которые имитируют поведение браузера. Модуль testcookie-nginx-module работает как фильтр: он проверяет, умеет ли клиент принимать cookies и выполнять редиректы, прежде чем пустить его к бэкенду (PHP, Python и т.д.).

Это эффективный способ отсеять простых ботов на уровне Nginx, не нагружая приложение.

Важно: Инструкция подразумевает, что у вас Debian или Ubuntu. Для CentOS команды установки пакетов будут отличаться (yum/dnf).


Шаг 1. Подготовка окружения

Нам нужно скомпилировать модуль именно для вашей текущей версии Nginx. Сначала узнаем её и параметры сборки:

nginx -V

Сохраните вывод этой команды в текстовый файл — он нам понадобится.

Установите необходимые инструменты для компиляции:

sudo apt-get update
sudo apt-get install -y build-essential libxml2-dev libxslt-dev libgd-dev libgeoip-dev libpcre3-dev libssl-dev git

Шаг 2. Скачивание исходников

Переходим в папку для исходников:

cd /usr/src
  1. Скачиваем сам модуль защиты:

    git clone https://github.com/kyprizel/testcookie-nginx-module.git
    
  2. Скачиваем исходный код Nginx (версия должна строго совпадать с той, что вы увидели в nginx -V):

    # Замените 1.24.0 на вашу версию!
    wget http://nginx.org/download/nginx-1.24.0.tar.gz
    tar -xzvf nginx-1.24.0.tar.gz
    cd nginx-1.24.0/
    

Шаг 3. Сборка динамического модуля

Нам не нужно пересобирать весь Nginx целиком (хотя это возможно). Мы соберем только динамический модуль .so.

Возьмите все аргументы из вывода nginx -V (начинаются с --prefix=... и до конца) и добавьте к ним в конец:
--add-dynamic-module=/usr/src/testcookie-nginx-module

Команда будет выглядеть примерно так:

./configure --prefix=/etc/nginx ... (ваши аргументы) ... --add-dynamic-module=/usr/src/testcookie-nginx-module

После успешного конфигурирования запустите сборку модулей:

make modules

В папке objs/ появится файл ngx_http_testcookie_access_module.so. Скопируйте его в папку модулей Nginx:

cp objs/ngx_http_testcookie_access_module.so /usr/lib/nginx/modules/

Шаг 4. Подключение модуля

Откройте основной конфиг /etc/nginx/nginx.conf и в самом начале файла (глобальная область, до http) добавьте:

load_module modules/ngx_http_testcookie_access_module.so;

Проверьте, что модуль загружается корректно:

nginx -t

Если ошибок нет — идем дальше.


Шаг 5. Настройка защиты

Логику защиты лучше вынести в отдельные файлы, чтобы не загромождать основной конфиг.

1. Генерация секретных ключей

Сгенерируйте случайные хеши для шифрования cookies:

echo "my_secret_salt" | md5sum
# Пример вывода: 60dfc1df138fe8e01579587a404eaa0b

2. Общие настройки (nginx.conf)

В блок http { ... } добавьте:

testcookie off;            # По умолчанию выключено
testcookie_name ddos_chk;  # Имя cookie
testcookie_secret 60dfc1df138fe8e01579587a404eaa0b; # Ваш хеш 1
testcookie_session $remote_addr;
testcookie_arg label_d34a804b22b5a9e378d6a2e04e9dd58b; # Ваш хеш 2 (метку 'label_' можно сменить)
testcookie_max_attempts 3;
testcookie_get_only on;    # Проверять только GET-запросы (POST пропускать с осторожностью)
testcookie_redirect_via_refresh on;

# Подключаем белые списки (создадим ниже)
include /etc/nginx/testcookie_whitelist.conf;

3. Файл очистки URL (/etc/nginx/testcookie_rewrites.conf)

Этот конфиг нужен, чтобы убирать "мусорные" метки из адресной строки после успешной проверки. Создайте файл:

set $do_rewrite 0;

# Если у пользователя уже есть валидная cookie
if ($http_cookie ~ "ddos_chk=[0-9a-f]+") {
    set $do_rewrite 1;
}

# И если в URL есть наша проверочная метка
if ($args ~ "^((.*)(label_d34a804b22b5a9e378d6a2e04e9dd58b&|&label_d34a804b22b5a9e378d6a2e04e9dd58b(.*))|label_d34a804b22b5a9e378d6a2e04e9dd58b)$") {
    set $target "$2$4";
    set $do_rewrite "1${do_rewrite}";
}

# То делаем редирект на чистый URL
if ($do_rewrite = 11) {
    set $args $target;
    rewrite ^.*$ $scheme://$host$uri permanent;
}

4. Белые списки (/etc/nginx/testcookie_whitelist.conf)

Критически важно: добавьте сюда IP-адреса поисковых роботов (Google, Yandex), платежных систем и ваших мониторингов, иначе они не попадут на сайт.

testcookie_whitelist {
    # Локальная сеть
    127.0.0.1/32;
    
    # Yandex Nets (пример)
    77.88.0.0/18;
    87.250.224.0/19;
    
    # Google (лучше использовать geoip или обновляемые списки)
    66.249.64.0/19;
}

Шаг 6. Активация на сайте

В конфиге вашего сайта (/etc/nginx/sites-available/yoursite.com) внутри блока server включите защиту:

server {
    listen 80;
    server_name example.com;

    # Подключаем логику рерайтов
    include /etc/nginx/testcookie_rewrites.conf;

    location / {
        # Включаем модуль
        testcookie on;
        
        # Стандартные прокси-заголовки
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Примените настройки:

nginx -t
systemctl reload nginx

Теперь при первом заходе на сайт пользователь увидит мгновенный редирект (или страницу-заглушку, если настроить testcookie_refresh_template), получит cookie и дальше будет пользоваться сайтом как обычно. Боты, не умеющие сохранять cookies, застрянут на первом этапе.

Возможные ошибки при компиляции (Troubleshooting)

Если на этапе ./configure вы видите ошибки, значит, в системе не хватает библиотек для разработки (-dev пакетов).

Ошибка: the HTTP rewrite module requires the PCRE library.
Решение:

  • Debian/Ubuntu: apt install libpcre3-dev
  • CentOS: yum install pcre-devel

Ошибка: SSL modules require the OpenSSL library.
Решение:

  • Debian/Ubuntu: apt install libssl-dev
  • CentOS: yum install openssl-devel

Ошибка: the GeoIP module requires the GeoIP library.
Решение:

  • Debian/Ubuntu: apt install libgeoip-dev
  • CentOS: yum install GeoIP-devel

Ошибка: the HTTP XSLT module requires the libxml2/libxslt libraries.
Решение:

  • Debian/Ubuntu: apt install libxml2-dev libxslt1-dev
  • CentOS: yum install libxslt-devel

Read more

Подключение к удалённому серверу по SSH из Windows (CMD, PowerShell, WSL, PuTTY)

Гайд по SSH-клиентам в Windows: используем встроенную команду `ssh` в PowerShell/CMD (Windows 10/11), полноценный Linux-терминал через WSL или классический PuTTY. Примеры команд для подключения, отправки скриптов и использования sudo без tty.

By Evgeny Shmelev

Включение/отключение Windows ПК через Home Assistant (Wake-on-LAN + RPC Shutdown)

Создаём единый переключатель в Home Assistant для управления Windows-компьютером. Включение через стандартный Wake-on-LAN, выключение через аддон RPC Shutdown. Инструкция по правке реестра Windows для удалённого выключения.

By Evgeny Shmelev