Атака китайских ботов
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
hd321kbps
- phpBB 2.0.3
- Сообщения: 366
- Стаж: 14 лет 3 месяца
- Откуда: Россия, Крым, Армянск
- Благодарил (а): 191 раз
- Поблагодарили: 346 раз
Атака китайских ботов
Сегодня заметил на нескольких форумах наплыв ботов из китая от 100-300 одновременно, которые создают нагрузку на хостинг.
Все заходят с телефона Android и iphone Os.
Адреса ботов:
54.222.*.*
54.223.*.*
52.80.*.*
52.81.*.*
52.82.*.*
52.83.*.*
220.243.*.*
139.217.*.*
139.219.*.*
У кого наблюдается такое-же отпишитесь)
---------------------------
Варианты блокировки ботов:
Re: Атака китайских ботов - от Nekstati
Re: Атака китайских ботов - от Kuskow, php
Re: Атака китайских ботов - от Kuskow, nginx
Все заходят с телефона Android и iphone Os.
Адреса ботов:
54.222.*.*
54.223.*.*
52.80.*.*
52.81.*.*
52.82.*.*
52.83.*.*
220.243.*.*
139.217.*.*
139.219.*.*
У кого наблюдается такое-же отпишитесь)
---------------------------
Варианты блокировки ботов:
Re: Атака китайских ботов - от Nekstati
Re: Атака китайских ботов - от Kuskow, php
Re: Атака китайских ботов - от Kuskow, nginx
Последний раз редактировалось Татьяна5 11.07.2026 18:43, всего редактировалось 1 раз.
-
lexuz
- phpBB 1.2.0
- Сообщения: 15
- Стаж: 7 лет 8 месяцев
- Благодарил (а): 1 раз
Re: Атака китайских ботов
тут вы не правы.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"Код: Выделить всё
x.x.x.x - - [15/Jun/2026:22:39:26 +0000] "GET / HTTP/1.1" 200 34276 "-" "-"т.е. не работает шлагбаум, при отсутствии useragent, форум отдаёт страницу
-
Kuskow
- phpBB 2.0.5
- Сообщения: 457
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Всё верно, if в location — это известное зло (If Is Evil), оно ломает наследование директив модулей и переключает контекст в nested location.Vlad__ писал(а): 14.06.2026 21:52 И еще - условия if в nginx не выполняются все и последовательно как в обычных языках програмирования, поэтому ваш скрипт не рабочий вот в этом месте. В nginx такое кошерно делать с помощью map.
Но в моём случае этот конфиг подключается на уровне server (через hcp conf_extra). На уровне server директивы if отрабатывают последовательно, как декларативный конвейер, еще до выбора location. Поэтому в данном контексте логика с флагами $bot_check работает стабильно, предсказуемо и ничего не ломает.
В location мы этот код умышленно не пихаем, а если придётся переносить туда — тогда, конечно, перепишем всё на кошерный map.
-
Kuskow
- phpBB 2.0.5
- Сообщения: 457
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Спасибо. Замечание переосмысленно и всё переделано заново. Теперь так:
/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; }
Блок 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.5
- Сообщения: 457
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
И вот результат за сутки. Если бы не настроил 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 1fail2ban-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-
Nekstati
- Поддержка

- Сообщения: 3365
- Стаж: 17 лет 3 месяца
- Благодарил (а): 19 раз
- Поблагодарили: 580 раз
Re: Атака китайских ботов
Вариант блокировки ботов с помощью PHP для тех, кто не может менять настройки Nginx/Apache. Или для тех, кто устал писать логику в конфигах, для этого не предназначенных.
Открыть файл
Найти
Добавить перед
Что делает этот скрипт:
Открыть файл
common.phpНайти
if (!defined('IN_PHPBB'))Добавить перед
Код: Выделить всё
function applyBotProtection() {
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$userIp = $_SERVER['REMOTE_ADDR'] ?? '';
// 0. Исключение для ботов, чьи юзерагенты нам неизвестны и могут быть пусты, но известен адрес, по которому они приходят
if (preg_match('/epayment\/(yoomoney|webmoney)/', $_SERVER['REQUEST_URI'])) {
return;
}
// 1. Блокировка запросов без юзерагента
if (empty($userAgent)) {
header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
exit('Access Denied');
}
// 2. Исключение для полезных ботов
if (preg_match('/Googlebot|YandexBot|YandexMobileBot|YandexImages|YandexVideo|YandexNews|YandexMetrika|Bingbot|TelegramBot/i', $userAgent)) {
return;
}
if (session_status() === PHP_SESSION_NONE) {
session_start(['cache_limiter' => 'private_no_expire']);
}
// 3. Проверка браузера по куке (защита от простейших автоматических парсеров)
$secret_salt = "AntiBotWindows2026_Key";
$cookie_name = "server_validate";
$expected_cookie_value = md5($userIp . $secret_salt);
if (!isset($_COOKIE[$cookie_name]) || $_COOKIE[$cookie_name] !== $expected_cookie_value) {
if (isset($_GET['validate_bot']) && $_GET['validate_bot'] === $expected_cookie_value) {
setcookie($cookie_name, $expected_cookie_value, time() + 86400, "/");
$clean_url = preg_replace("/[?&]validate_bot=$expected_cookie_value/", '', $_SERVER['REQUEST_URI']);
header("Location: " . $clean_url);
exit;
}
header("Content-Type: text/html; charset=utf-8");
$redirect_url = $_SERVER['REQUEST_URI'] . (strpos($_SERVER['REQUEST_URI'], '?') === false ? '?' : '&') . 'validate_bot=' . $expected_cookie_value;
echo '<!DOCTYPE html><html dir="ltr" lang="ru"><head><meta http-equiv="refresh" content="0;url=' . htmlspecialchars($redirect_url) . '"></head>';
echo '<body><p style="text-align:center;margin-top:100px;font-family:sans-serif;">Проверка браузера... Пожалуйста, подождите.</p></body></html>';
exit;
}
// 4. Вредные боты и IP
$badBotsPattern = '/facebookexternalhit|BLEXBot|SemrushBot|AhrefsBot|Amazonbot|MJ12bot|Bytespider|claudebot|DataForSeoBot|gptbot|'
. 'GeedoProductSearch|GeedoBot|SeopultContentAnalyzer|SeekportBot|Barkrowler|DotBot|PetalBot|LinkpadBot|statdom|MegaIndex|'
. 'WebDataStats|Jooblebot|BackupLand|thesis|fidget|Mediatoolkitbot/i';
$badIps = [
// '23.22.35.162',
// '52.70.240.171',
];
$isBadBot = preg_match($badBotsPattern, $userAgent) || in_array($userIp, $badIps, true);
$maxRequestsPerSecond = $isBadBot ? 2 : 5;
// 5. Исключение: легитимное скачивание файлов с корректным реферером пропускаем без проверки, т.к. на странице м.б. десятки картинок
$isDownloadFile = (strpos($_SERVER['REQUEST_URI'], 'download/file.php') !== false);
if ($isDownloadFile
&& !empty($_SERVER['HTTP_REFERER'])
&& !empty($_SERVER['SERVER_NAME'])
&& stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== false) {
return;
}
// 6. Проверка активного бана
$currentTime = microtime(true);
if (isset($_SESSION['ban_until']) && $_SESSION['ban_until'] > $currentTime) {
$remainingBanTime = ceil($_SESSION['ban_until'] - $currentTime);
header($_SERVER["SERVER_PROTOCOL"] . ' 429 Too Many Requests');
header('Retry-After: ' . $remainingBanTime);
exit('Too many requests. Please retry in ' . $remainingBanTime . ' seconds.');
}
// 7. Скользящее окно тротлинга (1 секунда)
if (!isset($_SESSION['request_times']) || !is_array($_SESSION['request_times'])) {
$_SESSION['request_times'] = [];
}
// Очищаем метки старше 1 секунды
$_SESSION['request_times'] = array_values(array_filter(
$_SESSION['request_times'],
// fn($t) => ($currentTime - $t) < 1.0
function($t) use ($currentTime) { return ($currentTime - $t) < 1.0; }
));
// Проверяем лимит
if (count($_SESSION['request_times']) >= $maxRequestsPerSecond) {
// Превышен лимит — ставим бан на 5 секунд
$_SESSION['ban_until'] = $currentTime + 5.0;
header($_SERVER["SERVER_PROTOCOL"] . ' 429 Too Many Requests');
header('Retry-After: 5');
exit('Too many requests. Please retry in 5 seconds.');
}
// Всё ок — добавляем текущий запрос в счётчик
$_SESSION['request_times'][] = $currentTime;
}
applyBotProtection();Что делает этот скрипт:
- простейшая проверка браузера по кукам
- ограничение 2 запроса в секунду для известных бесполезных ботов
- ограничение 5 запросов в секунду для прочих клиентов
- если этот порог превышен, клиент банится на 5 секунд
- нет ограничений для полезных ботов (Google, Yandex, Bing)
- нет ограничений для download/file.php при условии правильного реферера (картинок на странице могут быть десятки)
- (важно) замените "download/file.php" на что-то своё, если у вас ссылки на вложения выглядят иначе (напр. установлено расширение SEO Images in attachment)
- (важно) замените "/epayment\/(yoomoney|webmoney)/" на что-то своё, если ожидаете запросы от полезного бота на конкретный адрес, но юзерагент этого бота вам неизвестен и может быть пуст (напр. запросы от платёжных систем типа ЮMoney)
- можно добавить юзерагенты полезных ботов в список "/Googlebot"..., если они вам известны
- можно добавлять какие-то IP по ситуации в список $badIps
-
Ne_Guru
- phpBB 1.4.0
- Сообщения: 38
- Стаж: 27 дней
- Благодарил (а): 3 раза
Re: Атака китайских ботов
Спасибо огромное, Nekstati!
Внес этот скрипт в common.php - количество ботов сократилось многократно.
У меня есть еще один форум, там версия 3.2.11.
На радостях я внес этот скрипт и туда: в итоге форум перестал загружаться и от этой вставки пришлось срочно отказываться.
Можно ли как-то решить этот вопрос на более низкой версии форума? (3.2.11)
Был бы вам очень признателен.
Внес этот скрипт в common.php - количество ботов сократилось многократно.
У меня есть еще один форум, там версия 3.2.11.
На радостях я внес этот скрипт и туда: в итоге форум перестал загружаться и от этой вставки пришлось срочно отказываться.
Можно ли как-то решить этот вопрос на более низкой версии форума? (3.2.11)
Был бы вам очень признателен.
-
Татьяна5
- Поддержка

- Сообщения: 13129
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 166 раз
- Поблагодарили: 2394 раза
-
Ne_Guru
- phpBB 1.4.0
- Сообщения: 38
- Стаж: 27 дней
- Благодарил (а): 3 раза
Re: Атака китайских ботов
Татьяна5,
Версия PHP - 5.6.40
В админке нашел только Лог ошибок (во вкладке "Обслуживание") - он девственно чист.
Где-то в другом месте можно лог ошибок на сервере посмотреть?
Версия PHP - 5.6.40
В админке нашел только Лог ошибок (во вкладке "Обслуживание") - он девственно чист.
Где-то в другом месте можно лог ошибок на сервере посмотреть?
-
Татьяна5
- Поддержка

- Сообщения: 13129
- Стаж: 14 лет 11 месяцев
- Благодарил (а): 166 раз
- Поблагодарили: 2394 раза
Re: Атака китайских ботов
Да, на самом сервере, error.log или что-то похожее (обычно выше папки с форумом находится)
Отправлено спустя 2 минуты 37 секунд:
Как минимум:
Код: Выделить всё
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$userIp = $_SERVER['REMOTE_ADDR'] ?? '';Код: Выделить всё
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
$userIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';Отправлено спустя 1 минуту 46 секунд:
Или поднять версию php. PhpBB 3.2.11 до 7.2 включительно поддерживает
-
Ne_Guru
- phpBB 1.4.0
- Сообщения: 38
- Стаж: 27 дней
- Благодарил (а): 3 раза
Re: Атака китайских ботов
Там, похоже, всё запущено.
Заказал логи, при их заказе высветилась ошибка и надпись "обратитесь в техподдержку".
Буду разбираться, напишу по результатам, спасибо!
Отправлено спустя 15 минут 23 секунды:
Внес ваши изменения, форум работает.
Нашел лог ошибок, там была такая надпись:
veterancuba.su [Thu Jun 18 10:50:22 2026] [error] [pid 41503] sapi_apache2.c(325): [client 188.255.140.177:0] PHP Parse error: syntax error, unexpected '?' in /home/v/veterancu/public_html/forum/common.php on line 18
Только мне уже не вспомнить, что было в той 18-й строчке.
Возможно
function applyBotProtection() {либо
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
$userIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';Ну, вот я это заменил, форум работает, ошибок сервер не выдал.
Отправлено спустя 5 минут 51 секунду:
Кол-во ботов стремительно снижается, но странное дело.
Когда я внес эти изменения в скрипт своего основного форума, где стоит версия 3.3.13, там сначала он показывал истинное кол-во посетителей, но потом постепенно кол-во ботов стало возрастать.
Желтой линией отмечено время, когда я внес изменения в файл common.php.
Ну, это просто для информации.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
Kuskow
- phpBB 2.0.5
- Сообщения: 457
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Внезапно ощутил прилив жизненных сил от нашей с Google-ai прозорливости, прочитав вот это:
[ВАЖНО] Как избежать взлома на версиях phpBB до 3.3.17
-
Ne_Guru
- phpBB 1.4.0
- Сообщения: 38
- Стаж: 27 дней
- Благодарил (а): 3 раза
Re: Атака китайских ботов
А количество запросов почему-то увеличилось.
А вот напоследок общая нагрузка.
А вот напоследок общая нагрузка.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
Nekstati
- Поддержка

- Сообщения: 3365
- Стаж: 17 лет 3 месяца
- Благодарил (а): 19 раз
- Поблагодарили: 580 раз
Re: Атака китайских ботов
Kuskow, это была просто защита от полного дурака (неполный всегда нагуглит что ему надо).
Ne_Guru, запросы выросли в ~4 раза, а нагрузка не выросла или даже чуть упала. Что и требовалось. Интереснее будет попозже глянуть график за ~двое суток, до и после.
Ne_Guru, запросы выросли в ~4 раза, а нагрузка не выросла или даже чуть упала. Что и требовалось. Интереснее будет попозже глянуть график за ~двое суток, до и после.
-
Ne_Guru
- phpBB 1.4.0
- Сообщения: 38
- Стаж: 27 дней
- Благодарил (а): 3 раза
Re: Атака китайских ботов
Nekstati, хорошо, конечно, посмотрю!
Еще раз лично выражаю Вам огромную признательность за помощь!
Просто самоотверженный труд!
Горжусь Вами, Татьяной5, и всеми phpGuru!
Еще раз лично выражаю Вам огромную признательность за помощь!
Просто самоотверженный труд!
Горжусь Вами, Татьяной5, и всеми phpGuru!
-
southklad
- phpBB 3.1.0 RC4
- Сообщения: 3459
- Стаж: 14 лет 6 месяцев
- Благодарил (а): 710 раз
- Поблагодарили: 173 раза
Re: Атака китайских ботов
А на что заменить, если стоит SEO Images in attachment?Nekstati писал(а): 17.06.2026 20:09 (важно) замените "download/file.php" на что-то своё, если у вас ссылки на вложения выглядят иначе (напр. установлено расширение SEO Images in attachment)

