Как защититься от ботнета базовыми инструментами

Если ботнет хосты активно сканируют ваши серверы, то здесь может быть несколько стратегий и направлений блокировки: на файрволлах, веб серверах и др.

Самый простой и эффективный метод «в лоб» — блокировка 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;
        }
    }

Конечно, этими советами защита не ограничивается, но с этого стоит начать.

Был ли наш пост полезен?

Нажмите на звезду, чтобы оценить мои труды!

Средний рейтинг: 0 / 5. Количество голосов: 0

Пока голосов нет. Проголосуй первым!

Мне жаль, что пост вам не помог 🙁

Позвольте мне исправиться.

Поделитесь, что можно улучшить?

Похожие посты