Перейти к содержанию

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 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 не влияют на другие запросы

Порядок проверки:

  1. Обратный DNS-запрос (запись PTR) для IP клиента
  2. Проверка, что разрешённое имя хоста заканчивается известным доменом провайдера
  3. Прямой DNS-запрос (запись A) для подтверждения соответствия IP
  4. Кэширование результата в Redis

Экспериментальный локальный наблюдатель Web Bot Auth

Опциональный наблюдатель Ed25519 может сообщать о валидности HTTP Message Signature, используя локальный реестр ключей, проверяемый оператором. По умолчанию он отключён и не изменяет существующее принудительное применение DNS/кэша. Он не выполняет сетевого обнаружения ключей и не обеспечивает авторизацию или защиту от повторного воспроизведения. См. ограниченный поддерживаемый профиль, конфигурацию и тесты. Доработка каркаса качества намеренно оговорена; полная сертификация каркаса или публичные подтверждённые доказательства не заявляются.

Быстрая герметичная проверка при разработке: make test-l1 (без nginx, Redis и сети).