Сейчас борьба с DDOS - в основном удел специальных сервисов, у которых есть свои каналы... — 30 марта 2026 г. в 09:11:00.642
Сейчас борьба с DDOS - в основном удел специальных сервисов, у которых есть свои каналы и пулы IP адресов. Без этого эффективной защиты не построить. Если у вас не подключена специализированная защита, то вас просто отключит провайдер в случае серьёзной атаки. Но далеко не всегда атаки реально серьёзные, с которыми невозможно справиться самостоятельно. С подобной ситуацией столкнулся в очередной раз. И вроде как успешно справился. Расскажу обо всём по порядку. У меня есть в управлении веб сервер с очень старым проектом. Он уже не приносит прибыль, но бросить его жалко. У него очень много страниц в индексе, люди всё ещё заходят. Покупать для него защиту смысла не имеет. В какой-то момент на сервер полился спам запросов на форумный поиск. Не сказать, что очень много, но сервер загрузили полностью. Отклик по 10-15 секунд, часто 500-е ошибки. Все запросы с разных IP, почти не повторялись. Трафик лился примерно 10-20 мегабит, небольшой, но и виртуалка под сервер не очень мощная, ей этой нагрузки хватало, тем более в поиск. Я зашёл на сервер и бегло посмотрел, что там за IP адреса. Они были из экзотических стран, типа Сейшелы, Маврикий, Малайзия и т.д. Проект под аудиторию из РФ, решил временно ограничить страны, откуда идёт спам. Можно было бы разрешить только РФ и страны СНГ, а остальное запретить, но эти списки ненадёжны. А тем более сейчас, когда куча людей сидит по ВПН. Сразу скажу, что в любом случае это решение временное, на время атаки. Позже я такие ограничения убираю. Есть сервис со списками IP адресов по странам. Я обычно его использую, так как списки легко забрать через wget. На сервере стоит iptables и ipset для больших списков адресов. Набросал простенький скрипт для загрузки IP стран и добавления их в iptables: #!/bin/bash country=mu ipset -N ${country}_ip nethash wget -O tmplist https://www.ipdeny.com/ipblocks/data/countries/${country}.zone list=$(cat tmplist) for ipnet in $list do ipset -A ${country}_ip $ipnet done iptables -I INPUT 1 -m set --match-set ${country}_ip src -j DROP Скрипт рабочий, я его сходу написал и использовал. Ничего не отлаживал, проверок не делал, не оптимизировал. Любой ИИ вам всё это сделает, если нужно будет. У меня такой задачи не стояло. Это помогло. Спам запросов прекратился. Через несколько дней возобновился. Список IP адресов очень разнообразный - США, Европа. Блокировать по странам не стал. Посмотрел внимательно на запросы. У них почему-то у всех был одинаковый user agent с фразой: Macintosh; Intel Mac OS X 10_15_7. Пример лога веб сервера привёл на картинке. Решил банить IP по этому признаку. Сначала прошёл по всему логу и собрал всех с этим юзер агентом, кто сделал более одного запроса: # egrep "Intel Mac OS X 10_15_7" /var/log/nginx/access.log | awk '{print $1}' | sort -n | uniq -c | sort -n | awk '{if ($1 > 1 ) print $2}' > 10_15_7.txt А потом загнал их в список ipset скриптом: #!/bin/bash { echo "create 10_15_7 iphash hashsize 32696 maxelem 262144" while read -r ip; do echo "add 10_15_7 $ip" done < 10_15_7.txt } > ipset-restore ipset restore < ipset-restore И забанил: # iptables -I INPUT 1 -m set --match-set 10_15_7 src -j DROP Это частично помогло, но, постоянно лезли новые IP. Собрал ещё один скрипт, который берёт только последние 3000 строк лога. Перед запуском создал список и правило для него: # ipset -N banip iphash hashsize 16348 maxelem 131072 # iptables -I INPUT 1 -m set --match-set banip src -j DROP Скрипт: #!/bin/sh tail -n 3000 /var/log/nginx/access.log | egrep "Intel Mac OS X 10_15_7" | awk '{print $1}' | sort -n | uniq -c | sort -n | awk '{if ($1 > 0 ) print $2}' > ban.txt list=$(cat ban.txt) for ipnet in $list do ipset -A banip $ipnet -exist done Поставил его в cron на запуск раз в минуту. Примерно через час все адреса оказались в бане и нагрузка упала. Не знаю, что это было, кто и зачем ддосил этот веб сервер. Какая-то бессмыслица, но ситуация реальная. Написал заметку по горячим следам. #iptables #ipset #ddos

