Атака китайских ботов

Вопросы без привязки к версии. Установлена авточистка (2 года).
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
lexuz
phpBB 1.2.0
Сообщения: 15
Стаж: 7 лет 7 месяцев
Благодарил (а): 1 раз

Re: Атака китайских ботов

Сообщение lexuz »

Kuskow писал(а): 02.06.2026 14:04 Никакой шлагбаум не открывается, поскольку скрипт вылетает с ошибкой, дальше не выполняется, бот получает 500.
тут вы не правы.
Можно использовать консольную команду:

Код: Выделить всё

curl -i -H "User-Agent:" https://forums.test.com
Тогда в логе появится ошибка:

Код: Выделить всё

FastCGI sent in stderr: "PHP message: PHP Warning:  Undefined array key "HTTP_USER_AGENT" in config.php on line 26; PHP message: PHP Warning:  Undefined array key "HTTP_USER_AGENT" in config.php on line 37" while reading response header from upstream, client: x.x.x.x, server: forums.test.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php8.2-fpm.sock:", host: "forums.test.com"
а в access логе мы увидим:

Код: Выделить всё

x.x.x.x - - [15/Jun/2026:22:39:26 +0000] "GET / HTTP/1.1" 200 34276 "-" "-"
при этом curl получит весь текст страницы.

т.е. не работает шлагбаум, при отсутствии useragent, форум отдаёт страницу
Аватара пользователя
Kuskow
phpBB 2.0.4
Сообщения: 401
Стаж: 10 лет
Откуда: 🇰🇿 Караганда
Благодарил (а): 26 раз
Поблагодарили: 38 раз

Re: Атака китайских ботов

Сообщение Kuskow »

Vlad__ писал(а): 14.06.2026 21:52 И еще - условия if в nginx не выполняются все и последовательно как в обычных языках програмирования, поэтому ваш скрипт не рабочий вот в этом месте. В nginx такое кошерно делать с помощью map.
Всё верно, if в location — это известное зло (If Is Evil), оно ломает наследование директив модулей и переключает контекст в nested location.
Но в моём случае этот конфиг подключается на уровне server (через hcp conf_extra). На уровне server директивы if отрабатывают последовательно, как декларативный конвейер, еще до выбора location. Поэтому в данном контексте логика с флагами $bot_check работает стабильно, предсказуемо и ничего не ломает.
В location мы этот код умышленно не пихаем, а если придётся переносить туда — тогда, конечно, перепишем всё на кошерный map.
Аватара пользователя
Kuskow
phpBB 2.0.4
Сообщения: 401
Стаж: 10 лет
Откуда: 🇰🇿 Караганда
Благодарил (а): 26 раз
Поблагодарили: 38 раз

Re: Атака китайских ботов

Сообщение Kuskow »

Vlad__ писал(а): 14.06.2026 1:37 Нужно ли так однозначно? Заголовки запрашивают не только боты.
Спасибо. Замечание переосмысленно и всё переделано заново. Теперь так:

/home/USER/conf/web/DOMAIN.COM/nginx.ssl.conf_extra * У каждого свой путь

Код: Выделить всё

# 1. Легальным, но нежелательным ботам запрещено только сейчас
if ($http_user_agent ~* "Mediapartners") { return 403; }

# 2. Поведенческая блокировка наглых ботов без cookies
# 2a. Помечаем точки входа
set $bot_check "";
if ($http_user_agent ~* "keys-so|python|Firefox/72") { set $bot_check "A"; }
if ($request_uri ~* "/adm/|ucp\.php|author=|posting\.php|profile\.php|\.env|\.git|\.aws|\.terraform") { set $bot_check "A"; }
if ($server_protocol ~ "HTTP/1") { set $bot_check "A"; }
if ($request_method = HEAD) { set $bot_check "A"; }
# 2b. Проверка наличия cookies
if ($http_cookie = "") { set $bot_check "${bot_check}C"; }
# 2c. Исключения (ПС и мессенджеры) — обнуляем всё для своих
if ($http_user_agent ~* "Yandex|Googlebot|Google-|Applebot|bingbot|Baiduspider|GPTBot|whatsapp|telegram|facebook") { set $bot_check ""; }
if ($request_uri ~* "robots\.txt") { set $bot_check ""; }
# 2d. Исполнение приговоров
if ($bot_check = "AC") { return 444; }

# 3. Мягкие ответы
# 3a. Этих страниц уже не существует
if ($request_uri ~* "thankslist|/hostiman/") { return 410; }
# 3b. Системные заглушки
location ^~ /.well-known/acme-challenge/ { allow all; }
location /.well-known/ { log_not_found off; return 204; }
Блок 3а - это чисто моё, так как я удалил у себя это расширение после 10 лет использования.
Блок 1 - тоже только моё, так как вообще никаких рекламных блоков нет на сайте.
К остальному тоже надо подходить вдумчиво, а не пихать сразу в свой сайт.

Настройка fail2ban. В /etc/fail2ban/jail.local добавлен блок:

Код: Выделить всё

[nginx-bot-444]
enabled  = true
#port    = http,https
filter   = nginx-bot-444
action   = hestia[name=WEB]
logpath  = /var/log/nginx/domains/DOMAIN.COM.log
maxretry = 2
findtime = 600
bantime  = 86400
* Вместо /var/log/nginx/domains/DOMAIN.COM.log нужно писать свой путь к логу.

Создан файл /etc/fail2ban/filter.d/nginx-bot-444.conf такого содержания:

Код: Выделить всё

[Definition]
# Ищем IP, получивший код ответа 444 в любой строке лога
failregex = ^<HOST> -.*" (444) .*$
ignoreregex =

Ну и не забываем перезапускать службы nginx и fail2ban после изменений.
Последний раз редактировалось Kuskow 16.06.2026 6:17, всего редактировалось 1 раз.
Аватара пользователя
Kuskow
phpBB 2.0.4
Сообщения: 401
Стаж: 10 лет
Откуда: 🇰🇿 Караганда
Благодарил (а): 26 раз
Поблагодарили: 38 раз

Re: Атака китайских ботов

Сообщение Kuskow »

И вот результат за сутки. Если бы не настроил fail2ban, 444 ответов было бы во много раз больше. * У каждого свой путь к логам сервера

awk '{print $9}' /var/log/nginx/domains/DOMAIN.COM.log | sort | uniq -c | awk '{print $2, $1}' | sort -nr -k2,2

Код: Выделить всё

200 300873
444 17948
308 9497
302 6676
304 2368
403 1258 моя защита
403 662 сам phpBB
301 1801
404 1344
499 650
410 635
425 337
204 238
206 50
307 16
400 2
401 1

fail2ban-client status nginx-bot-444

Код: Выделить всё

Status for the jail: nginx-bot-444
|- Filter
|  |- Currently failed: 33
|  |- Total failed:     20558
|  `- File list:        /var/log/nginx/domains/DOMAIN.COM.log
`- Actions
   |- Currently banned: 557
   |- Total banned:     1560

Вернуться в «phpBB-пространство»