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

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

Процесс проверки:

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