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

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

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Kuskow
phpBB 2.0.1
Сообщения: 264
Стаж: 9 лет 9 месяцев
Откуда: 🇰🇿 Караганда
Благодарил (а): 23 раза
Поблагодарили: 18 раз

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

Сообщение Kuskow »

Kuskow писал(а): 26.02.2026 12:22 NGINX обрезает всплески частых заходов
Чтобы посмотреть, какие User-agent по хулиганке наткнулись на эту стену недоверния (поменять "ваш_домен" на своё):

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

LOG_FILE="/var/log/nginx/domains/ваш_домен.log"; TOTAL=$(tail -n 50000 $LOG_FILE | grep " 200 " | wc -l); tail -n 50000 $LOG_FILE | grep " 200 " | awk -F\" '{print $6}' | sort | uniq -c | sort -nr | head -n 20 | awk -v total=$TOTAL '{ printf "%5.1f%%  |  %s\n", ($1/total)*100, substr($0, index($0,$2)) }'

Чтобы узнать, какие IP-адреса чаще всего разбивались об эту стену (поменять "ваш_домен" на своё):

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

LOG_FILE="/var/log/nginx/domains/ваш_домен.log"; TOTAL=$(tail -n 50000 $LOG_FILE | grep " 503 " | wc -l); tail -n 50000 $LOG_FILE | grep " 503 " | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 20 | awk -v total=$TOTAL '{ printf "%5.1f%%  |  %s\n", ($1/total)*100, $2 }'
rudtp_pp
phpBB 1.4.2
Сообщения: 51
Стаж: 9 лет 2 месяца
Благодарил (а): 18 раз
Поблагодарили: 3 раза

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

Сообщение rudtp_pp »

Спасибо за великолепный инструмент antibot42!
Проанализировали лог антибота за 25-26 год, фактически нуждается в запрете небольшой диапазон адресов, с которых и производятся эти все спамерские регистрации:
147.185.128.0/18
23.98.142.0/24
20.64.0.0/10
198.235.24.0/24
172.94.9.0/24
14.160.0.0/12
113.160.0.0/11
39.32.0.0/11
103.137.158.0/24
147.182.170.0/24
65.49.1.0/24
64.89.163.0/24

Если взглянуть на проблему шире и запретить разным сетевым сканерам искать уязвимости в SQL и искать бэкапы перебором возможных адресов, то мой список такой, он фактически закрывает доступ всем мусорным сетям и абьюзоустойчивым серверам и не трогает ни одного домашнего пользователя. В списки не попали Китайцы и Сингапурцы, потому что их за мощный дидос приходится блочить на уровне операционной системы целыми странами. Кстати на уровне операционки если блокировать - куда легче дышится веб-серверу, нежели нагружать его длинными инструкциями Require not ip:
3.0.0.0/8
4.0.0.0/8
13.0.0.0/8
18.0.0.0/8
20.0.0.0/8
40.0.0.0/8
141.0.0.0/8
172.94.0.0/16
45.134.225.0/24
5.61.209.0/24
130.195.218.0/24
93.188.16.0/20
104.208.116.0/24
43.0.0.0/8
177.23.0.0/18
151.243.0.0/16
172.94.0.0/18
177.23.0.0/18
151.243.0.0/16
151.246.0.0/16
193.169.122.0/24
3.128.0.0/12
173.249.0.0/17
172.190.142.0/24
185.177.72.0/24
188.127.237.0/24
123.143.114.0/24
78.142.16.0/20
202.73.26.0/24
204.76.203.0/24
185.12.59.0/24
95.214.27.0/24
185.224.128.0/24
122.116.143.0/24
5.61.209.0/24
164.90.190.0/24
167.99.128.0/24
64.62.156.0/24
65.49.1.0/24
34.158.168.0/24
167.172.36.0/24
139.59.90.0/24
64.226.126.0/24
51.89.220.0/24
5.101.64.0/24
185.187.114.0/24
34.63.61.0/24
34.11.54.0/24
45.91.64.0/24
23.98.142.0/24
172.234.187.0/24
165.154.36.0/24
35.203.211.0/24
146.19.24.0/24
185.226.197.0/24
147.45.51.0/24
45.66.94.0/24
20.223.198.0/24
216.73.216.0/24
198.235.24.0/24
23.98.142.0/24
147.185.128.0/18
20.64.0.0/10
14.160.0.0/12
113.160.0.0/11
123.16.0.0/12
185.177.72.0/24
172.234.187.0/24
204.76.203.0/24

Отправлено спустя 2 минуты 18 секунд:
Вот еще один полезный скриптик для консоли php. Анализирует списки больших сетей и малых подсетей на предмет вхождения одних в другие. У меня скриптик хорошо Китай подсократил, чтобы не создавать в Брандмауэре лиших записей, когда малая подсеть входит в состав большой сети.

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

<?php
/**
 * Скрипт для оптимизации и сортировки списка IP-диапазонов
 */

$inputFile = __DIR__ . DIRECTORY_SEPARATOR . 'cn.txt';
$outputFile = __DIR__ . DIRECTORY_SEPARATOR . 'cn_optimized.txt';

if (!file_exists($inputFile)) {
    die("Ошибка: Файл $inputFile не найден.\n");
}

// Загружаем строки, чистим от пробелов и пустых строк
$lines = array_filter(array_map('trim', file($inputFile)));

// Функция для перевода CIDR в диапазон (начальный и конечный IP в лонгах)
function getIpRange($cidr) {
    if (strpos($cidr, '/') === false) $cidr .= '/32';
    list($subnet, $mask) = explode('/', $cidr);
    $start = ip2long($subnet);
    $mask_int = -1 << (32 - (int)$mask);
    $end = $start | (~$mask_int & 0xFFFFFFFF);
    return [$start, $end, (int)$mask];
}

$ranges = [];
foreach ($lines as $line) {
    $range = getIpRange($line);
    if ($range[0] !== false) {
        $ranges[] = [
            'original' => $line,
            'start' => $range[0],
            'end' => $range[1],
            'mask' => $range[2]
        ];
    }
}

// 1. Сортируем: сначала по начальному IP, затем по маске (более широкие маски /8 выше чем /24)
usort($ranges, function($a, $b) {
    if ($a['start'] !== $b['start']) return $a['start'] <=> $b['start'];
    return $a['mask'] <=> $b['mask'];
});

$optimized = [];
foreach ($ranges as $current) {
    $isNested = false;
    foreach ($optimized as $parent) {
        // Если текущий диапазон полностью входит в уже добавленный родительский
        if ($current['start'] >= $parent['start'] && $current['end'] <= $parent['end']) {
            $isNested = true;
            break;
        }
    }
    
    if (!$isNested) {
        $optimized[] = $current;
    }
}

// Сохраняем результат
$result = array_column($optimized, 'original');
file_put_contents($outputFile, implode("\n", $result) . "\n");

echo "Готово! Обработано строк: " . count($lines) . "\n";
echo "После оптимизации осталось: " . count($optimized) . "\n";
echo "Результат в файле: $outputFile\n";
?>
rudtp_pp
phpBB 1.4.2
Сообщения: 51
Стаж: 9 лет 2 месяца
Благодарил (а): 18 раз
Поблагодарили: 3 раза

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

Сообщение rudtp_pp »

Screenshot 2026-02-28 025842.png
Доработал скрипт, чтобы он не только включал меньшие диапазоны в бОльшие, но и склеивал те диапазоны, что идут один за другим.

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

<?php
/**
 * Скрипт для оптимизации и сортировки списка IP-диапазонов
 */

$inputFile = __DIR__ . DIRECTORY_SEPARATOR . 'cn.txt';
$outputFile = __DIR__ . DIRECTORY_SEPARATOR . 'cn_optimized.txt';

if (!file_exists($inputFile)) {
    die("Ошибка: Файл $inputFile не найден.\n");
}

// Загружаем строки, чистим от пробелов и пустых строк
$lines = array_filter(array_map('trim', file($inputFile)));

// Функция для перевода CIDR в диапазон (начальный и конечный IP в лонгах)
function getIpRange($cidr) {
    if (strpos($cidr, '/') === false) $cidr .= '/32';
    list($subnet, $mask) = explode('/', $cidr);
    $start = ip2long($subnet);
    $mask_int = -1 << (32 - (int)$mask);
    $end = $start | (~$mask_int & 0xFFFFFFFF);
    return [$start, $end, (int)$mask];
}

$ranges = [];
foreach ($lines as $line) {
    $range = getIpRange($line);
    if ($range[0] !== false) {
        $ranges[] = [
            'original' => $line,
            'start' => $range[0],
            'end' => $range[1],
            'mask' => $range[2]
        ];
    }
}

// 1. Сортируем: сначала по начальному IP, затем по маске (более широкие маски /8 выше чем /24)
usort($ranges, function($a, $b) {
    if ($a['start'] !== $b['start']) return $a['start'] <=> $b['start'];
    return $a['mask'] <=> $b['mask'];
});

$optimized = [];
$skippedCount = 0;

echo "--- Начинаю поиск вложенных диапазонов ---\n";

foreach ($ranges as $current) {
    $isNested = false;
    foreach ($optimized as $parent) {
        // Если текущий диапазон полностью входит в уже добавленный родительский
        if ($current['start'] >= $parent['start'] && $current['end'] <= $parent['end']) {
            // Используем \t для табуляции. Добавил два \t для уверенного отступа.
            echo "[SKIP]\t{$current['original']}\t\tвходит в состав\t\t{$parent['original']}\n";
            $isNested = true;
            $skippedCount++;
            break;
        }
    }
    
    if (!$isNested) {
        $optimized[] = $current;
    }
}

$beforeMerge = count($optimized);
$canMerge = true;

echo "--- Начинаю склейку соседних диапазонов ---\n";

while ($canMerge) {
    $canMerge = false;
    $newOptimized = [];
    $skipNext = false;

    for ($i = 0; $i < count($optimized); $i++) {
        if ($skipNext) {
            $skipNext = false;
            continue;
        }

        $current = $optimized[$i];
        $next = $optimized[$i + 1] ?? null;

        // Условие склейки: 
        // 1. Есть следующий элемент
        // 2. У них одинаковые маски
        // 3. Конец текущего + 1 = начало следующего
        // 4. Новая маска будет валидной (битовая проверка)
        if ($next && $current['mask'] === $next['mask'] && ($current['end'] + 1) === $next['start']) {
            $newMask = $current['mask'] - 1;
            $maskInt = -1 << (32 - $newMask);
            
            // Проверяем, что первый IP выровнен по новой маске
            if (($current['start'] & $maskInt) === $current['start']) {
                $mergedRange = [
                    'original' => long2ip($current['start']) . '/' . $newMask,
                    'start' => $current['start'],
                    'end' => $next['end'],
                    'mask' => $newMask
                ];
                echo "[MERGE]\t{$current['original']} + {$next['original']}\t=>\t{$mergedRange['original']}\n";
                $newOptimized[] = $mergedRange;
                $skipNext = true;
                $canMerge = true;
                continue;
            }
        }
        $newOptimized[] = $current;
    }
    $optimized = $newOptimized;
}

$afterMerge = count($optimized);
echo "------------------------------------------\n";
echo "Склеивание завершено. Убрано лишних строк: " . ($beforeMerge - $afterMerge) . "\n";
// ... (далее сохранение в файл) ...

echo "------------------------------------------\n";

// Сохраняем результат
$result = array_map(function($item) { return $item['original']; }, $optimized);
file_put_contents($outputFile, implode("\n", $result) . "\n");

echo "Готово! Обработано строк: " . count($lines) . "\n";
echo "Удалено вложенных подсетей: $skippedCount\n";
echo "После оптимизации осталось: " . count($optimized) . "\n";
echo "Результат в файле: $outputFile\n";
?>
У вас нет необходимых прав для просмотра вложений в этом сообщении.
ЯМарина
phpBB 1.4.1
Сообщения: 41
Стаж: 1 год 1 месяц
Поблагодарили: 5 раз

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

Сообщение ЯМарина »

MasterX писал(а): 26.02.2026 2:47
ЯМарина писал(а): 22.02.2026 19:20 Добрый день! Сегодня днем заметила, что сайт еле грузится, и обнаружила, что количество посещений зашкаливает...

Больше всего посетителей (12875) здесь было 22 фев 2026, 14:50

Я, конечно, счастлива была бы, если бы это были живые люди, но увы. Что можно сделать?
Редактировать .htaccess
Добавлять блокировки скреперских сетей.

Вот примерно, что нужно добавить
Re: Как забанить ботов на сервере nginx
Большое спасибо за ответ!
rudtp_pp
phpBB 1.4.2
Сообщения: 51
Стаж: 9 лет 2 месяца
Благодарил (а): 18 раз
Поблагодарили: 3 раза

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

Сообщение rudtp_pp »

Пересчитал по базе CIDR-диапазонов сколько мне пришлось забанить вредоносных подсетей, в том числе целиком три страны из Азии и Латинской Америки (читателей моего форума там ноль, а вот дидос оттуда шел на 9 миллионов "читателей" по репорту CloudFlare).

Получилась внушительная адская цифра 666 млн. адресов или 15.5% от всего пула ipv4. И это я еще не всех вредоносных ботов переловил, раз в сутки базу блокировки на уровне операционки пополняю новыми мусорными подсетями, по результату анализа свежих аномалий в логах с помощью гугловского ИИ. У него прямой доступ к базам geoip и прочим, и он видит те вредоносные аномалии, от которых у меня уже глаз замылился среди сотен тысяч строк записей в логах.

Пул ipv6 не имеет доступа к моему серверу, тип AAAA я в DNS сейчас не прописываю, так как провайдер не предоставляет. Так мне хоть полегче разобраться для начала хотя бы с ipv4.

Чтобы 19 тысяч строк правил не подтормаживали веб-сервер - лучше вносить правила входящих соединений на уровне операционки. Для нее это всего 4 стандартных правила по 5 тысяч адресов, то есть семечки. И лучше "причесать" список отдельными скриптами, которые я приложил раньше, чтобы избежать дублирования и склеить соседние диапазоны.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Kuskow
phpBB 2.0.1
Сообщения: 264
Стаж: 9 лет 9 месяцев
Откуда: 🇰🇿 Караганда
Благодарил (а): 23 раза
Поблагодарили: 18 раз

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

Сообщение Kuskow »

Какая-то зараза пришла сегодня утром в 06:50 и как давай скчивать что-то. И не могу определить, кто это и что это. В логах ничего особенного.
Screenshot (81).png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
rudtp_pp
phpBB 1.4.2
Сообщения: 51
Стаж: 9 лет 2 месяца
Благодарил (а): 18 раз
Поблагодарили: 3 раза

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

Сообщение rudtp_pp »

Total_CIDR_Ranges.png
За счет добавления широкими мазками буквально нескольких вьетнамских провайдеров - число диапазонов удалось сильно сократить за счет склеивания и вхождения кучи мелких подсетей в более крупные сети. Такой вот бонус оптимизации.

Было пару дней назад:
------------------------------------------
Склеивание завершено. Убрано лишних строк: 186
------------------------------------------
Готово! Обработано строк: 22238
Удалено вложенных подсетей: 2278
После оптимизации осталось: 19774

После добавления 4 провайдеров вьетнамского пула (засветились среди взломщиков):
------------------------------------------
Склеивание завершено. Убрано лишних строк: 142
------------------------------------------
Готово! Обработано строк: 22277
Удалено вложенных подсетей: 5842
После оптимизации осталось: 16293

То есть вложенных подсетей под оптимизацию было 2278, а стало 5842. Налицо хорошая экономия ресурсов при большей эффективности: правила входящих соединений компактнее и быстрее, но с бОльшим охватом отсечения потенциальных и действующих угроз.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
rudtp_pp
phpBB 1.4.2
Сообщения: 51
Стаж: 9 лет 2 месяца
Благодарил (а): 18 раз
Поблагодарили: 3 раза

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

Сообщение rudtp_pp »

Я себе добавил бибикоды для публикации таблиц: [table], [tr], [td].
Ну раз нет, то скриншотом.
Представленный ниже список — результат глубокого анализа логов реального форума с 22-летней историей. В него вошли диапазоны, которые генерируют исключительно паразитный трафик: от "вежливых" парсеров контента до агрессивных взломщиков, ищущих системные файлы.

Перенос этих правил на уровень Брандмауэра ОС позволяет разгрузить сервер на 70-80%, освобождая ресурсы для реальных пользователей. Если ваш проект ориентирован на аудиторию СНГ и Европы, блокировка этих "магистралей мусора" станет самым эффективным шагом в оптимизации производительности.

Перед вами результат длительного мониторинга и автоматизированного анализа логов Apache 2.4 и PHP 8.5. В список включены исключительно те диапазоны, чей трафик на 95-100% является вредоносным или паразитным.

Мы блокировали их "матрешкой": сначала точечно, а затем закрывая целые автономные системы (ASN) и географические регионы (Латинская Америка, Азия), которые исторически не приносят полезных посещений, но создают колоссальную нагрузку на сервер. Перенос этих правил на уровень Брандмауэра операционной системы позволил снизить нагрузку на процессор и память на 80%, сделав старейший форум 2004 года выпуска неуязвимым для современных ботнетов.

Неоценимую помощь оказал ИИ Гугла в подготовке этого списка в течении пары недель. Гугл не просит этого указывать, но я считаю хорошим тоном указать на моего помощника в борьбе со взломщиками.

Почему этот список особенно ценен:

Реальные боевые условия: это не теоретические базы из интернета, а «отфильтрованный» трафик живого форума с огромной историей.

Оптимизация: мы не просто накидали строк, а «схлопнули» их до 204, что критически важно для производительности Windows/Linux/Apache стека.

Прозрачность: описание каждой группы дает другим админам понимание, почему, например, корейский /15 или бразильский /8 — это не «дискриминация», а необходимая защита от ботнетов.

Список почти не включает Китай и Бразилию, так как эти страны из-за мощного DDoS приходится блокировать целиком по geoip.

malicious_CIDR.png

Этот список из 204 диапазонов охватывает 9.4% всего пула ipv4. В сумме с Китаем и Бразилией будет около 17% всего пула.

204_ranges.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.

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