Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия | |||
| vm:nginx:06-file2ban_v2 [2025/12/01 12:16] – admin | vm:nginx:06-file2ban_v2 [2025/12/01 12:19] (текущий) – admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Установка и настройка Fail2ban для Nginx Proxy Manager ====== | ||
| + | |||
| + | ===== Описание ===== | ||
| + | |||
| + | Данная инструкция описывает процесс установки и настройки Fail2ban для защиты Nginx Proxy Manager от: | ||
| + | * Сканирования уязвимостей | ||
| + | * 404 флуда | ||
| + | * DoS атак | ||
| + | * SSH брутфорса | ||
| + | |||
| + | ===== Требования ===== | ||
| + | |||
| + | * Ubuntu Server 24.04 (или аналогичный дистрибутив) | ||
| + | * Nginx Proxy Manager установленный в Docker | ||
| + | * Root доступ к серверу | ||
| + | |||
| + | ===== Быстрая установка (автоматический скрипт) ===== | ||
| + | |||
| + | **Рекомендуется: | ||
| + | |||
| + | ==== Шаг 1: Создание скрипта установки ==== | ||
| + | |||
| + | <code bash> | ||
| + | nano install-fail2ban.sh | ||
| + | </ | ||
| + | |||
| + | ==== Шаг 2: Содержимое скрипта ==== | ||
| + | |||
| + | Скопируйте следующий код в файл: | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | ################################################################################ | ||
| + | # Скрипт автоматической установки и настройки Fail2ban для Nginx Proxy Manager | ||
| + | # Версия: | ||
| + | # Дата: 2025-11-30 | ||
| + | ################################################################################ | ||
| + | |||
| + | set -e # Остановка при ошибке | ||
| + | |||
| + | # Цвета для вывода | ||
| + | RED=' | ||
| + | GREEN=' | ||
| + | YELLOW=' | ||
| + | NC=' | ||
| + | |||
| + | # Функция вывода сообщений | ||
| + | log_info() { | ||
| + | echo -e " | ||
| + | } | ||
| + | |||
| + | log_warn() { | ||
| + | echo -e " | ||
| + | } | ||
| + | |||
| + | log_error() { | ||
| + | echo -e " | ||
| + | } | ||
| + | |||
| + | # Проверка прав root | ||
| + | if [[ $EUID -ne 0 ]]; then | ||
| + | | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # НАСТРОЙКИ - ИЗМЕНИТЕ ПОД СВОИ НУЖДЫ | ||
| + | ################################################################################ | ||
| + | |||
| + | # Путь к логам Nginx Proxy Manager | ||
| + | NPM_LOG_DIR="/ | ||
| + | |||
| + | # Имя контейнера Nginx Proxy Manager | ||
| + | NPM_CONTAINER_NAME=" | ||
| + | |||
| + | # Директории Fail2ban | ||
| + | FAIL2BAN_BASE="/ | ||
| + | FAIL2BAN_SCRIPTS=" | ||
| + | FAIL2BAN_LOGS=" | ||
| + | FAIL2BAN_CONFIG=" | ||
| + | FAIL2BAN_JAIL_D=" | ||
| + | FAIL2BAN_FILTER_D=" | ||
| + | |||
| + | # Файл лога для fail2ban | ||
| + | NGINX_ACCESS_LOG=" | ||
| + | |||
| + | # Игнорируемые IP (локальные сети) | ||
| + | IGNORE_IP=" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 1: Проверка существования Nginx Proxy Manager | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | if ! docker ps --format " | ||
| + | log_error " | ||
| + | log_error " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if [ ! -d " | ||
| + | log_error " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 2: Установка Fail2ban | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | apt update -qq | ||
| + | apt install -y fail2ban >/ | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 3: Создание структуры каталогов | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | mkdir -p " | ||
| + | mkdir -p " | ||
| + | mkdir -p " | ||
| + | mkdir -p " | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 4: Создание скрипта парсера логов | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | cat > " | ||
| + | #!/bin/bash | ||
| + | # Скрипт парсинга логов nginx-proxy-manager для fail2ban | ||
| + | |||
| + | LOG_DIR="/ | ||
| + | LOG_FILE="/ | ||
| + | CONTAINER_NAME=" | ||
| + | PARSER_LOG="/ | ||
| + | |||
| + | mkdir -p " | ||
| + | |||
| + | if ! docker ps --format "table {{.Names}}" | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if [ ! -d " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | > " | ||
| + | |||
| + | processed_files=0 | ||
| + | total_lines=0 | ||
| + | |||
| + | for logfile in " | ||
| + | if [ -f " | ||
| + | lines_from_file=$(tail -n 2000 " | ||
| + | tail -n 2000 " | ||
| + | processed_files=$((processed_files + 1)) | ||
| + | total_lines=$((total_lines + lines_from_file)) | ||
| + | echo " | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | if [ $processed_files -eq 0 ]; then | ||
| + | echo " | ||
| + | touch " | ||
| + | fi | ||
| + | |||
| + | chmod 644 " | ||
| + | |||
| + | MINUTE=$(date +%M) | ||
| + | if [ " | ||
| + | final_lines=$(wc -l < " | ||
| + | echo " | ||
| + | fi | ||
| + | |||
| + | if [ -f " | ||
| + | mv " | ||
| + | touch " | ||
| + | chmod 644 " | ||
| + | fi | ||
| + | |||
| + | if [ -f " | ||
| + | mv " | ||
| + | touch " | ||
| + | chmod 644 " | ||
| + | echo " | ||
| + | fi | ||
| + | |||
| + | exit 0 | ||
| + | PARSER_EOF | ||
| + | |||
| + | chmod +x " | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 5: Первый запуск парсера | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | " | ||
| + | |||
| + | if [ -f " | ||
| + | log_info " | ||
| + | log_info " | ||
| + | else | ||
| + | log_error "Не удалось создать лог-файл" | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 6: Создание фильтров Fail2ban | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | cat > " | ||
| + | [Definition] | ||
| + | |||
| + | failregex = ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| + | ^\[.*\] - 40\d \d+ - GET https? .* " | ||
| + | ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| + | ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| + | ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| + | ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| + | ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| + | |||
| + | ignoreregex = | ||
| + | FILTER_SCAN_EOF | ||
| + | |||
| + | cat > " | ||
| + | [Definition] | ||
| + | |||
| + | failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* " | ||
| + | |||
| + | ignoreregex = | ||
| + | FILTER_404_EOF | ||
| + | |||
| + | cat > " | ||
| + | [Definition] | ||
| + | |||
| + | failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEAD) https? .* " | ||
| + | |||
| + | ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| + | FILTER_DOS_EOF | ||
| + | |||
| + | ln -sf " | ||
| + | ln -sf " | ||
| + | ln -sf " | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 7: Создание конфигурации jail | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | cat > " | ||
| + | [DEFAULT] | ||
| + | bantime = 3600 | ||
| + | findtime = 300 | ||
| + | ignoreip = ${IGNORE_IP} | ||
| + | |||
| + | [nginx-scan-block] | ||
| + | enabled = true | ||
| + | port = http,https | ||
| + | filter = nginx-scan-block | ||
| + | logpath = ${NGINX_ACCESS_LOG} | ||
| + | backend = polling | ||
| + | maxretry = 3 | ||
| + | bantime = 7200 | ||
| + | findtime = 300 | ||
| + | action = iptables-multiport[name=nginx-scan, | ||
| + | |||
| + | [nginx-dos-block] | ||
| + | enabled = true | ||
| + | port = http, | ||
| + | filter = nginx-dos-block | ||
| + | logpath = ${NGINX_ACCESS_LOG} | ||
| + | backend = polling | ||
| + | maxretry = 50 | ||
| + | bantime = 600 | ||
| + | findtime = 60 | ||
| + | action = iptables-multiport[name=nginx-dos, | ||
| + | |||
| + | [nginx-404-flood] | ||
| + | enabled = true | ||
| + | port = http,https | ||
| + | filter = nginx-404-flood | ||
| + | logpath = ${NGINX_ACCESS_LOG} | ||
| + | backend = polling | ||
| + | maxretry = 10 | ||
| + | bantime = 3600 | ||
| + | findtime = 600 | ||
| + | action = iptables-multiport[name=nginx-404, | ||
| + | JAIL_EOF | ||
| + | |||
| + | ln -sf " | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 8: Тестирование | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | if fail2ban-client -t; then | ||
| + | log_info " | ||
| + | else | ||
| + | log_error " | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo "" | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | fail2ban-regex " | ||
| + | fail2ban-regex " | ||
| + | fail2ban-regex " | ||
| + | |||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 9: Добавление в cron | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | CRON_ENTRY=" | ||
| + | |||
| + | if crontab -l 2>/ | ||
| + | log_warn " | ||
| + | else | ||
| + | (crontab -l 2>/ | ||
| + | log_info " | ||
| + | fi | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Шаг 10: Запуск | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | |||
| + | systemctl enable fail2ban >/ | ||
| + | systemctl restart fail2ban | ||
| + | |||
| + | sleep 5 | ||
| + | |||
| + | if systemctl is-active --quiet fail2ban; then | ||
| + | log_info " | ||
| + | else | ||
| + | log_error "Не удалось запустить Fail2ban" | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Проверка | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | fail2ban-client status | ||
| + | |||
| + | echo "" | ||
| + | fail2ban-client status nginx-scan-block | ||
| + | echo "" | ||
| + | fail2ban-client status nginx-404-flood | ||
| + | echo "" | ||
| + | fail2ban-client status nginx-dos-block | ||
| + | echo "" | ||
| + | |||
| + | ################################################################################ | ||
| + | # Завершение | ||
| + | ################################################################################ | ||
| + | |||
| + | log_info " | ||
| + | log_info " | ||
| + | log_info " | ||
| + | echo "" | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | |||
| + | cat > " | ||
| + | # Fail2ban для Nginx Proxy Manager | ||
| + | |||
| ## Управление | ## Управление | ||
| Строка 29: | Строка 463: | ||
| ``` | ``` | ||
| - | ## Настройка | + | ## Настройка |
| - | Редактировать файл: `/ | + | Файл: `/ |
| - | - `maxretry` - количество | + | - maxretry - попытки до бана |
| - | - `findtime` - временное | + | - findtime - окно поиска (секунды) |
| - | - `bantime` - время бана (секунды) | + | - bantime - время бана (секунды) |
| - | - `ignoreip` - игнорируемые IP | + | - ignoreip - исключения |
| После изменений: | После изменений: | ||
| Строка 45: | Строка 479: | ||
| ## Мониторинг | ## Мониторинг | ||
| - | ### Просмотр забаненных IP | + | ### Забаненные IP |
| ```bash | ```bash | ||
| iptables -L f2b-nginx-scan -n -v | iptables -L f2b-nginx-scan -n -v | ||
| Строка 62: | Строка 496: | ||
| README_EOF | README_EOF | ||
| - | log_info " | + | log_info " |
| - | echo "" | + | |
| - | + | ||
| - | log_info " | + | |
| </ | </ | ||
| Строка 104: | Строка 535: | ||
| ========================================== | ========================================== | ||
| - | Создано: | + | Защита: |
| - | - Скрипт парсера: / | + | ✅ nginx-scan-block |
| - | - Лог-файл: | + | ✅ nginx-404-flood |
| - | - Фильтры: | + | ✅ nginx-dos-block (50/ |
| - | - Конфигурация jail: / | + | ✅ sshd |
| - | + | ||
| - | Активные защиты: | + | |
| - | ✅ nginx-scan-block | + | |
| - | ✅ nginx-404-flood | + | |
| - | ✅ nginx-dos-block | + | |
| - | ✅ sshd - Защита SSH | + | |
| </ | </ | ||
| Строка 134: | Строка 559: | ||
| </ | </ | ||
| - | ==== Создание парсера логов | + | ==== Создание парсера логов ==== |
| - | + | ||
| - | Создайте файл / | + | |
| <code bash> | <code bash> | ||
| - | cat > / | + | nano / |
| - | # | + | |
| - | # Скрипт парсинга логов nginx-proxy-manager для fail2ban | + | |
| - | # Обрабатывает все access логи из папки nginxpm | + | |
| - | + | ||
| - | LOG_DIR="/ | + | |
| - | LOG_FILE="/ | + | |
| - | CONTAINER_NAME=" | + | |
| - | PARSER_LOG="/ | + | |
| - | + | ||
| - | # Создаем директории если они не существуют | + | |
| - | mkdir -p " | + | |
| - | + | ||
| - | # Проверяем, | + | |
| - | if ! docker ps --format "table {{.Names}}" | + | |
| - | echo " | + | |
| - | exit 1 | + | |
| - | fi | + | |
| - | + | ||
| - | # Проверяем существование директории с логами | + | |
| - | if [ ! -d " | + | |
| - | echo " | + | |
| - | exit 1 | + | |
| - | fi | + | |
| - | + | ||
| - | # Очищаем целевой файл | + | |
| - | > " | + | |
| - | + | ||
| - | # Счетчик обработанных файлов и строк | + | |
| - | processed_files=0 | + | |
| - | total_lines=0 | + | |
| - | + | ||
| - | # Обрабатываем все файлы с окончанием *_access.log | + | |
| - | for logfile in " | + | |
| - | # Проверяем, | + | |
| - | if [ -f " | + | |
| - | lines_from_file=$(tail -n 2000 " | + | |
| - | tail -n 2000 " | + | |
| - | processed_files=$((processed_files + 1)) | + | |
| - | total_lines=$((total_lines + lines_from_file)) | + | |
| - | echo " | + | |
| - | fi | + | |
| - | done | + | |
| - | + | ||
| - | # Если не найдено ни одного файла логов | + | |
| - | if [ $processed_files -eq 0 ]; then | + | |
| - | echo " | + | |
| - | # Создаем пустой файл чтобы fail2ban не ругался | + | |
| - | touch " | + | |
| - | fi | + | |
| - | + | ||
| - | # Устанавливаем права доступа | + | |
| - | chmod 644 " | + | |
| - | + | ||
| - | # Логируем статистику каждый час (когда минуты = 00) | + | |
| - | MINUTE=$(date +%M) | + | |
| - | if [ " | + | |
| - | final_lines=$(wc -l < " | + | |
| - | echo " | + | |
| - | fi | + | |
| - | + | ||
| - | # Ротация логов parser.log (если больше 5MB) | + | |
| - | if [ -f " | + | |
| - | mv " | + | |
| - | touch " | + | |
| - | chmod 644 " | + | |
| - | fi | + | |
| - | + | ||
| - | # Удаление записей старше 30 дней из лог-файла | + | |
| - | if [ -f " | + | |
| - | CUTOFF_DATE=$(date -d '30 days ago' ' | + | |
| - | TEMP_FILTERED="/ | + | |
| - | + | ||
| - | # Фильтруем записи не старше 30 дней | + | |
| - | awk -v cutoff=" | + | |
| - | { | + | |
| - | # Извлекаем дату из строки лога (формат: | + | |
| - | match($0, / | + | |
| - | if (date_match[1]) { | + | |
| - | # Преобразуем дату в timestamp для сравнения | + | |
| - | cmd = "date -d \"" | + | |
| - | cmd | getline log_timestamp | + | |
| - | close(cmd) | + | |
| - | + | ||
| - | cmd2 = "date -d \"" | + | |
| - | cmd2 | getline cutoff_timestamp | + | |
| - | close(cmd2) | + | |
| - | + | ||
| - | # Если дата лога >= даты отсечки, | + | |
| - | if (log_timestamp >= cutoff_timestamp) { | + | |
| - | print $0 | + | |
| - | } | + | |
| - | } else { | + | |
| - | # Если не удалось извлечь дату, оставляем запись | + | |
| - | print $0 | + | |
| - | } | + | |
| - | }' " | + | |
| - | + | ||
| - | # Заменяем оригинальный файл отфильтрованным | + | |
| - | if [ -f " | + | |
| - | mv " | + | |
| - | chmod 644 " | + | |
| - | fi | + | |
| - | fi | + | |
| - | + | ||
| - | # Ротация основного лог-файла (если больше 10MB) | + | |
| - | if [ -f " | + | |
| - | mv " | + | |
| - | touch " | + | |
| - | chmod 644 " | + | |
| - | echo " | + | |
| - | fi | + | |
| - | + | ||
| - | exit 0 | + | |
| - | EOF | + | |
| </ | </ | ||
| - | Установка прав на скрипт: | + | Содержимое файла указано в автоматическом |
| + | |||
| + | Установка прав: | ||
| <code bash> | <code bash> | ||
| Строка 262: | Строка 573: | ||
| </ | </ | ||
| - | Первый запуск | + | Первый запуск: |
| <code bash> | <code bash> | ||
| / | / | ||
| ls -lh / | ls -lh / | ||
| - | tail -10 / | ||
| </ | </ | ||
| - | Добавление | + | Добавление в cron: |
| <code bash> | <code bash> | ||
| (crontab -l 2>/ | (crontab -l 2>/ | ||
| - | </ | ||
| - | |||
| - | Проверка добавления в cron: | ||
| - | |||
| - | <code bash> | ||
| crontab -l | crontab -l | ||
| </ | </ | ||
| - | ==== Настройка фильтров Fail2ban ==== | + | ==== Создание фильтров |
| - | + | ||
| - | Создание фильтра для блокировки сканирования: | + | |
| <code bash> | <code bash> | ||
| + | # Фильтр сканирования | ||
| cat > / | cat > / | ||
| [Definition] | [Definition] | ||
| - | # Формат NPM: [DATE] - STATUS STATUS - METHOD PROTOCOL DOMAIN " | ||
| failregex = ^\[.*\] - \d+ \d+ - GET https? .* " | failregex = ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| ^\[.*\] - 40\d \d+ - GET https? .* " | ^\[.*\] - 40\d \d+ - GET https? .* " | ||
| Строка 301: | Строка 604: | ||
| ignoreregex = | ignoreregex = | ||
| EOF | EOF | ||
| - | </ | ||
| - | Создание фильтра для блокировки | + | # Фильтр 404 |
| - | + | ||
| - | <code bash> | + | |
| cat > / | cat > / | ||
| [Definition] | [Definition] | ||
| - | # Блокировка множественных 404 ошибок | ||
| failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* " | failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* " | ||
| ignoreregex = | ignoreregex = | ||
| EOF | EOF | ||
| - | </ | ||
| - | Создание фильтра для блокировки | + | # Фильтр DoS |
| - | + | ||
| - | <code bash> | + | |
| cat > / | cat > / | ||
| [Definition] | [Definition] | ||
| - | # Блокировка слишком частых запросов (DoS) | ||
| failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEAD) https? .* " | failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEAD) https? .* " | ||
| ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| EOF | EOF | ||
| - | </ | ||
| - | Создание символических ссылок на фильтры: | + | # Символические ссылки |
| - | + | ln -sf / | |
| - | <code bash> | + | ln -sf / |
| - | ln -sf / | + | ln -sf / |
| - | ln -sf / | + | |
| - | ln -sf / | + | |
| </ | </ | ||
| - | ==== Настройка jail для Nginx Proxy Manager | + | ==== Создание |
| - | **ВАЖНО: | + | **ВАЖНО: |
| <code bash> | <code bash> | ||
| cat > / | cat > / | ||
| - | # Jail конфигурация для nginx защиты | ||
| [DEFAULT] | [DEFAULT] | ||
| - | # Время бана в секундах (1 час = 3600) | ||
| bantime = 3600 | bantime = 3600 | ||
| - | # Время поиска нарушений (5 минут = 300) | ||
| findtime = 300 | findtime = 300 | ||
| - | # Игнорировать локальные IP | ||
| ignoreip = 127.0.0.1/8 ::1 192.168.0.0/ | ignoreip = 127.0.0.1/8 ::1 192.168.0.0/ | ||
| Строка 385: | Строка 673: | ||
| action = iptables-multiport[name=nginx-404, | action = iptables-multiport[name=nginx-404, | ||
| EOF | EOF | ||
| - | </ | ||
| - | Создание символической ссылки на jail: | + | ln -sf / |
| - | + | ||
| - | <code bash> | + | |
| - | ln -sf / | + | |
| </ | </ | ||
| - | ==== Тестирование | + | ==== Тестирование и запуск ==== |
| - | + | ||
| - | Проверка синтаксиса конфигурации: | + | |
| <code bash> | <code bash> | ||
| + | # Тест конфигурации | ||
| fail2ban-client -t | fail2ban-client -t | ||
| - | </ | ||
| - | Ожидаемый результат: | + | # Тест фильтров |
| - | < | + | |
| - | OK: configuration test is successful | + | |
| - | </ | + | |
| - | + | ||
| - | Тестирование | + | |
| - | + | ||
| - | <code bash> | + | |
| fail2ban-regex / | fail2ban-regex / | ||
| - | fail2ban-regex / | ||
| - | fail2ban-regex / | ||
| - | </ | ||
| - | Должны быть найдены совпадения (matched > 0). | + | # Запуск |
| - | + | ||
| - | ==== Запуск | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Включить автозагрузку | + | |
| systemctl enable fail2ban | systemctl enable fail2ban | ||
| - | |||
| - | # Запустить службу | ||
| systemctl start fail2ban | systemctl start fail2ban | ||
| - | |||
| - | # Проверить статус | ||
| systemctl status fail2ban | systemctl status fail2ban | ||
| </ | </ | ||
| ===== Проверка работы ===== | ===== Проверка работы ===== | ||
| - | |||
| - | ==== Проверка активных jail ==== | ||
| <code bash> | <code bash> | ||
| + | # Статус jail | ||
| fail2ban-client status | fail2ban-client status | ||
| - | </ | + | fail2ban-client status nginx-scan-block |
| - | Ожидаемый вывод: | + | # Правила iptables |
| - | < | + | iptables |
| - | Status | + | iptables |
| - | |- Number of jail: 4 | + | |
| - | `- Jail list: nginx-404-flood, | + | |
| </ | </ | ||
| - | ==== Проверка статуса | + | ===== Управление ===== |
| + | |||
| + | ==== Проверка статуса ==== | ||
| <code bash> | <code bash> | ||
| + | fail2ban-client status | ||
| fail2ban-client status nginx-scan-block | fail2ban-client status nginx-scan-block | ||
| - | fail2ban-client status nginx-404-flood | ||
| - | fail2ban-client status nginx-dos-block | ||
| - | </ | ||
| - | |||
| - | Пример вывода: | ||
| - | < | ||
| - | Status for the jail: nginx-scan-block | ||
| - | |- Filter | ||
| - | | |- Currently failed: 5 | ||
| - | | |- Total failed: | ||
| - | | `- File list: / | ||
| - | `- Actions | ||
| - | |- Currently banned: 2 | ||
| - | |- Total banned: | ||
| - | `- Banned IP list: | ||
| </ | </ | ||
| - | ==== Проверка правил iptables | + | ==== Разбан IP ==== |
| <code bash> | <code bash> | ||
| - | iptables | + | fail2ban-client unban 1.2.3.4 |
| + | fail2ban-client set nginx-scan-block unbanip 1.2.3.4 | ||
| </ | </ | ||
| - | Ожидаемый результат: | + | ==== Ручной бан ==== |
| - | < | + | |
| - | Chain INPUT (policy ACCEPT) | + | |
| - | f2b-nginx-dos | + | |
| - | f2b-nginx-404 | + | |
| - | f2b-nginx-scan | + | |
| - | Chain f2b-nginx-404 (1 references) | + | |
| - | Chain f2b-nginx-dos (1 references) | + | |
| - | Chain f2b-nginx-scan (1 references) | + | |
| - | </ | + | |
| - | Детальный просмотр забаненных IP: | ||
| <code bash> | <code bash> | ||
| - | iptables -L f2b-nginx-scan -n -v | + | fail2ban-client set nginx-scan-block banip 1.2.3.4 |
| - | iptables -L f2b-nginx-404 -n -v | + | |
| - | iptables -L f2b-nginx-dos -n -v | + | |
| </ | </ | ||
| - | ===== Мониторинг ===== | + | ==== Просмотр логов ==== |
| - | + | ||
| - | ==== Просмотр логов | + | |
| <code bash> | <code bash> | ||
| - | # Последние 50 строк | + | tail -f / |
| - | tail -50 / | + | tail -f / |
| - | + | ||
| - | # Только баны | + | |
| tail -100 / | tail -100 / | ||
| - | |||
| - | # Мониторинг в реальном времени | ||
| - | tail -f / | ||
| </ | </ | ||
| - | ==== Просмотр логов | + | ===== Настройка |
| - | <code bash> | + | ^ Параметр ^ Описание ^ Значение ^ |
| - | tail -50 / | + | | maxretry | Попытки до бана | 3-10 для scan, 50 для DoS | |
| - | </ | + | | findtime | Окно поиска (секунды) | 300 (5 минут) | |
| + | | bantime | Время бана (секунды) | 3600-7200 (1-2 часа) | | ||
| - | ==== Общая статистика ==== | + | Файл: ''/ |
| - | <code bash> | + | После изменений: |
| - | echo "=== NGINX SCAN BLOCK ===" | + | |
| - | 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 | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Управление банами ===== | + | |
| - | + | ||
| - | ==== Разбан IP адреса ==== | + | |
| <code bash> | <code bash> | ||
| - | # Разбан в конкретном jail | + | systemctl restart |
| - | fail2ban-client set nginx-scan-block unbanip 1.2.3.4 | + | |
| - | + | ||
| - | # Разбан во всех jail | + | |
| - | fail2ban-client unban 1.2.3.4 | + | |
| </ | </ | ||
| - | |||
| - | ==== Ручной бан IP адреса ==== | ||
| - | |||
| - | <code bash> | ||
| - | fail2ban-client set nginx-scan-block banip 1.2.3.4 | ||
| - | </ | ||
| - | |||
| - | ===== Настройка параметров защиты ===== | ||
| - | |||
| - | ==== Описание параметров jail ==== | ||
| - | |||
| - | ^ Параметр ^ Описание ^ Рекомендуемое значение ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | ==== nginx-scan-block (сканирование) ==== | ||
| - | |||
| - | * **maxretry**: | ||
| - | * **findtime**: | ||
| - | * **bantime**: | ||
| - | |||
| - | Блокирует попытки доступа к: | ||
| - | * Конфигурационным файлам (.env, .git, wp-config.php) | ||
| - | * Скриптам (.php, .asp, .jsp, .cgi) | ||
| - | * SQL инъекциям | ||
| - | * XSS атакам | ||
| - | * Path traversal | ||
| - | |||
| - | ==== nginx-404-flood (404 флуд) ==== | ||
| - | |||
| - | * **maxretry**: | ||
| - | * **findtime**: | ||
| - | * **bantime**: | ||
| - | |||
| - | Блокирует множественные запросы к несуществующим страницам. | ||
| - | |||
| - | ==== nginx-dos-block (DoS атаки) ==== | ||
| - | |||
| - | * **maxretry**: | ||
| - | * **findtime**: | ||
| - | * **bantime**: | ||
| - | |||
| - | Блокирует слишком частые запросы, | ||
| ===== Troubleshooting ===== | ===== Troubleshooting ===== | ||
| Строка 583: | Строка 753: | ||
| ==== Fail2ban не запускается ==== | ==== Fail2ban не запускается ==== | ||
| - | Проверка логов: | ||
| <code bash> | <code bash> | ||
| journalctl -xeu fail2ban | journalctl -xeu fail2ban | ||
| - | systemctl status fail2ban | ||
| - | </ | ||
| - | |||
| - | Проверка конфигурации: | ||
| - | <code bash> | ||
| fail2ban-client -d | fail2ban-client -d | ||
| </ | </ | ||
| - | ==== Jail не банит | + | ==== Jail не банит ==== |
| - | Проверка чтения лог-файла: | ||
| <code bash> | <code bash> | ||
| fail2ban-client status nginx-scan-block | fail2ban-client status nginx-scan-block | ||
| </ | </ | ||
| - | Должно быть '' | + | Должно быть: '' |
| - | Если | + | Если '' |
| - | ==== Фильтры не находят совпадений | + | ==== Фильтры не работают ==== |
| - | Тестирование фильтра: | ||
| <code bash> | <code bash> | ||
| fail2ban-regex / | fail2ban-regex / | ||
| - | </ | ||
| - | |||
| - | Проверка формата логов: | ||
| - | <code bash> | ||
| head -3 / | head -3 / | ||
| </ | </ | ||
| - | Формат должен быть: | + | ==== Парсер не работает ==== |
| - | < | + | |
| - | [DATE] - STATUS STATUS - METHOD PROTOCOL DOMAIN " | + | |
| - | </ | + | |
| - | ==== Парсер не создает лог-файл ==== | ||
| - | |||
| - | Проверка работы парсера: | ||
| <code bash> | <code bash> | ||
| bash -x / | bash -x / | ||
| cat / | cat / | ||
| - | </ | + | ls -la / |
| - | + | ||
| - | Проверка наличия логов Nginx Proxy Manager: | + | |
| - | <code bash> | + | |
| - | ls -la / | + | |
| - | </ | + | |
| - | + | ||
| - | Проверка работы контейнера: | + | |
| - | <code bash> | + | |
| docker ps | grep nginxpm | docker ps | grep nginxpm | ||
| - | </ | ||
| - | |||
| - | ===== Автоматическое обновление ===== | ||
| - | |||
| - | Fail2ban обновляется вместе с системой: | ||
| - | |||
| - | <code bash> | ||
| - | apt update | ||
| - | apt upgrade fail2ban -y | ||
| - | systemctl restart fail2ban | ||
| </ | </ | ||
| ===== Резервное копирование ===== | ===== Резервное копирование ===== | ||
| - | |||
| - | ==== Файлы для бэкапа ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Конфигурация | ||
| - | / | ||
| - | |||
| - | # Скрипты | ||
| - | / | ||
| - | |||
| - | # Логи (опционально) | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ==== Создание бэкапа ==== | ||
| <code bash> | <code bash> | ||
| tar -czf fail2ban-backup-$(date +%Y%m%d).tar.gz \ | tar -czf fail2ban-backup-$(date +%Y%m%d).tar.gz \ | ||
| / | / | ||
| - | / | + | / |
| - | / | + | |
| - | / | + | |
| </ | </ | ||
| Строка 678: | Строка 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 / | rm -rf / | ||
| rm -f / | rm -f / | ||
| - | rm -f / | + | rm -f / |
| - | rm -f / | + | crontab -e # Удалить строку с parse-nginx-logs.sh |
| - | rm -f / | + | |
| - | + | ||
| - | # Удалить из cron | + | |
| - | crontab -e | + | |
| - | # Удалить строку с parse-nginx-logs.sh | + | |
| - | + | ||
| - | # Очистить правила iptables | + | |
| iptables -F | iptables -F | ||
| </ | </ | ||
| - | |||
| - | ===== Заключение ===== | ||
| - | |||
| - | После выполнения всех шагов ваш сервер будет защищен от: | ||
| - | * ✅ Сканирования уязвимостей | ||
| - | * ✅ 404 флуда | ||
| - | * ✅ DoS атак | ||
| - | * ✅ SSH брутфорса | ||
| - | |||
| - | Fail2ban автоматически: | ||
| - | * Собирает логи из Nginx Proxy Manager каждые 2 минуты | ||
| - | * Анализирует запросы на предмет атак | ||
| - | * Блокирует подозрительные IP на уровне iptables | ||
| - | * Автоматически разбанивает IP после истечения времени бана | ||
| ===== Полезные ссылки ===== | ===== Полезные ссылки ===== | ||