vm:nginx:06-file2ban_v2

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
vm:nginx:06-file2ban_v2 [2025/12/01 12:09] – создано adminvm:nginx:06-file2ban_v2 [2025/12/01 12:19] (текущий) admin
Строка 15: Строка 15:
   * Root доступ к серверу   * Root доступ к серверу
  
-===== Установка Fail2ban =====+===== Быстрая установка (автоматический скрипт) =====
  
-==== Шаг 1: Установка пакета ====+**Рекомендуется:** Используйте автоматический скрипт установки для быстрой настройки всей системы за один шаг. 
 + 
 +==== Шаг 1: Создание скрипта установки ====
  
 <code bash> <code bash>
-apt update +nano install-fail2ban.sh
-apt install fail2ban -y+
 </code> </code>
  
-==== Шаг 2: Создание структуры каталогов ====+==== Шаг 2: Содержимое скрипта ==== 
 + 
 +Скопируйте следующий код в файл:
  
 <code bash> <code bash>
-mkdir -p /opt/fail2ban/{scripts,logs,config/{jail.d,filter.d}} +#!/bin/bash
-</code>+
  
-===== Создание парсера логов Nginx Proxy Manager =====+################################################################################ 
 +Скрипт автоматической установки и настройки Fail2ban для Nginx Proxy Manager 
 +# Версия: 1.0 
 +# Дата: 2025-11-30 
 +################################################################################
  
-==== Шаг 3: Создание скрипта парсера ====+set -e  # Остановка при ошибке
  
-Создайте файл /opt/fail2ban/scripts/parse-nginx-logs.sh:+# Цвета для вывода 
 +RED='\033[0;31m' 
 +GREEN='\033[0;32m' 
 +YELLOW='\033[1;33m' 
 +NC='\033[0m' # No Color
  
-<code bash> +# Функция вывода сообщений 
-cat > /opt/fail2ban/scripts/parse-nginx-logs.sh << 'EOF'+log_info() { 
 +    echo -e "${GREEN}[INFO]${NC} $1" 
 +
 + 
 +log_warn() { 
 +    echo -e "${YELLOW}[WARN]${NC} $1" 
 +
 + 
 +log_error() { 
 +    echo -e "${RED}[ERROR]${NC} $1" 
 +
 + 
 +# Проверка прав root 
 +if [[ $EUID -ne 0 ]]; then 
 +   log_error "Этот скрипт должен быть запущен с правами root" 
 +   exit 1 
 +fi 
 + 
 +log_info "Начало установки и настройки Fail2ban для Nginx Proxy Manager" 
 +echo "" 
 + 
 +################################################################################ 
 +# НАСТРОЙКИ - ИЗМЕНИТЕ ПОД СВОИ НУЖДЫ 
 +################################################################################ 
 + 
 +# Путь к логам Nginx Proxy Manager 
 +NPM_LOG_DIR="/opt/nginxpm/data/logs" 
 + 
 +# Имя контейнера Nginx Proxy Manager 
 +NPM_CONTAINER_NAME="nginxpm" 
 + 
 +# Директории Fail2ban 
 +FAIL2BAN_BASE="/opt/fail2ban
 +FAIL2BAN_SCRIPTS="${FAIL2BAN_BASE}/scripts
 +FAIL2BAN_LOGS="${FAIL2BAN_BASE}/logs" 
 +FAIL2BAN_CONFIG="${FAIL2BAN_BASE}/config" 
 +FAIL2BAN_JAIL_D="${FAIL2BAN_CONFIG}/jail.d" 
 +FAIL2BAN_FILTER_D="${FAIL2BAN_CONFIG}/filter.d" 
 + 
 +# Файл лога для fail2ban 
 +NGINX_ACCESS_LOG="${FAIL2BAN_LOGS}/nginx-access.log" 
 + 
 +# Игнорируемые IP (локальные сети) 
 +IGNORE_IP="127.0.0.1/8 ::1 192.168.0.0/24 172.16.0.0/12 10.0.0.0/8" 
 + 
 +################################################################################ 
 +# Шаг 1: Проверка существования Nginx Proxy Manager 
 +################################################################################ 
 + 
 +log_info "Проверка наличия контейнера Nginx Proxy Manager..." 
 + 
 +if ! docker ps --format "{{.Names}}" | grep -q "^${NPM_CONTAINER_NAME}$"; then 
 +    log_error "Контейнер ${NPM_CONTAINER_NAME} не найден или не запущен" 
 +    log_error "Убедитесь что Nginx Proxy Manager установлен и запущен" 
 +    exit 1 
 +fi 
 + 
 +if [ ! -d "$NPM_LOG_DIR" ]; then 
 +    log_error "Директория логов ${NPM_LOG_DIR} не найдена" 
 +    exit 1 
 +fi 
 + 
 +log_info "Контейнер ${NPM_CONTAINER_NAME} найден и работает" 
 +echo "" 
 + 
 +################################################################################ 
 +# Шаг 2: Установка Fail2ban 
 +################################################################################ 
 + 
 +log_info "Установка Fail2ban..." 
 + 
 +apt update -qq 
 +apt install -y fail2ban >/dev/null 2>&
 + 
 +log_info "Fail2ban успешно установлен" 
 +echo "" 
 + 
 +################################################################################ 
 +# Шаг 3: Создание структуры каталогов 
 +################################################################################ 
 + 
 +log_info "Создание структуры каталогов..." 
 + 
 +mkdir -p "${FAIL2BAN_SCRIPTS}" 
 +mkdir -p "${FAIL2BAN_LOGS}" 
 +mkdir -p "${FAIL2BAN_JAIL_D}" 
 +mkdir -p "${FAIL2BAN_FILTER_D}" 
 + 
 +log_info "Структура каталогов создана" 
 +echo "" 
 + 
 +################################################################################ 
 +# Шаг 4: Создание скрипта парсера логов 
 +################################################################################ 
 + 
 +log_info "Создание скрипта парсера логов..." 
 + 
 +cat > "${FAIL2BAN_SCRIPTS}/parse-nginx-logs.sh<< 'PARSER_EOF'
 #!/bin/bash #!/bin/bash
 # Скрипт парсинга логов nginx-proxy-manager для fail2ban # Скрипт парсинга логов nginx-proxy-manager для fail2ban
-# Обрабатывает все access логи из папки nginxpm 
  
 LOG_DIR="/opt/nginxpm/data/logs" LOG_DIR="/opt/nginxpm/data/logs"
Строка 47: Строка 153:
 PARSER_LOG="/opt/fail2ban/logs/parser.log" PARSER_LOG="/opt/fail2ban/logs/parser.log"
  
-# Создаем директории если они не существуют 
 mkdir -p "$(dirname "$LOG_FILE")" "$(dirname "$PARSER_LOG")" mkdir -p "$(dirname "$LOG_FILE")" "$(dirname "$PARSER_LOG")"
  
-# Проверяем, что контейнер запущен 
 if ! docker ps --format "table {{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then if ! docker ps --format "table {{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
-    echo "$(date): Контейнер $CONTAINER_NAME не найден или не запущен" >> "$PARSER_LOG"+    echo "$(date): Контейнер $CONTAINER_NAME не найден" >> "$PARSER_LOG"
     exit 1     exit 1
 fi fi
  
-# Проверяем существование директории с логами 
 if [ ! -d "$LOG_DIR" ]; then if [ ! -d "$LOG_DIR" ]; then
-    echo "$(date): Директория логов $LOG_DIR не найдена" >> "$PARSER_LOG"+    echo "$(date): Директория $LOG_DIR не найдена" >> "$PARSER_LOG"
     exit 1     exit 1
 fi fi
  
-# Очищаем целевой файл 
 > "$LOG_FILE" > "$LOG_FILE"
  
-# Счетчик обработанных файлов и строк 
 processed_files=0 processed_files=0
 total_lines=0 total_lines=0
  
-# Обрабатываем все файлы с окончанием *_access.log 
 for logfile in "$LOG_DIR"/proxy-host-*_access.log; do for logfile in "$LOG_DIR"/proxy-host-*_access.log; do
-    # Проверяем, что файл существует (на случай если паттерн не найден) 
     if [ -f "$logfile" ]; then     if [ -f "$logfile" ]; then
         lines_from_file=$(tail -n 2000 "$logfile" | wc -l)         lines_from_file=$(tail -n 2000 "$logfile" | wc -l)
Строка 77: Строка 176:
         processed_files=$((processed_files + 1))         processed_files=$((processed_files + 1))
         total_lines=$((total_lines + lines_from_file))         total_lines=$((total_lines + lines_from_file))
-        echo "$(date): Обработан файл: $(basename "$logfile") - $lines_from_file строк" >> "$PARSER_LOG"+        echo "$(date): Обработан: $(basename "$logfile") - $lines_from_file строк" >> "$PARSER_LOG"
     fi     fi
 done done
  
-# Если не найдено ни одного файла логов 
 if [ $processed_files -eq 0 ]; then if [ $processed_files -eq 0 ]; then
-    echo "$(date): Не найдено файлов логов *_access.log в директории $LOG_DIR" >> "$PARSER_LOG" +    echo "$(date): Файлы логов не найдены" >> "$PARSER_LOG"
-    # Создаем пустой файл чтобы fail2ban не ругался+
     touch "$LOG_FILE"     touch "$LOG_FILE"
 fi fi
  
-# Устанавливаем права доступа 
 chmod 644 "$LOG_FILE" chmod 644 "$LOG_FILE"
  
-# Логируем статистику каждый час (когда минуты = 00) 
 MINUTE=$(date +%M) MINUTE=$(date +%M)
 if [ "$MINUTE" = "00" ]; then if [ "$MINUTE" = "00" ]; then
     final_lines=$(wc -l < "$LOG_FILE" 2>/dev/null || echo "0")     final_lines=$(wc -l < "$LOG_FILE" 2>/dev/null || echo "0")
-    echo "$(date): Итого обработано $processed_files файлов, $final_lines записей из контейнера $CONTAINER_NAME" >> "$PARSER_LOG"+    echo "$(date): Обработано $processed_files файлов, $final_lines записей" >> "$PARSER_LOG"
 fi fi
  
-# Ротация логов parser.log (если больше 5MB) 
 if [ -f "$PARSER_LOG" ] && [ $(stat -c%s "$PARSER_LOG" 2>/dev/null || echo 0) -gt 5242880 ]; then if [ -f "$PARSER_LOG" ] && [ $(stat -c%s "$PARSER_LOG" 2>/dev/null || echo 0) -gt 5242880 ]; then
     mv "$PARSER_LOG" "$PARSER_LOG.old"     mv "$PARSER_LOG" "$PARSER_LOG.old"
Строка 105: Строка 199:
 fi fi
  
-# Удаление записей старше 30 дней из лог-файла 
-if [ -f "$LOG_FILE" ] && [ -s "$LOG_FILE" ]; then 
-    CUTOFF_DATE=$(date -d '30 days ago' '+%d/%b/%Y') 
-    TEMP_FILTERED="/tmp/nginx-filtered-logs" 
-     
-    # Фильтруем записи не старше 30 дней 
-    awk -v cutoff="$CUTOFF_DATE" ' 
-    { 
-        # Извлекаем дату из строки лога (формат: DD/MMM/YYYY) 
-        match($0, /\[([0-9]{2}\/[A-Za-z]{3}\/[0-9]{4})/, date_match) 
-        if (date_match[1]) { 
-            # Преобразуем дату в timestamp для сравнения 
-            cmd = "date -d \"" date_match[1] "\" +%s 2>/dev/null" 
-            cmd | getline log_timestamp 
-            close(cmd) 
-             
-            cmd2 = "date -d \"" cutoff "\" +%s 2>/dev/null" 
-            cmd2 | getline cutoff_timestamp 
-            close(cmd2) 
-             
-            # Если дата лога >= даты отсечки, выводим строку 
-            if (log_timestamp >= cutoff_timestamp) { 
-                print $0 
-            } 
-        } else { 
-            # Если не удалось извлечь дату, оставляем запись 
-            print $0 
-        } 
-    }' "$LOG_FILE" > "$TEMP_FILTERED" 
-     
-    # Заменяем оригинальный файл отфильтрованным 
-    if [ -f "$TEMP_FILTERED" ]; then 
-        mv "$TEMP_FILTERED" "$LOG_FILE" 
-        chmod 644 "$LOG_FILE" 
-    fi 
-fi 
- 
-# Ротация основного лог-файла (если больше 10MB) 
 if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE" 2>/dev/null || echo 0) -gt 10485760 ]; then if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE" 2>/dev/null || echo 0) -gt 10485760 ]; then
     mv "$LOG_FILE" "$LOG_FILE.old"     mv "$LOG_FILE" "$LOG_FILE.old"
     touch "$LOG_FILE"     touch "$LOG_FILE"
     chmod 644 "$LOG_FILE"     chmod 644 "$LOG_FILE"
-    echo "$(date): Выполнена ротация лог-файла $LOG_FILE" >> "$PARSER_LOG"+    echo "$(date): Ротация лог-файла" >> "$PARSER_LOG"
 fi fi
  
 exit 0 exit 0
-EOF +PARSER_EOF
-</code>+
  
-==== Шаг 4: Установка прав на скрипт ====+chmod +x "${FAIL2BAN_SCRIPTS}/parse-nginx-logs.sh"
  
-<code bash> +log_info "Скрипт парсера создан" 
-chmod +x /opt/fail2ban/scripts/parse-nginx-logs.sh +echo ""
-</code>+
  
-==== Шаг 5: Добавление скрипта в cron ====+################################################################################ 
 +Шаг 5: Первый запуск парсера 
 +################################################################################
  
-<code bash> +log_info "Первый запуск парсера..."
-(crontab -l 2>/dev/null; echo "*/2 * * * * /opt/fail2ban/scripts/parse-nginx-logs.sh") | crontab - +
-</code>+
  
-Проверка добавления в cron:+"${FAIL2BAN_SCRIPTS}/parse-nginx-logs.sh"
  
-<code bash> +if [ -f "$NGINX_ACCESS_LOG" ]; then 
-crontab -l +    log_info "Лог-файл создан: ${NGINX_ACCESS_LOG}" 
-</code>+    log_info "Количество строк: $(wc -l ${NGINX_ACCESS_LOG})" 
 +else 
 +    log_error "Не удалось создать лог-файл" 
 +    exit 1 
 +fi 
 +echo ""
  
-==== Шаг 6: Первый запуск парсера ====+################################################################################ 
 +Шаг 6: Создание фильтров Fail2ban 
 +################################################################################
  
-<code bash> +log_info "Создание фильтров Fail2ban..."
-/opt/fail2ban/scripts/parse-nginx-logs.sh +
-</code>+
  
-Проверка результата: +cat > "${FAIL2BAN_FILTER_D}/nginx-scan-block.conf<< 'FILTER_SCAN_EOF'
- +
-<code bash> +
-ls -lh /opt/fail2ban/logs/nginx-access.log +
-tail -10 /opt/fail2ban/logs/nginx-access.log +
-</code> +
- +
-===== Настройка фильтров Fail2ban ===== +
- +
-==== Шаг 7: Создание фильтра для блокировки сканирования ==== +
- +
-<code bash> +
-cat > /opt/fail2ban/config/filter.d/nginx-scan-block.conf << 'EOF'+
 [Definition] [Definition]
  
-# Формат NPM: [DATE] - STATUS STATUS - METHOD PROTOCOL DOMAIN "PATH" [Client IP] 
 failregex = ^\[.*\] - \d+ \d+ - GET https? .* ".*(/\.env|/\.git|/\.aws|/\.ssh|/config|/backup|wp-config|phpinfo|admin/config|server-status|server-info).*" \[Client <HOST>\] failregex = ^\[.*\] - \d+ \d+ - GET https? .* ".*(/\.env|/\.git|/\.aws|/\.ssh|/config|/backup|wp-config|phpinfo|admin/config|server-status|server-info).*" \[Client <HOST>\]
             ^\[.*\] - 40\d \d+ - GET https? .* ".*\.(php|asp|jsp|cgi|pl|py).*" \[Client <HOST>\]             ^\[.*\] - 40\d \d+ - GET https? .* ".*\.(php|asp|jsp|cgi|pl|py).*" \[Client <HOST>\]
Строка 203: Строка 249:
  
 ignoreregex = ignoreregex =
-EOF +FILTER_SCAN_EOF
-</code>+
  
-==== Шаг 8: Создание фильтра для блокировки 404 флуда ==== +cat > "${FAIL2BAN_FILTER_D}/nginx-404-flood.conf<< 'FILTER_404_EOF'
- +
-<code bash> +
-cat > /opt/fail2ban/config/filter.d/nginx-404-flood.conf << 'EOF'+
 [Definition] [Definition]
  
-# Блокировка множественных 404 ошибок 
 failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* ".*" \[Client <HOST>\] failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* ".*" \[Client <HOST>\]
  
 ignoreregex = ignoreregex =
-EOF +FILTER_404_EOF
-</code>+
  
-==== Шаг 9: Создание фильтра для блокировки DoS ==== +cat > "${FAIL2BAN_FILTER_D}/nginx-dos-block.conf<< 'FILTER_DOS_EOF'
- +
-<code bash> +
-cat > /opt/fail2ban/config/filter.d/nginx-dos-block.conf << 'EOF'+
 [Definition] [Definition]
  
-# Блокировка слишком частых запросов (DoS) 
 failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEAD) https? .* ".*" \[Client <HOST>\] failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEAD) https? .* ".*" \[Client <HOST>\]
  
 ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* ".*\.(css|js|jpg|jpeg|png|gif|ico|woff|woff2|ttf|svg).*" \[Client <HOST>\] ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* ".*\.(css|js|jpg|jpeg|png|gif|ico|woff|woff2|ttf|svg).*" \[Client <HOST>\]
-EOF +FILTER_DOS_EOF
-</code>+
  
-==== Шаг 10: Создание символических ссылок на фильтры ====+ln -sf "${FAIL2BAN_FILTER_D}/nginx-scan-block.conf" /etc/fail2ban/filter.d/nginx-scan-block.conf 
 +ln -sf "${FAIL2BAN_FILTER_D}/nginx-404-flood.conf" /etc/fail2ban/filter.d/nginx-404-flood.conf 
 +ln -sf "${FAIL2BAN_FILTER_D}/nginx-dos-block.conf" /etc/fail2ban/filter.d/nginx-dos-block.conf
  
-<code bash> +log_info "Фильтры созданы" 
-ln -sf /opt/fail2ban/config/filter.d/nginx-scan-block.conf /etc/fail2ban/filter.d/nginx-scan-block.conf +echo ""
-ln -sf /opt/fail2ban/config/filter.d/nginx-404-flood.conf /etc/fail2ban/filter.d/nginx-404-flood.conf +
-ln -sf /opt/fail2ban/config/filter.d/nginx-dos-block.conf /etc/fail2ban/filter.d/nginx-dos-block.conf +
-</code>+
  
-===== Настройка jail для Nginx Proxy Manager =====+################################################################################ 
 +# Шаг 7: Создание конфигурации jail 
 +################################################################################
  
-==== Шаг 11: Создание конфигурации jail ====+log_info "Создание конфигурации jail..."
  
-<WRAP center round important 60%> +cat > "${FAIL2BAN_JAIL_D}/nginx-protection.conf<< JAIL_EOF
-**ВАЖНО:** Замените IP адреса в параметре ''ignoreip'' на свои локальные сети и доверенные IP. +
-</WRAP> +
- +
-<code bash> +
-cat > /opt/fail2ban/config/jail.d/nginx-protection.conf << 'EOF' +
-# Jail конфигурация для nginx защиты+
 [DEFAULT] [DEFAULT]
-# Время бана в секундах (1 час = 3600) 
 bantime = 3600 bantime = 3600
-# Время поиска нарушений (5 минут = 300) 
 findtime = 300 findtime = 300
-# Игнорировать локальные IP +ignoreip = ${IGNORE_IP}
-ignoreip = 127.0.0.1/8 ::1 192.168.0.0/24 172.16.0.0/12 10.0.0.0/8+
  
 [nginx-scan-block] [nginx-scan-block]
Строка 263: Строка 290:
 port = http,https port = http,https
 filter = nginx-scan-block filter = nginx-scan-block
-logpath = /opt/fail2ban/logs/nginx-access.log+logpath = ${NGINX_ACCESS_LOG}
 backend = polling backend = polling
 maxretry = 3 maxretry = 3
Строка 274: Строка 301:
 port = http,https   port = http,https  
 filter = nginx-dos-block filter = nginx-dos-block
-logpath = /opt/fail2ban/logs/nginx-access.log+logpath = ${NGINX_ACCESS_LOG}
 backend = polling backend = polling
 maxretry = 50 maxretry = 50
Строка 285: Строка 312:
 port = http,https port = http,https
 filter = nginx-404-flood filter = nginx-404-flood
-logpath = /opt/fail2ban/logs/nginx-access.log+logpath = ${NGINX_ACCESS_LOG}
 backend = polling backend = polling
 maxretry = 10 maxretry = 10
Строка 291: Строка 318:
 findtime = 600 findtime = 600
 action = iptables-multiport[name=nginx-404, port="http,https", protocol=tcp] action = iptables-multiport[name=nginx-404, port="http,https", protocol=tcp]
-EOF +JAIL_EOF
-</code>+
  
-==== Шаг 12: Создание символической ссылки на jail ====+ln -sf "${FAIL2BAN_JAIL_D}/nginx-protection.conf" /etc/fail2ban/jail.d/nginx-protection.conf
  
-<code bash> +log_info "Конфигурация jail создана" 
-ln -sf /opt/fail2ban/config/jail.d/nginx-protection.conf /etc/fail2ban/jail.d/nginx-protection.conf +echo ""
-</code>+
  
-===== Тестирование конфигурации =====+################################################################################ 
 +# Шаг 8: Тестирование 
 +################################################################################
  
-==== Шаг 13: Проверка синтаксиса конфигурации ====+log_info "Тестирование конфигурации..."
  
-<code bash> +if fail2ban-client -t; then 
-fail2ban-client -t +    log_info "Конфигурация корректна" 
-</code>+else 
 +    log_error "Ошибка в конфигурации" 
 +    exit 1 
 +fi 
 +echo ""
  
-Ожидаемый результат: +log_info "Тестирование фильтров..."
-<code> +
-OK: configuration test is successful +
-</code>+
  
-==== Шаг 14Тестирование фильтров на реальных логах ====+fail2ban-regex "${NGINX_ACCESS_LOG}" "${FAIL2BAN_FILTER_D}/nginx-scan-block.conf" | grep -E "Failregex:|matched" 
 +fail2ban-regex "${NGINX_ACCESS_LOG}" "${FAIL2BAN_FILTER_D}/nginx-404-flood.conf" | grep -E "Failregex:|matched" 
 +fail2ban-regex "${NGINX_ACCESS_LOG}" "${FAIL2BAN_FILTER_D}/nginx-dos-block.conf" | grep -E "Failregex:|matched"
  
-<code bash> +echo ""
-fail2ban-regex /opt/fail2ban/logs/nginx-access.log /opt/fail2ban/config/filter.d/nginx-scan-block.conf +
-fail2ban-regex /opt/fail2ban/logs/nginx-access.log /opt/fail2ban/config/filter.d/nginx-404-flood.conf +
-fail2ban-regex /opt/fail2ban/logs/nginx-access.log /opt/fail2ban/config/filter.d/nginx-dos-block.conf +
-</code>+
  
-Должны быть найдены совпадения (matched > 0).+################################################################################ 
 +# Шаг 9: Добавление в cron 
 +################################################################################
  
-===== Запуск и включение автозагрузки =====+log_info "Добавление в cron..."
  
-==== Шаг 15: Включение и запуск Fail2ban ====+CRON_ENTRY="*/2 * * * * ${FAIL2BAN_SCRIPTS}/parse-nginx-logs.sh"
  
-<code bash+if crontab -l 2>/dev/null | grep -q "parse-nginx-logs.sh"; then 
-# Включить автозагрузку +    log_warn "Уже добавлено в cron" 
-systemctl enable fail2ban+else 
 +    (crontab -l 2>/dev/null; echo "$CRON_ENTRY") | crontab - 
 +    log_info "Добавлено в cron" 
 +fi 
 +echo ""
  
-# Запустить службу +################################################################################ 
-systemctl start fail2ban+# Шаг 10: Запуск 
 +################################################################################
  
-# Проверить статус +log_info "Запуск Fail2ban..."
-systemctl status fail2ban +
-</code>+
  
-===== Проверка работы =====+systemctl enable fail2ban >/dev/null 2>&
 +systemctl restart fail2ban
  
-==== Шаг 16: Проверка активных jail ====+sleep 5
  
-<code bash> +if systemctl is-active --quiet fail2ban; then 
-fail2ban-client status +    log_info "Fail2ban успешно запущен" 
-</code>+else 
 +    log_error "Не удалось запустить Fail2ban" 
 +    exit 1 
 +fi 
 +echo ""
  
-Ожидаемый вывод: +################################################################################ 
-<code> +# Проверка 
-Status +################################################################################
-|- Number of jail:      4 +
-`- Jail list:   nginx-404-flood, nginx-dos-block, nginx-scan-block, sshd +
-</code>+
  
-==== Шаг 17: Проверка статуса конкретного jail ====+log_info "Проверка jail..." 
 +echo ""
  
-<code bash>+fail2ban-client status 
 + 
 +echo ""
 fail2ban-client status nginx-scan-block fail2ban-client status nginx-scan-block
 +echo ""
 fail2ban-client status nginx-404-flood fail2ban-client status nginx-404-flood
 +echo ""
 fail2ban-client status nginx-dos-block fail2ban-client status nginx-dos-block
-</code>+echo ""
  
-Пример вывода: +################################################################################ 
-<code> +# Завершение 
-Status for the jail: nginx-scan-block +################################################################################
-|- Filter +
-|  |- Currently failed: 5 +
-|  |- Total failed:     176 +
-|  `- File list:        /opt/fail2ban/logs/nginx-access.log +
-`- Actions +
-   |- Currently banned: 2 +
-   |- Total banned:     2 +
-   `- Banned IP list:   3.96.220.169 56.228.32.138 +
-</code>+
  
-==== Шаг 18: Проверка правил iptables ====+log_info "==========================================" 
 +log_info "Установка завершена успешно!" 
 +log_info "==========================================
 +echo ""
  
-<code bash> +echo "Создано:" 
-iptables --n | grep -"Chain|nginx+echo "  Парсер: ${FAIL2BAN_SCRIPTS}/parse-nginx-logs.sh" 
-</code>+echo "  - Логи: ${NGINX_ACCESS_LOG}
 +echo "  - Фильтры: ${FAIL2BAN_FILTER_D}/
 +echo "  - Jail: ${FAIL2BAN_JAIL_D}/nginx-protection.conf" 
 +echo ""
  
-Ожидаемый результат+echo "Защита:" 
-<code> +echo "  ✅ nginx-scan-block (3 попыткибан 2 часа)" 
-Chain INPUT (policy ACCEPT) +echo "  ✅ nginx-404-flood (10 попыток, бан час)" 
-f2b-nginx-dos  6    --  0.0.0.0/           0.0.0.0/           multiport dports 80,443 +echo "  ✅ nginx-dos-block (50/мин, бан 10 минут)" 
-f2b-nginx-404  6    --  0.0.0.0/           0.0.0.0/           multiport dports 80,443 +echo "  ✅ sshd" 
-f2b-nginx-scan  6    --  0.0.0.0/           0.0.0.0/           multiport dports 80,443 +echo ""
-Chain f2b-nginx-404 (1 references+
-Chain f2b-nginx-dos (1 references) +
-Chain f2b-nginx-scan (1 references+
-</code>+
  
-Детальный просмотр забаненных IP: +echo "Команды:" 
-<code bash>+echo "  fail2ban-client status" 
 +echo "  fail2ban-client status nginx-scan-block" 
 +echo "  iptables -L f2b-nginx-scan -n -v" 
 +echo "  tail -f /var/log/fail2ban.log" 
 +echo "  fail2ban-client unban IP" 
 +echo "" 
 + 
 +cat > "${FAIL2BAN_BASE}/README.md" << 'README_EOF' 
 +# Fail2ban для Nginx Proxy Manager 
 + 
 +## Управление 
 + 
 +### Проверка статуса 
 +```bash 
 +fail2ban-client status 
 +fail2ban-client status nginx-scan-block 
 +``` 
 + 
 +### Разбан IP 
 +```bash 
 +fail2ban-client unban 1.2.3.4 
 +fail2ban-client set nginx-scan-block unbanip 1.2.3.4 
 +``` 
 + 
 +### Ручной бан 
 +```bash 
 +fail2ban-client set nginx-scan-block banip 1.2.3.4 
 +``` 
 + 
 +### Перезапуск 
 +```bash 
 +systemctl restart fail2ban 
 +``` 
 + 
 +### Просмотр логов 
 +```bash 
 +tail -f /var/log/fail2ban.log 
 +tail -f /opt/fail2ban/logs/parser.log 
 +``` 
 + 
 +## Настройка 
 + 
 +Файл: `/opt/fail2ban/config/jail.d/nginx-protection.conf` 
 + 
 +- maxretry - попытки до бана 
 +- findtime - окно поиска (секунды) 
 +- bantime - время бана (секунды) 
 +- ignoreip - исключения 
 + 
 +После изменений: 
 +```bash 
 +systemctl restart fail2ban 
 +``` 
 + 
 +## Мониторинг 
 + 
 +### Забаненные IP 
 +```bash
 iptables -L f2b-nginx-scan -n -v iptables -L f2b-nginx-scan -n -v
 iptables -L f2b-nginx-404 -n -v iptables -L f2b-nginx-404 -n -v
 iptables -L f2b-nginx-dos -n -v iptables -L f2b-nginx-dos -n -v
 +```
 +
 +### Статистика
 +```bash
 +for jail in nginx-scan-block nginx-404-flood nginx-dos-block; do
 +    echo "=== $jail ==="
 +    fail2ban-client status $jail
 +    echo ""
 +done
 +```
 +README_EOF
 +
 +log_info "Установка завершена! Сервер защищен 🛡️"
 </code> </code>
  
-===== Мониторинг =====+==== Шаг 3: Настройка параметров (опционально) ====
  
-==== Просмотр логов Fail2ban ====+Перед запуском вы можете изменить следующие параметры в начале скрипта: 
 + 
 +  * ''NPM_LOG_DIR'' - путь к логам Nginx Proxy Manager 
 +  * ''NPM_CONTAINER_NAME'' - имя контейнера NPM 
 +  * ''IGNORE_IP'' - список игнорируемых IP адресов 
 + 
 +==== Шаг 4: Запуск скрипта ====
  
 <code bash> <code bash>
-# Последние 50 строк +chmod +x install-fail2ban.sh 
-tail -50 /var/log/fail2ban.log+./install-fail2ban.sh 
 +</code>
  
-# Только баны +Скрипт автоматически выполнит все необходимые действия: 
-tail -100 /var/log/fail2ban.log | grep -E "Ban|Unban"+  - Проверит наличие Nginx Proxy Manager 
 +  - Установит Fail2ban 
 +  - Создаст структуру каталогов 
 +  - Создаст и настроит парсер логов 
 +  - Создаст все фильтры 
 +  Настроит jail конфигурацию 
 +  Протестирует конфигурацию 
 +  - Добавит парсер в cron 
 +  - Запустит Fail2ban 
 +  - Выведет статистику работы
  
-# Мониторинг в реальном времени +==== Результат автоматической установки ==== 
-tail -/var/log/fail2ban.log+ 
 +После успешного выполнения скрипта вы увидите
 + 
 +<code> 
 +========================================== 
 +Установка и настройка завершена успешно! 
 +========================================== 
 + 
 +Защита: 
 +  ✅ nginx-scan-block (3 попытки, бан 2 часа) 
 +  ✅ nginx-404-flood (10 попыток, бан 1 час) 
 +  ✅ nginx-dos-block (50/мин, бан 10 минут) 
 +  ✅ sshd
 </code> </code>
  
-==== Просмотр логов парсера ====+===== Ручная установка (пошаговая) ===== 
 + 
 +Если вы предпочитаете ручную установку с полным контролем каждого шага, следуйте инструкциям ниже. 
 + 
 +==== Установка Fail2ban ====
  
 <code bash> <code bash>
-tail -50 /opt/fail2ban/logs/parser.log+apt update 
 +apt install fail2ban -y
 </code> </code>
  
-==== Общая статистика ====+==== Создание структуры каталогов ====
  
 <code bash> <code bash>
-echo "=== NGINX SCAN BLOCK ===" +mkdir -p /opt/fail2ban/{scripts,logs,config/{jail.d,filter.d}}
-fail2ban-client status nginx-scan-block +
-echo "" +
-echo "=== NGINX 404 FLOOD ===" +
-fail2ban-client status nginx-404-flood +
-echo "" +
-echo "=== NGINX DOS BLOCK ===" +
-fail2ban-client status nginx-dos-block+
 </code> </code>
  
-===== Управление банами ===== +==== Создание парсера логов ====
- +
-==== Разбан IP адреса ====+
  
 <code bash> <code bash>
-# Разбан в конкретном jail +nano /opt/fail2ban/scripts/parse-nginx-logs.sh 
-fail2ban-client set nginx-scan-block unbanip 1.2.3.4+</code>
  
-# Разбан во всех jail +Содержимое файла указано в автоматическом скрипте выше (раздел PARSER_EOF). 
-fail2ban-client unban 1.2.3.4+ 
 +Установка прав: 
 + 
 +<code bash> 
 +chmod +x /opt/fail2ban/scripts/parse-nginx-logs.sh
 </code> </code>
  
-==== Ручной бан IP адреса ====+Первый запуск:
  
 <code bash> <code bash>
-fail2ban-client set nginx-scan-block banip 1.2.3.4+/opt/fail2ban/scripts/parse-nginx-logs.sh 
 +ls -lh /opt/fail2ban/logs/nginx-access.log
 </code> </code>
  
-===== Настройка параметров защиты =====+Добавление в cron:
  
-==== Описание параметров jail ====+<code bash> 
 +(crontab -l 2>/dev/null; echo "*/2 * * * * /opt/fail2ban/scripts/parse-nginx-logs.sh") | crontab - 
 +crontab -l 
 +</code>
  
-^ Параметр ^ Описание ^ Рекомендуемое значение +==== Создание фильтров ====
-| ''maxretry'' | Количество попыток до бана | 3-10 для scan, 50 для DoS, 10 для 404 | +
-| ''findtime'' | Временное окно поиска нарушений (секунды) | 300 (5 минут) | +
-| ''bantime'' | Время бана (секунды) | 3600-7200 (1-2 часа) |+
  
-==== nginx-scan-block (сканирование) ====+<code bash> 
 +# Фильтр сканирования 
 +cat > /opt/fail2ban/config/filter.d/nginx-scan-block.conf << 'EOF' 
 +[Definition]
  
-  * **maxretry**: 3 попытки +failregex = ^\[.*\] - \d+ \d+ - GET https? .".*(/\.env|/\.git|/\.aws|/\.ssh|/config|/backup|wp-config|phpinfo|admin/config|server-status|server-info).*" \[Client <HOST>\] 
-  * **findtime**: 300 секунд (5 минут+            ^\[.*\] - 40\d \d+ - GET https? .* ".*\.(php|asp|jsp|cgi|pl|py).*" \[Client <HOST>\] 
-  * **bantime**: 7200 секунд (2 часа)+            ^\[.*\] - \d+ \d+ - GET https? .".*\.\.\/.*" \[Client <HOST>\] 
 +            ^\[.*\] - \d+ \d+ - GET https? .* ".*(union|select|insert|update|delete|drop|create|alter).*" \[Client <HOST>\] 
 +            ^\[.*\] - \d+ \d+ - (GET|POST) https? .".*(<script|javascript:|vbscript:|onload|onerror).*" \[Client <HOST>\] 
 +            ^\[.*\] - \d+ \d+ - (GET|POSThttps? .* ".*(\||`|;|<|>|\\|\{|\}|\[|\]).*" \[Client <HOST>\] 
 +            ^\[.*\] - \d+ \d+ - GET https? .* ".*/(etc/|var/|bin/|usr/bin/|tmp/|proc/).*" \[Client <HOST>\]
  
-Блокирует попытки доступа к: +ignoreregex = 
-  * Конфигурационным файлам (.env, .git, wp-config.php) +EOF
-  * Скриптам (.php, .asp, .jsp, .cgi) +
-  * SQL инъекциям +
-  * XSS атакам +
-  * Path traversal+
  
-==== nginx-404-flood (404 флуд) ====+# Фильтр 404 
 +cat > /opt/fail2ban/config/filter.d/nginx-404-flood.conf << 'EOF' 
 +[Definition]
  
-  **maxretry**: 10 попыток +failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEADhttps? .".*" \[Client <HOST>\]
-  * **findtime**: 600 секунд (10 минут) +
-  * **bantime**: 3600 секунд (1 час)+
  
-Блокирует множественные запросы к несуществующим страницам.+ignoreregex = 
 +EOF
  
-==== nginx-dos-block (DoS атаки) ====+# Фильтр DoS 
 +cat > /opt/fail2ban/config/filter.d/nginx-dos-block.conf << 'EOF' 
 +[Definition]
  
-  **maxretry**: 50 запросов +failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEADhttps? .".*" \[Client <HOST>\]
-  * **findtime**: 60 секунд (1 минута) +
-  * **bantime**: 600 секунд (10 минут)+
  
-Блокирует слишком частые запросы, игнорируя статические файлы (cssjs, изображения).+ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* ".*\.(css|js|jpg|jpeg|png|gif|ico|woff|woff2|ttf|svg).*" \[Client <HOST>\] 
 +EOF
  
-===== Troubleshooting =====+# Символические ссылки 
 +ln -sf /opt/fail2ban/config/filter.d/nginx-scan-block.conf /etc/fail2ban/filter.d/ 
 +ln -sf /opt/fail2ban/config/filter.d/nginx-404-flood.conf /etc/fail2ban/filter.d/ 
 +ln -sf /opt/fail2ban/config/filter.d/nginx-dos-block.conf /etc/fail2ban/filter.d/ 
 +</code>
  
-==== Fail2ban не запускается ====+==== Создание конфигурации jail ==== 
 + 
 +**ВАЖНО:** Замените IP адреса в параметре ''ignoreip'' на свои.
  
-Проверка логов: 
 <code bash> <code bash>
-journalctl -xeu fail2ban +cat > /opt/fail2ban/config/jail.d/nginx-protection.conf << 'EOF' 
-systemctl status fail2ban+[DEFAULT] 
 +bantime = 3600 
 +findtime = 300 
 +ignoreip = 127.0.0.1/8 ::1 192.168.0.0/24 172.16.0.0/12 10.0.0.0/
 + 
 +[nginx-scan-block] 
 +enabled = true 
 +port = http,https 
 +filter = nginx-scan-block 
 +logpath = /opt/fail2ban/logs/nginx-access.log 
 +backend = polling 
 +maxretry = 3 
 +bantime = 7200 
 +findtime = 300 
 +action = iptables-multiport[name=nginx-scan, port="http,https", protocol=tcp] 
 + 
 +[nginx-dos-block] 
 +enabled = true 
 +port = http,https   
 +filter = nginx-dos-block 
 +logpath = /opt/fail2ban/logs/nginx-access.log 
 +backend = polling 
 +maxretry = 50 
 +bantime = 600 
 +findtime = 60 
 +action = iptables-multiport[name=nginx-dos, port="http,https", protocol=tcp] 
 + 
 +[nginx-404-flood] 
 +enabled = true 
 +port = http,https 
 +filter = nginx-404-flood 
 +logpath = /opt/fail2ban/logs/nginx-access.log 
 +backend = polling 
 +maxretry = 10 
 +bantime = 3600 
 +findtime = 600 
 +action = iptables-multiport[name=nginx-404, port="http,https", protocol=tcp] 
 +EOF 
 + 
 +ln -sf /opt/fail2ban/config/jail.d/nginx-protection.conf /etc/fail2ban/jail.d/
 </code> </code>
  
-Проверка конфигурации:+==== Тестирование и запуск ==== 
 <code bash> <code bash>
-fail2ban-client -d+# Тест конфигурации 
 +fail2ban-client -
 + 
 +# Тест фильтров 
 +fail2ban-regex /opt/fail2ban/logs/nginx-access.log /opt/fail2ban/config/filter.d/nginx-scan-block.conf 
 + 
 +# Запуск 
 +systemctl enable fail2ban 
 +systemctl start fail2ban 
 +systemctl status fail2ban
 </code> </code>
  
-==== Jail не банит атаки ====+===== Проверка работы =====
  
-Проверка чтения лог-файла: 
 <code bash> <code bash>
 +# Статус jail
 +fail2ban-client status
 fail2ban-client status nginx-scan-block fail2ban-client status nginx-scan-block
 +
 +# Правила iptables
 +iptables -L -n | grep nginx
 +iptables -L f2b-nginx-scan -n -v
 </code> </code>
  
-Должно быть ''File list: /opt/fail2ban/logs/nginx-access.log'', а не ''Journal matches''.+===== Управление =====
  
-Если видите ''Journal matches'', убедитесь что в конфигурации jail указан ''backend polling''.+==== Проверка статуса ====
  
-==== Фильтры не находят совпадений ==== 
- 
-Тестирование фильтра: 
 <code bash> <code bash>
-fail2ban-regex /opt/fail2ban/logs/nginx-access.log /opt/fail2ban/config/filter.d/nginx-scan-block.conf --print-all-matched+fail2ban-client status 
 +fail2ban-client status nginx-scan-block
 </code> </code>
  
-Проверка формата логов:+==== Разбан IP ==== 
 <code bash> <code bash>
-head -3 /opt/fail2ban/logs/nginx-access.log+fail2ban-client unban 1.2.3.4 
 +fail2ban-client set nginx-scan-block unbanip 1.2.3.4
 </code> </code>
  
-Формат должен быть: +==== Ручной бан ==== 
-<code> + 
-[DATE] STATUS STATUS METHOD PROTOCOL DOMAIN "PATH" [Client IP] ...+<code bash
 +fail2ban-client set nginx-scan-block banip 1.2.3.4
 </code> </code>
  
-==== Парсер не создает лог-файл ====+==== Просмотр логов ====
  
-Проверка работы парсера: 
 <code bash> <code bash>
-bash -/opt/fail2ban/scripts/parse-nginx-logs.sh +tail -/var/log/fail2ban.log 
-cat /opt/fail2ban/logs/parser.log+tail -f /opt/fail2ban/logs/parser.log 
 +tail -100 /var/log/fail2ban.log | grep -E "Ban|Unban"
 </code> </code>
  
-Проверка наличия логов Nginx Proxy Manager:+===== Настройка параметров ===== 
 + 
 +^ Параметр ^ Описание ^ Значение ^ 
 +| maxretry | Попытки до бана | 3-10 для scan, 50 для DoS | 
 +| findtime | Окно поиска (секунды) | 300 (5 минут) | 
 +| bantime | Время бана (секунды) | 3600-7200 (1-2 часа) | 
 + 
 +Файл: ''/opt/fail2ban/config/jail.d/nginx-protection.conf'' 
 + 
 +После изменений: 
 <code bash> <code bash>
-ls -la /opt/nginxpm/data/logs/proxy-host-*_access.log+systemctl restart fail2ban
 </code> </code>
  
-Проверка работы контейнера:+===== Troubleshooting ===== 
 + 
 +==== Fail2ban не запускается ==== 
 <code bash> <code bash>
-docker ps | grep nginxpm+journalctl -xeu fail2ban 
 +fail2ban-client -d
 </code> </code>
  
-===== Автоматическое обновление ====+==== Jail не банит ====
- +
-Fail2ban обновляется вместе с системой:+
  
 <code bash> <code bash>
-apt update +fail2ban-client status nginx-scan-block
-apt upgrade fail2ban -+
-systemctl restart fail2ban+
 </code> </code>
  
-===== Резервное копирование =====+Должно быть: ''File list: /opt/fail2ban/logs/nginx-access.log''
  
-==== Файлы для бэкапа ====+Если ''Journal matches'' - добавьте ''backend = polling'' в jail. 
 + 
 +==== Фильтры не работают ====
  
 <code bash> <code bash>
-# Конфигурация +fail2ban-regex /opt/fail2ban/logs/nginx-access.log /opt/fail2ban/config/filter.d/nginx-scan-block.conf --print-all-matched 
-/opt/fail2ban/config/+head -3 /opt/fail2ban/logs/nginx-access.log 
 +</code>
  
-# Скрипты +==== Парсер не работает ====
-/opt/fail2ban/scripts/+
  
-# Логи (опционально) +<code bash> 
-/opt/fail2ban/logs/+bash -x /opt/fail2ban/scripts/parse-nginx-logs.sh 
 +cat /opt/fail2ban/logs/parser.log 
 +ls -la /opt/nginxpm/data/logs/ 
 +docker ps | grep nginxpm
 </code> </code>
  
-==== Создание бэкапа ====+===== Резервное копирование =====
  
 <code bash> <code bash>
 tar -czf fail2ban-backup-$(date +%Y%m%d).tar.gz \ tar -czf fail2ban-backup-$(date +%Y%m%d).tar.gz \
   /opt/fail2ban/config/ \   /opt/fail2ban/config/ \
-  /opt/fail2ban/scripts/ +  /opt/fail2ban/scripts/
-  /etc/fail2ban/jail.d/nginx-protection.conf \ +
-  /etc/fail2ban/filter.d/nginx-*.conf+
 </code> </code>
  
Строка 587: Строка 795:
  
 <code bash> <code bash>
-# Остановить службу 
 systemctl stop fail2ban systemctl stop fail2ban
 systemctl disable fail2ban systemctl disable fail2ban
- 
-# Удалить пакет 
 apt remove --purge fail2ban -y apt remove --purge fail2ban -y
- 
-# Удалить конфигурацию 
 rm -rf /opt/fail2ban rm -rf /opt/fail2ban
 rm -f /etc/fail2ban/jail.d/nginx-protection.conf rm -f /etc/fail2ban/jail.d/nginx-protection.conf
-rm -f /etc/fail2ban/filter.d/nginx-scan-block.conf +rm -f /etc/fail2ban/filter.d/nginx-*.conf 
-rm -f /etc/fail2ban/filter.d/nginx-404-flood.conf +crontab -e  # Удалить строку с parse-nginx-logs.sh
-rm -f /etc/fail2ban/filter.d/nginx-dos-block.conf +
- +
-# Удалить из cron +
-crontab -e +
-# Удалить строку с parse-nginx-logs.sh +
- +
-# Очистить правила iptables+
 iptables -F iptables -F
 </code> </code>
- 
-===== Заключение ===== 
- 
-После выполнения всех шагов ваш сервер будет защищен от: 
-  * ✅ Сканирования уязвимостей 
-  * ✅ 404 флуда 
-  * ✅ DoS атак 
-  * ✅ SSH брутфорса 
- 
-Fail2ban автоматически: 
-  * Собирает логи из Nginx Proxy Manager каждые 2 минуты 
-  * Анализирует запросы на предмет атак 
-  * Блокирует подозрительные IP на уровне iptables 
-  * Автоматически разбанивает IP после истечения времени бана 
  
 ===== Полезные ссылки ===== ===== Полезные ссылки =====
  • vm/nginx/06-file2ban_v2.1764590944.txt.gz
  • Последнее изменение: 2025/12/01 12:09
  • admin