
Автоматизируйте блокировку доступа вредоносных ботов к вашему серверу
TUI, веб-консоль и CLI, которые помогают настроить ваш сервер для блокировки нежелательных ботов без необходимости прятаться за CDN.
Он работает вместе с NGINX и вашим существующим межсетевым экраном (nftables или iptables):

Приложение старается изо всех сил не заблокировать вам доступ к серверу, но вы используете его на свой риск. И учтите, что оно лицензировано под AGPL, поэтому если вы используете его коммерчески, убедитесь, что вы соблюдаете лицензию.
В Debian или Ubuntu, из репозитория APT:
curl -fsSL https://ivankovic.github.io/stop-bots/key.gpg \
| sudo tee /usr/share/keyrings/stop-bots.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/stop-bots.gpg] \
https://ivankovic.github.io/stop-bots stable main" \
| sudo tee /etc/apt/sources.list.d/stop-bots.list
sudo apt update && sudo apt install stop-bots
Пакет предоставляет man stop-bots (и страницу для каждой команды, например man stop-bots-batch), а также
автодополнение для bash, zsh и fish. Он не устанавливает службы и ничего не запускает.
Или из crates.io, с Rust 1.88 или новее:
cargo install stop-bots
Или скачайте статический бинарник для x86_64 или aarch64 Linux со страницы GitHub
releases.
install отказывается
работать на хосте, который не является Debian или его производной.nft, или iptables-restore и ip6tables-restore, для
файрвола; nginx для всего остального. NGINX в контейнере тоже работает — см.
Запуск NGINX в контейнере.sudo stop-bots запускает TUI. Требуются права root: он перезаписывает /etc/nginx и загружает правила
файрвола.u скачивает все списки: списки ботов, диапазоны IP краулеров и любые фиды или страны, которые вы
включили.1) содержит общехостовую политику: какие категории ботов блокируются,
страны и детекторы, которые читают ваши логи. На экране NGINX (4) клавиша r находит ваши
сайты. Экран Blocks (5) перечисляет каждое правило, добавленное детекторами или вами, и почему.a применяет всё. Сначала он показывает, что изменится — файлы, добавленные и
удалённые правила, а также вердикт проверки блокировки (d для diff) — и запрашивает подтверждение.sudo stop-bots install firewall делает применённые правила переживающими перезагрузку. Без этого
после перезагрузки не останется никаких правил.sudo stop-bots status проверяет ядро, юниты и файлы и сообщает, что
отсутствует.sudo stop-bots status
sudo stop-bots batch --dry-run --diff
sudo stop-bots batch --apply
sudo stop-bots install firewall
sudo stop-bots status
batch --dry-run ничего не скачивает и не сканирует: при совершенно новой установке он показывает
блоки NGINX из встроенного в бинарник списка ботов, и пока никаких правил фаервола, потому что ничего
не было прочитано из ваших логов. sudo stop-bots batch без --apply выполняет скачивание
и сканирование и записывает файлы для проверки, не применяя их. См.
Unattended, from cron о том, что делает batch.
sudo stop-bots uninstall all --dry-run
sudo stop-bots uninstall all
Первый перечисляет каждый шаг, второй их выполняет. См. Обновление и удаление.
Известные боты, по категориям (сканер / поисковая система / ИИ-краулер), из
ArcJet's Well-Known Bots,
ai.robots.txt и
NGINX Ultimate Bad Bot Blocker
списка. Блокировка категории внедряет правило if ($http_user_agent ...) в конфигурацию NGINX
каждого сайта.
Слишком много запросов, через собственное ограничение скорости NGINX.
Сначала вежливо — сгенерированный robots.txt, перечисляющий каждого бота, которого вы блокируете, для
краулеров, которые его соблюдают, плюс путь-приманка ниже.
Кроме случаев, когда вы указываете иначе — исключения путей для каждого сайта, а также доверенные адреса и
user agents (trust), к которым не применяется ни один блок, список или ограничение скорости.
Запросы, которые не выглядят как браузер, для каждого сайта. Шесть независимых правил, каждое со своим переключателем и каждое по умолчанию выключено — один переключатель на правило, чтобы если что-то из вашего перестанет работать, вы могли определить, какое правило это сделало:
| Правило | Отклоняет, помимо ботов |
|---|---|
| HTTP/1.0 и HTTP/1.1 | краулеры и API-клиенты, которые не говорят на HTTP/2 |
Нет заголовка Accept | некоторые API-клиенты не отправляют его |
Нет Accept-Language | инструменты приватности удаляют его |
Пустой/отсутствующий User-Agent | скрипты и проверки работоспособности часто опускают его |
Host — это голый IP | ломает доступ к сайту по IP |
| TLS 1.0 / 1.1 | только очень старые клиенты |
Есть семь вариантов:
| Вариант | Для чего он |
|---|---|
403 Forbidden (по умолчанию) | говорит, что блокировка была намеренной; единственный, на который ошибочно пойманный человек может отреагировать |
404 Not Found | скрывает, что что-либо было заблокировано вообще |
410 Gone | просит благовоспитанных краулеров удалить URL навсегда — предпочитайте это вместо 403, когда вы отклоняете краулеров, а не атакующих |
429 Too Many Requests | говорит вежливому клиенту отступить и повторить попытку |
418 I'm a teapot | шутка из RFC 2324. Она работает; просто не зарегистрирована в IANA, и NGINX отправляет её с пустым телом |
444 close connection | вообще нет ответа; самый дешёвый, но неотличим от того, что сервер не работает |
Tarpit | отвечает 403, но выдаёт тело по одному байту в секунду, так что клиент ждёт вместо того, чтобы двигаться дальше |