Подключение
Список для файрвола и fail2ban
Как закрыть повторяющиеся адреса ботов на самом сервере — в ipset, nginx, .htaccess или через fail2ban, — что попадает в список, чего в нём не бывает и как поставить автообновление.
Модуль BotBan работает внутри PHP. Чтобы он показал боту страницу блокировки, сервер уже должен принять запрос и запустить PHP. Это намного дешевле, чем отдать страницу сайта, но не бесплатно: на одном из сайтов заблокированный запрос стоит серверу около 34 мс процессора против 87 мс у обычного.
Адрес, который возвращается снова и снова, можно закрыть раньше — в файрволе или веб-сервере. Тогда PHP не запускается вовсе. Для этого есть два инструмента: готовый список адресов и журнал для fail2ban.
Что попадает в список
- Записи вашего чёрного списка — адреса и сети, как вы их записали.
- Адреса, которые движок за сутки не меньше трёх раз блокировал как программу: сканер, библиотека вместо браузера, поиск файлов с секретами, ловушка, браузер под управлением программы.
Через двое суток без блокировок адрес из списка уходит сам. В списке не больше 5 тысяч записей, самые назойливые — первыми.
Чего в списке не бывает
У адреса, закрытого на сервере, нет ни страницы проверки, ни кнопки «Я человек»: соединение просто обрывается. Ошибка здесь стоит дороже, чем ошибка модуля, поэтому в список не идут:
- блокировки «по сумме признаков» — такому посетителю положена кнопка «Я человек»;
- адреса, заблокированные только за то, что они из сети хостинга: через VPN ходят люди;
- общие адреса мобильных операторов, операторский NAT и CDN;
- сети поисковых систем — даже если они есть в вашем чёрном списке: подтверждённого робота модуль пропускает, а файрвол закрыл бы и его;
- ваш белый список и записи чёрного списка, которые с ним пересекаются;
- адреса, с которых за последние сутки приходил хоть кто-то похожий на человека;
- адреса роботов, которых вы пускаете на сайт. Один и тот же робот бывает и пропущен, и заблокирован — например, когда идёт по ссылке-ловушке; файрвол закрыл бы его целиком.
Какие записи чёрного списка не попали в список и почему, написано в карточке. На сайте они работают как обычно — через модуль.
Пока сайт в режиме наблюдения или на обучении, список пуст: если защита никого не останавливает на сайте, закрывать адреса на сервере рано.
Где взять
Страница сайта → «Адреса ботов» → карточка «Список для сервера и
файрвола». Четыре формата: ipset, nginx, .htaccess и просто адреса по
одному в строке.
Скачанный вручную файл быстро устареет: список меняется каждые несколько минут. На своём сервере ставьте обновление по расписанию.
Свой сервер: ipset
Самый дешёвый способ: пакет от закрытого адреса отбрасывает ядро, до
веб-сервера он не доходит. Нужны права root, ipset, iptables и curl.
- В разделе «Аккаунт» выпустите токен API — хватит доступа только на
чтение. Адрес списка со страницы «Адреса ботов» скопируйте без
?format=…. - Поставьте скрипт обновления:
curl -fsSL https://botban.ru/v1/firewall.sh -o /usr/local/bin/botban-firewall
chmod 755 /usr/local/bin/botban-firewall
- Запишите настройки в
/etc/botban-firewall.confи закройте файл от чужих глаз (chmod 600 /etc/botban-firewall.conf):
BOTBAN_URL="https://botban.ru/api/v1/sites/ИДЕНТИФИКАТОР-САЙТА/firewall"
BOTBAN_TOKEN="bb_api_..."
BOTBAN_MODE="ipset"
- Запустите один раз руками и посмотрите, что получилось:
botban-firewall && ipset list botban | head -n 12
- Поставьте в расписание — файл
/etc/cron.d/botban-firewall:
*/10 * * * * root /usr/local/bin/botban-firewall
@reboot root sleep 30 && /usr/local/bin/botban-firewall
Скрипт заводит наборы botban (IPv4) и botban6 (IPv6) и одно правило в
цепочке INPUT: соединения с этих адресов на порты 80 и 443 отбрасываются.
Вторая строка расписания нужна потому, что после перезагрузки сервера
наборы и правило пропадают.
Настройки на особые случаи:
BOTBAN_PORTS="80,443,8080"— другие порты;BOTBAN_CHAIN="DOCKER-USER"— если сайт работает в Docker: мимоINPUTтакие соединения проходят;BOTBAN_RULE="no"— правило ставите сами (ufw, nftables, свой набор правил), скрипт только наполняет наборы.
Свой сервер: nginx
Если файрвол трогать не хочется, список можно отдать nginx: он ответит 403
сам, не запуская PHP. В настройках укажите BOTBAN_MODE="nginx", запустите
скрипт один раз — он создаст файл /etc/nginx/botban-deny.conf, — и
подключите файл внутри server { } или http { }:
include /etc/nginx/botban-deny.conf;
Дальше — то же расписание. Скрипт перезагружает nginx, только когда список
изменился, и только после nginx -t: если проверка не прошла, возвращается
прежний файл.
Виртуальный хостинг: .htaccess
На виртуальном хостинге файрвола и настроек nginx у вас нет — остаётся
.htaccess. Скачайте формат «.htaccess» и вставьте блок между
# BEGIN BotBan и # END BotBan в самое начало файла .htaccess в корне
сайта. Нужен Apache 2.4 с mod_rewrite — он есть почти везде, где работает
CMS.
Здесь два ограничения. В блок идёт не больше 300 записей: Apache
перечитывает .htaccess на каждый запрос, и длинный список замедлил бы
сайт. И обновлять его придётся руками — раз в день-два скачать заново и
заменить блок целиком. Автоматически переписывать .htaccess мы не
советуем: ошибка в этом файле кладёт весь сайт.
fail2ban: без списка, сразу по журналу
Список обновляется раз в несколько минут. fail2ban реагирует за секунды: модуль пишет адрес в файл, fail2ban закрывает его в файрволе. Нужны свой сервер и модуль 1.4.9 или новее.
- Заведите каталог для журнала, доступный пользователю, от которого
работает PHP (обычно
www-data), — вне каталога сайта:
mkdir -p /var/log/botban
chown www-data:adm /var/log/botban
chmod 750 /var/log/botban
- Добавьте настройку в подключение модуля:
BotBan::protect('bb_pk_...', 'bb_sk_...', [
'ban_log' => '/var/log/botban/ban.log',
]);
- Фильтр — файл
/etc/fail2ban/filter.d/botban.conf:
[Definition]
failregex = ^\s*botban ban <ADDR>\s*$
datepattern = ^%%Y-%%m-%%dT%%H:%%M:%%S%%z
- Правило — файл
/etc/fail2ban/jail.d/botban.conf:
[botban]
enabled = true
filter = botban
logpath = /var/log/botban/ban.log
maxretry = 3
findtime = 600
bantime = 3600
port = http,https
- Чтобы журнал не рос, файл
/etc/logrotate.d/botban:
/var/log/botban/ban.log {
weekly
rotate 4
missingok
notifempty
create 0640 www-data adm
}
- Перечитайте настройки и проверьте:
fail2ban-client reload, затемfail2ban-client status botban.
В журнал модуль пишет не каждую блокировку, а только ту, что сервис
пометил как пригодную для файрвола — по тем же правилам, что и список.
Строка выглядит так: 2026-10-02T15:04:05+00:00 botban ban 203.0.113.7.
С такими настройками адрес закрывается на час после трёх блокировок за
десять минут.
Что выбрать
- Свой сервер — ipset по расписанию и, если есть fail2ban, журнал. Они дополняют друг друга: список закрывает известных, fail2ban — тех, кто пришёл только что.
- Свой сервер без желания трогать файрвол — nginx.
- Виртуальный хостинг —
.htaccess, для самых назойливых адресов.
Чего от этого ждать не стоит
- Это не защита от DDoS. Атаку, которая забивает канал, гасит только провайдер. Здесь речь о том, чтобы повторяющиеся боты не тратили процессор сервера.
- Рой с неповторяющимися адресами список не ловит. Если с адреса приходит один-два запроса, трёх блокировок он не наберёт. Таких останавливает модуль.
- Программу, которая выглядит браузером, список тоже не ловит: улик автоматизации у неё нет. Для неё есть лимит запросов с адреса — блок «При наплыве запросов» в настройках защиты.
- Сайт за прокси или CDN. Файрвол сервера видит адрес прокси, а не посетителя — закрывать адреса нужно на самом прокси. Берите формат «по одному в строке» и загружайте его туда.
Что будет, если что-то пойдёт не так
Скрипт устроен так же, как модуль: при любой ошибке на сервере всё остаётся как было. Не скачался список, пришла страница с ошибкой вместо списка, nginx не принял файл — прежние правила действуют дальше. Если обновление остановилось совсем (отозван токен, сайт удалён из кабинета), записи в ipset истекают сами через двое суток, а список nginx скрипт очищает через тот же срок.
Человек, чей адрес всё же оказался закрыт, вернётся на сайт, как только
адрес выйдет из списка. Чтобы не ждать, внесите адрес в белый список
сайта — при следующем обновлении он из списка исчезнет. В fail2ban адрес
снимается командой fail2ban-client set botban unbanip АДРЕС.
Как убрать
Удалите строки из расписания, затем правило и наборы:
iptables -D INPUT -p tcp -m multiport --dports 80,443 -m set --match-set botban src -j DROP
ip6tables -D INPUT -p tcp -m multiport --dports 80,443 -m set --match-set botban6 src -j DROP
ipset destroy botban
ipset destroy botban6
Для nginx — уберите строку include и перезагрузите его.
Обновлено 2 октября 2026
Не нашли ответа?
Напишите в поддержку из кабинета — отвечаем и дополняем документацию.
Подключить бесплатно