Если ботнет хосты активно сканируют ваши серверы, то здесь может быть несколько стратегий и направлений блокировки: на файрволлах, веб серверах и др.
Самый простой и эффективный метод «в лоб» — блокировка IP диапазонов на файрволле — это снизит нагрузку на CPU сразу значительно. Чаще всего ботнет хосты находятся в определённых сетях, которые можно заблокировать целиком. Более того, есть даже известные провайдеры, которые хостят у себя анонимные прокси и прочие анонимайзеры, которыми активно пользуются атакующие. Таким провайдерам принадлежат целые автономные сети (ASN), которые можно блокировать целиком.
Примером такой компании является 3xK Tech GmbH. Ей принадлежит AS200373 в которой более 56 тысяч IP адресов в разных странах мира. Чтобы узнать все диапазоны сабнетов, можно воспользоваться сайтом https://ipinfo.io, или же более удобно использовать консольную утилиту linux — whois.
sudo apt install whois ipset -y
whois -h whois.radb.net -- '-i origin AS200373' | grep -E '^route6?:' | awk '{print $2}'Мы получаем полный список подсетей. Далее, осталось их добавить в ipset, который потом и заблокировать через iptables.
Я подготовил bash скрипт, который это делает наглядно:
#!/bin/bash
# Настройки
ASN="AS200373"
TEMP_DIR="/tmp"
IPV4_FILE="${TEMP_DIR}/asn_ipv4.txt"
IPV6_FILE="${TEMP_DIR}/asn_ipv6.txt"
SET_NAME_V4="block_3xk_v4"
SET_NAME_V6="block_3xk_v6"
# Функция для логирования сообщений
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}
# Очистка старых временных файлов, если они остались
rm -f "$IPV4_FILE" "$IPV6_FILE"
log "Начало сбора IP-адресов для $ASN..."
# 1. Сбор IPv4 адресов во временный файл
whois -h whois.radb.net -- "-i origin $ASN" | grep -E '^route:' | awk '{print $2}' > "$IPV4_FILE"
# 2. Сбор IPv6 адресов во временный файл
whois -h whois.radb.net -- "-i origin $ASN" | grep -E '^route6:' | awk '{print $2}' > "$IPV6_FILE"
# Проверка: удалось ли что-то скачать
if [ ! -s "$IPV4_FILE" ] && [ ! -s "$IPV6_FILE" ]; then
log "Ошибка: Не удалось получить IP-адреса от WHOIS сервера. Скрипт остановлен."
exit 1
fi
log "Адреса успешно собраны во временные файлы."
# --- Настройка IPSET и IPTABLES для IPv4 ---
if [ -s "$IPV4_FILE" ]; then
log "Обработка IPv4 подсетей..."
# Создаем ipset список, если он еще не существует
ipset create -exist "$SET_NAME_V4" hash:net family inet
# Очищаем список перед заполнением, чтобы убрать устаревшие IP
ipset flush "$SET_NAME_V4"
# Читаем временный файл строка за строкой и заносим в ipset
while IFS= read -r cidr; do
if [ -n "$cidr" ]; then
ipset add "$SET_NAME_V4" "$cidr"
fi
done < "$IPV4_FILE"
# Добавляем блокирующее правило в iptables, если его там еще нет
iptables -C INPUT -m set --match-set "$SET_NAME_V4" src -j DROP 2>/dev/null
if [ $? -ne 0 ]; then
iptables -I INPUT -m set --match-set "$SET_NAME_V4" src -j DROP
log "Добавлено блокирующее правило в iptables (IPv4)."
fi
fi
# --- Настройка IPSET и IP6TABLES для IPv6 ---
if [ -s "$IPV6_FILE" ]; then
log "Обработка IPv6 подсетей..."
# Создаем ipset список для IPv6
ipset create -exist "$SET_NAME_V6" hash:net family inet6
# Очищаем список
ipset flush "$SET_NAME_V6"
# Читаем временный файл и заносим в ipset
while IFS= read -r cidr6; do
if [ -n "$cidr6" ]; then
ipset add "$SET_NAME_V6" "$cidr6"
fi
done < "$IPV6_FILE"
# Добавляем блокирующее правило в ip6tables
ip6tables -C INPUT -m set --match-set "$SET_NAME_V6" src -j DROP 2>/dev/null
if [ $? -ne 0 ]; then
ip6tables -I INPUT -m set --match-set "$SET_NAME_V6" src -j DROP
log "Добавлено блокирующее правило в ip6tables (IPv6)."
fi
fi
# Удаляем временные файлы
rm -f "$IPV4_FILE" "$IPV6_FILE"
log "Блокировка ASN $ASN успешно обновлена."Также есть общие рекомендации по блокировке запросов на nginx.
- Закрывайте все эндпоинты, кроме тех, которые у вас явно используются наружу. Технические эндпоинты, которые нужны для работы самой cms открывайте через
allow 127.0.0.1; deny all; - На атакуемые эндпоинты, к которым не должно быть доступа, или которых не существует, создайте правила, возвращающие код 444. Он сразу закрывает соединение с клиентом без ответа, что экономит ресурсы.
return 444; - настройте лимиты по реквестам к каждого IP адреса
http { # 1. Мягкая зона для обычных страниц сайта (лимит: 3 запроса в секунду с одного IP) limit_req_zone $binary_remote_addr zone=site_limit:10m rate=3r/s; # 2. Жесткая зона для чувствительных страниц: авторизация, поиск, API limit_req_zone $binary_remote_addr zone=auth_limit:10m rate=15r/m; # Настройка ответа для заблокированных ботов limit_req_status 429; # Вместо стандартной 503 ошибки отдаем "429 Too Many Requests" } server { listen 80; server_name yoursite.com; # Применяем базовый лимит ко всему сайту location / { limit_req zone=site_limit burst=20 nodelay; try_files $uri $uri/ /index.php?$args; } # Жесткий лимит на формы входа, регистрацию и критические эндпоинты (где часто орудуют боты) location ~* /(login|register|password|global-protect|api/v1/auth) { # Используем жесткую зону # burst=3 дает право на микро-всплеск из 3 запросов, четвертый — сразу блокируется limit_req zone=auth_limit burst=3 nodelay; # Проксирование на PHP/Backend (пример) include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.2-fpm.sock; } if ($query_string ~* "^[a-zA-Z]=\d+$") { return 444; } }
Конечно, этими советами защита не ограничивается, но с этого стоит начать.
