bot-verifier: модуль проверки поисковых ботов для NGINX
Установка
Вы можете установить этот модуль в любом дистрибутиве на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-bot-verifier
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-bot-verifier
Включите модуль, добавив следующую строку в начало /etc/nginx/nginx.conf:
load_module modules/ngx_http_bot_verifier_module.so;
В этом документе описан nginx-module-bot-verifier v0.0.17, выпущенный 06 февраля 2026 г.
Модуль NGINX для проверки подлинности поисковых ботов с помощью обратного/прямого DNS-запроса.
Этот модуль проверяет субъекты, выдающие себя за поисковых роботов (Google, Bing, Yahoo, Baidu, Yandex), выполняя метод DNS-проверки, рекомендованный каждым поисковым провайдером. Он не позволяет злоумышленникам обходить меры безопасности путём подмены строк User-Agent ботов.
Полная замена оригинального модуля ngx_bot_verifier от Aaron Bedra.
Возможности
- Обратная/прямая DNS-проверка в соответствии с рекомендациями поисковых провайдеров
- Асинхронное разрешение DNS с использованием встроенного resolver NGINX (без блокировки)
- Кэширование в Redis с пулом соединений для минимизации накладных расходов на DNS-запросы
- Настраиваемые провайдеры — добавление собственных провайдеров ботов помимо стандартных
- Отказоустойчивая схема (fail-open) — ошибки проверки пропускают запросы, чтобы не блокировать легитимный трафик
- Поддержка реального IP через
ngx_http_realip_moduleдля развёртываний за прокси
Поддерживаемые провайдеры
Встроенные провайдеры
| Провайдер | Проверяемые домены |
|---|---|
google.com, googlebot.com |
|
| Bing | search.msn.com |
| Yahoo | yahoo.com |
| Baidu | crawl.baidu.com |
| Yandex | yandex.com, yandex.net, yandex.ru |
Пользовательские провайдеры
Добавляйте собственных провайдеров с помощью директивы bot_verifier_provider:
bot_verifier_provider facebook .facebook.com .fbcdn.net;
bot_verifier_provider apple .applebot.apple.com;
Пользовательские провайдеры проверяются в дополнение к встроенным.
Пример конфигурации
http {
# Обязательно: настройте модуль realip для доверия вашим вышестоящим прокси
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# Обязательно: настройте resolver для неблокирующих DNS-запросов
resolver 8.8.8.8 8.8.4.4 valid=300s ipv6=off;
resolver_timeout 5s;
server {
location / {
bot_verifier on;
bot_verifier_redis_host localhost;
bot_verifier_redis_port 6379;
bot_verifier_redis_expiry 3600;
# Необязательно: добавьте пользовательских провайдеров
bot_verifier_provider applebot .applebot.apple.com;
}
}
}
Директивы
bot_verifier
синтаксис: bot_verifier on|off;
по умолчанию: off
контекст: http, server, location
Включает или отключает проверку ботов. При включении запросы со строками User-Agent, соответствующими известным шаблонам ботов, проверяются через DNS-запрос.
bot_verifier_provider
синтаксис: bot_verifier_provider <name> <domain1> [domain2] ...;
по умолчанию: нет
контекст: http, server, location
Добавляет пользовательского провайдера ботов для проверки. name сопоставляется со строками User-Agent (без учёта регистра). Домены используются для проверки результата обратного DNS-запроса.
Пример:
bot_verifier_provider facebook .facebook.com .fbcdn.net;
bot_verifier_provider apple .applebot.apple.com;
bot_verifier_provider duckduckgo .duckduckgo.com;
Пользовательские провайдеры проверяются в дополнение к встроенным (Google, Bing, Yahoo, Baidu, Yandex).
bot_verifier_redis_host
синтаксис: bot_verifier_redis_host <hostname>;
по умолчанию: localhost
контекст: http, server, location
Имя хоста сервера Redis для кэширования результатов проверки.
bot_verifier_redis_port
синтаксис: bot_verifier_redis_port <port>;
по умолчанию: 6379
контекст: http, server, location
Порт сервера Redis.
bot_verifier_redis_connection_timeout
синтаксис: bot_verifier_redis_connection_timeout <milliseconds>;
по умолчанию: 10
контекст: http, server, location
Таймаут установления соединений с Redis.
bot_verifier_redis_read_timeout
синтаксис: bot_verifier_redis_read_timeout <milliseconds>;
по умолчанию: 10
контекст: http, server, location
Таймаут операций чтения из Redis.
bot_verifier_redis_expiry
синтаксис: bot_verifier_redis_expiry <seconds>;
по умолчанию: 3600
контекст: http, server, location
TTL для кэшированных результатов проверки. После истечения срока следующий запрос с того же IP запускает новую DNS-проверку.
bot_verifier_redis_database
синтаксис: bot_verifier_redis_database <number>;
по умолчанию: 0
контекст: http, server, location
Номер базы данных Redis для хранения результатов проверки.
bot_verifier_redis_password
синтаксис: bot_verifier_redis_password <password>;
по умолчанию: пусто
контекст: http, server, location
Пароль для аутентификации в Redis. Оставьте пустым, если Redis не требует аутентификации.
Асинхронное разрешение DNS
Когда настроена директива NGINX resolver, модуль выполняет DNS-запросы асинхронно с использованием встроенного resolver NGINX. Это рекомендуемая конфигурация для продакшена:
- Без блокировки — DNS-запросы не блокируют рабочие процессы NGINX
- Масштабируемость — выдерживает высокий трафик без всплесков задержки из-за DNS
- Корректные таймауты — медленные ответы DNS не влияют на другие запросы
Процесс проверки:
- Обратный DNS-запрос (запись PTR) для IP клиента
- Проверка, что полученное имя хоста заканчивается на домен известного провайдера
- Прямой DNS-запрос (запись A) для подтверждения совпадения IP
- Кэширование результата в Redis