Защита сайта от 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
-
Скачиваем сам модуль защиты:
git clone https://github.com/kyprizel/testcookie-nginx-module.git -
Скачиваем исходный код 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