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.18, выпущенный 27 октября 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 facebookexternalhit fbsv.net;
bot_verifier_provider applebot 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 facebookexternalhit fbsv.net;
bot_verifier_provider applebot applebot.apple.com;
Домен совпадает с самим именем хоста обратного DNS-запроса или любым его поддоменом: fbsv.net совпадает с fwdproxy-prn-020.fbsv.net, но не с evilfbsv.net. Ведущие и завершающие точки игнорируются, а сопоставление не учитывает регистр, поэтому .fbsv.net эквивалентно fbsv.net (до версии 0.0.18 ведущая точка приводила к тому, что домен не совпадал ни с чем). Домен, состоящий только из точек, является ошибкой конфигурации.
Превью ссылок Meta и WhatsApp: робот Meta facebookexternalhit (превью Facebook, Instagram, Messenger) при обратном DNS-запросе разрешается в fbsv.net, поэтому приведённый выше пример его покрывает. Превью WhatsApp загружаются с собственного устройства отправителя с обычного мобильного IP, поэтому они не могут быть проверены через DNS. Не добавляйте провайдера для User-Agent WhatsApp, иначе каждое превью будет заблокировано.
Пользовательские провайдеры проверяются в дополнение к встроенным (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. Это рекомендуемая конфигурация для production:
- Без блокировки — DNS-запросы не блокируют рабочие процессы NGINX
- Масштабируемость — выдерживает высокую нагрузку без всплесков задержки из-за DNS
- Корректные тайм-ауты — медленные ответы DNS не влияют на другие запросы
Порядок проверки:
- Обратный DNS-запрос (запись PTR) для IP клиента
- Проверка, что разрешённое имя хоста заканчивается известным доменом провайдера
- Прямой DNS-запрос (запись A) для подтверждения соответствия IP
- Кэширование результата в Redis
Экспериментальный локальный наблюдатель Web Bot Auth
Опциональный наблюдатель Ed25519 может сообщать о валидности HTTP Message Signature, используя локальный реестр ключей, проверяемый оператором. По умолчанию он отключён и не изменяет существующее принудительное применение DNS/кэша. Он не выполняет сетевого обнаружения ключей и не обеспечивает авторизацию или защиту от повторного воспроизведения. См. ограниченный поддерживаемый профиль, конфигурацию и тесты. Доработка каркаса качества намеренно оговорена; полная сертификация каркаса или публичные подтверждённые доказательства не заявляются.
Быстрая герметичная проверка при разработке: make test-l1 (без nginx, Redis и сети).