Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| vm:nginx:06-file2ban_v2 [2025/12/01 12:09] – создано admin | vm:nginx:06-file2ban_v2 [2025/12/01 12:19] (текущий) – admin | ||
|---|---|---|---|
| Строка 15: | Строка 15: | ||
| * Root доступ к серверу | * Root доступ к серверу | ||
| - | ===== Установка | + | ===== Быстрая установка |
| - | ==== Шаг 1: Установка пакета ==== | + | **Рекомендуется: |
| + | |||
| + | ==== Шаг 1: Создание скрипта установки | ||
| <code bash> | <code bash> | ||
| - | apt update | + | nano install-fail2ban.sh |
| - | apt install | + | |
| </ | </ | ||
| - | ==== Шаг 2: Создание структуры каталогов | + | ==== Шаг 2: Содержимое скрипта ==== |
| + | |||
| + | Скопируйте следующий код в файл: | ||
| <code bash> | <code bash> | ||
| - | mkdir -p /opt/fail2ban/ | + | #!/bin/bash |
| - | </ | + | |
| - | ===== Создание парсера логов Nginx Proxy Manager | + | ################################################################################ |
| + | # Скрипт автоматической установки и настройки Fail2ban для | ||
| + | # Версия: | ||
| + | # Дата: 2025-11-30 | ||
| + | ################################################################################ | ||
| - | ==== Шаг 3: Создание скрипта парсера ==== | + | set -e # Остановка при ошибке |
| - | Создайте файл / | + | # Цвета для вывода |
| + | RED=' | ||
| + | GREEN=' | ||
| + | YELLOW=' | ||
| + | NC=' | ||
| - | <code bash> | + | # Функция вывода сообщений |
| - | cat > / | + | 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 | #!/bin/bash | ||
| # Скрипт парсинга логов nginx-proxy-manager для fail2ban | # Скрипт парсинга логов nginx-proxy-manager для fail2ban | ||
| - | # Обрабатывает все access логи из папки nginxpm | ||
| LOG_DIR="/ | LOG_DIR="/ | ||
| Строка 47: | Строка 153: | ||
| PARSER_LOG="/ | PARSER_LOG="/ | ||
| - | # Создаем директории если они не существуют | ||
| mkdir -p " | mkdir -p " | ||
| - | # Проверяем, | ||
| if ! docker ps --format "table {{.Names}}" | if ! docker ps --format "table {{.Names}}" | ||
| - | echo " | + | echo " |
| exit 1 | exit 1 | ||
| fi | fi | ||
| - | # Проверяем существование директории с логами | ||
| if [ ! -d " | if [ ! -d " | ||
| - | echo " | + | echo " |
| exit 1 | exit 1 | ||
| fi | fi | ||
| - | # Очищаем целевой файл | ||
| > " | > " | ||
| - | # Счетчик обработанных файлов и строк | ||
| processed_files=0 | processed_files=0 | ||
| total_lines=0 | total_lines=0 | ||
| - | # Обрабатываем все файлы с окончанием *_access.log | ||
| for logfile in " | for logfile in " | ||
| - | # Проверяем, | ||
| if [ -f " | if [ -f " | ||
| lines_from_file=$(tail -n 2000 " | lines_from_file=$(tail -n 2000 " | ||
| Строка 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 " | + | echo " |
| fi | fi | ||
| done | done | ||
| - | # Если не найдено ни одного файла логов | ||
| if [ $processed_files -eq 0 ]; then | if [ $processed_files -eq 0 ]; then | ||
| - | echo " | + | echo " |
| - | # Создаем пустой файл чтобы fail2ban не ругался | + | |
| touch " | touch " | ||
| fi | fi | ||
| - | # Устанавливаем права доступа | ||
| chmod 644 " | chmod 644 " | ||
| - | # Логируем статистику каждый час (когда минуты = 00) | ||
| MINUTE=$(date +%M) | MINUTE=$(date +%M) | ||
| if [ " | if [ " | ||
| final_lines=$(wc -l < " | final_lines=$(wc -l < " | ||
| - | echo " | + | echo " |
| fi | fi | ||
| - | # Ротация логов parser.log (если больше 5MB) | ||
| if [ -f " | if [ -f " | ||
| mv " | mv " | ||
| Строка 105: | Строка 199: | ||
| fi | 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 " | if [ -f " | ||
| mv " | mv " | ||
| touch " | touch " | ||
| chmod 644 " | chmod 644 " | ||
| - | echo " | + | echo " |
| fi | fi | ||
| exit 0 | exit 0 | ||
| - | EOF | + | PARSER_EOF |
| - | </ | + | |
| - | ==== Шаг 4: Установка прав на скрипт ==== | + | chmod +x " |
| - | <code bash> | + | log_info " |
| - | chmod +x / | + | echo "" |
| - | </ | + | |
| - | ==== Шаг 5: Добавление скрипта в cron ==== | + | ################################################################################ |
| + | # Шаг 5: Первый запуск парсера | ||
| + | ################################################################################ | ||
| - | <code bash> | + | log_info |
| - | (crontab -l 2>/ | + | |
| - | </ | + | |
| - | Проверка добавления в cron: | + | " |
| - | <code bash> | + | if [ -f " |
| - | crontab | + | |
| - | </code> | + | |
| + | else | ||
| + | log_error "Не удалось создать лог-файл" | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo "" | ||
| - | ==== Шаг 6: Первый | + | ################################################################################ |
| + | # Шаг 6: Создание фильтров Fail2ban | ||
| + | ################################################################################ | ||
| - | <code bash> | + | log_info " |
| - | / | + | |
| - | </ | + | |
| - | Проверка результата: | + | cat > " |
| - | + | ||
| - | <code bash> | + | |
| - | ls -lh / | + | |
| - | tail -10 / | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Настройка фильтров Fail2ban ===== | + | |
| - | + | ||
| - | ==== Шаг 7: Создание фильтра для блокировки сканирования ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | 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? .* " | ||
| Строка 203: | Строка 249: | ||
| ignoreregex = | ignoreregex = | ||
| - | EOF | + | FILTER_SCAN_EOF |
| - | </ | + | |
| - | ==== Шаг 8: Создание фильтра для блокировки 404 флуда ==== | + | cat > " |
| - | + | ||
| - | <code bash> | + | |
| - | cat > / | + | |
| [Definition] | [Definition] | ||
| - | # Блокировка множественных 404 ошибок | ||
| failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* " | failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* " | ||
| ignoreregex = | ignoreregex = | ||
| - | EOF | + | FILTER_404_EOF |
| - | </ | + | |
| - | ==== Шаг 9: Создание фильтра для блокировки DoS ==== | + | cat > " |
| - | + | ||
| - | <code bash> | + | |
| - | 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 | + | FILTER_DOS_EOF |
| - | </ | + | |
| - | ==== Шаг 10: Создание символических ссылок на фильтры ==== | + | ln -sf " |
| + | ln -sf " | ||
| + | ln -sf " | ||
| - | <code bash> | + | log_info " |
| - | ln -sf / | + | echo "" |
| - | ln -sf / | + | |
| - | ln -sf / | + | |
| - | </ | + | |
| - | ===== Настройка jail для Nginx Proxy Manager ===== | + | ################################################################################ |
| + | # Шаг 7: Создание | ||
| + | ################################################################################ | ||
| - | ==== Шаг 11: Создание конфигурации jail ==== | + | log_info "Создание конфигурации jail..." |
| - | <WRAP center round important 60%> | + | cat > " |
| - | **ВАЖНО: | + | |
| - | </ | + | |
| - | + | ||
| - | <code bash> | + | |
| - | cat > / | + | |
| - | # 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/ | + | |
| [nginx-scan-block] | [nginx-scan-block] | ||
| Строка 263: | Строка 290: | ||
| port = http,https | port = http,https | ||
| filter = nginx-scan-block | filter = nginx-scan-block | ||
| - | logpath = / | + | logpath = ${NGINX_ACCESS_LOG} |
| backend = polling | backend = polling | ||
| maxretry = 3 | maxretry = 3 | ||
| Строка 274: | Строка 301: | ||
| port = http, | port = http, | ||
| filter = nginx-dos-block | filter = nginx-dos-block | ||
| - | logpath = / | + | 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 = / | + | logpath = ${NGINX_ACCESS_LOG} |
| backend = polling | backend = polling | ||
| maxretry = 10 | maxretry = 10 | ||
| Строка 291: | Строка 318: | ||
| findtime = 600 | findtime = 600 | ||
| action = iptables-multiport[name=nginx-404, | action = iptables-multiport[name=nginx-404, | ||
| - | EOF | + | JAIL_EOF |
| - | </ | + | |
| - | ==== Шаг 12: Создание символической ссылки на jail ==== | + | ln -sf " |
| - | <code bash> | + | log_info " |
| - | ln -sf / | + | echo "" |
| - | </ | + | |
| - | ===== Тестирование | + | ################################################################################ |
| + | # Шаг 8: Тестирование | ||
| + | ################################################################################ | ||
| - | ==== Шаг 13: Проверка синтаксиса конфигурации | + | log_info " |
| - | <code bash> | + | if fail2ban-client -t; then |
| - | fail2ban-client -t | + | log_info " |
| - | </ | + | else |
| + | log_error " | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo "" | ||
| - | Ожидаемый результат: | + | log_info " |
| - | < | + | |
| - | OK: configuration test is successful | + | |
| - | </ | + | |
| - | ==== Шаг 14: Тестирование фильтров на реальных логах ==== | + | fail2ban-regex " |
| + | fail2ban-regex " | ||
| + | fail2ban-regex " | ||
| - | <code bash> | + | echo "" |
| - | fail2ban-regex / | + | |
| - | fail2ban-regex / | + | |
| - | fail2ban-regex / | + | |
| - | </ | + | |
| - | Должны | + | ################################################################################ |
| + | # Шаг 9: Добавление в cron | ||
| + | ################################################################################ | ||
| - | ===== Запуск и включение | + | log_info " |
| - | ==== Шаг 15: Включение и запуск Fail2ban ==== | + | CRON_ENTRY="*/2 * * * * ${FAIL2BAN_SCRIPTS}/ |
| - | <code bash> | + | if crontab -l 2>/dev/null | grep -q " |
| - | # Включить | + | |
| - | systemctl enable fail2ban | + | else |
| + | (crontab -l 2>/ | ||
| + | log_info " | ||
| + | fi | ||
| + | echo "" | ||
| - | # Запустить службу | + | ################################################################################ |
| - | systemctl start fail2ban | + | # Шаг 10: Запуск |
| + | ################################################################################ | ||
| - | # Проверить статус | + | log_info "Запуск Fail2ban..." |
| - | systemctl status fail2ban | + | |
| - | </ | + | |
| - | ===== Проверка работы ===== | + | systemctl enable fail2ban >/ |
| + | systemctl restart fail2ban | ||
| - | ==== Шаг 16: Проверка активных jail ==== | + | sleep 5 |
| - | <code bash> | + | if systemctl is-active --quiet fail2ban; then |
| - | fail2ban-client status | + | log_info " |
| - | </ | + | else |
| + | log_error "Не удалось запустить Fail2ban" | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo "" | ||
| - | Ожидаемый вывод: | + | ################################################################################ |
| - | < | + | # Проверка |
| - | Status | + | ################################################################################ |
| - | |- Number of jail: 4 | + | |
| - | `- Jail list: | + | |
| - | </ | + | |
| - | ==== Шаг 17: Проверка | + | 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 | ||
| - | </ | + | echo "" |
| - | Пример вывода: | + | ################################################################################ |
| - | < | + | # Завершение |
| - | Status for the jail: nginx-scan-block | + | ################################################################################ |
| - | |- Filter | + | |
| - | | |- Currently failed: 5 | + | |
| - | | |- Total failed: | + | |
| - | | `- File list: / | + | |
| - | `- Actions | + | |
| - | |- Currently banned: 2 | + | |
| - | |- Total banned: | + | |
| - | `- Banned IP list: | + | |
| - | </ | + | |
| - | ==== Шаг 18: Проверка правил iptables | + | log_info "==========================================" |
| + | log_info " | ||
| + | log_info " | ||
| + | echo "" | ||
| - | <code bash> | + | echo " |
| - | iptables | + | echo " |
| - | </code> | + | echo " |
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| - | Ожидаемый результат: | + | echo " |
| - | < | + | echo " |
| - | Chain INPUT (policy ACCEPT) | + | echo " |
| - | f2b-nginx-dos | + | echo " |
| - | f2b-nginx-404 6 | + | echo " |
| - | f2b-nginx-scan | + | echo "" |
| - | Chain f2b-nginx-404 (1 references) | + | |
| - | Chain f2b-nginx-dos | + | |
| - | Chain f2b-nginx-scan | + | |
| - | </ | + | |
| - | Детальный просмотр забаненных IP: | + | echo " |
| - | < | + | echo " |
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | |||
| + | cat > " | ||
| + | # 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 / | ||
| + | tail -f / | ||
| + | ``` | ||
| + | |||
| + | ## Настройка | ||
| + | |||
| + | Файл: `/ | ||
| + | |||
| + | - 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; | ||
| + | echo "=== $jail ===" | ||
| + | fail2ban-client status $jail | ||
| + | echo "" | ||
| + | done | ||
| + | ``` | ||
| + | README_EOF | ||
| + | |||
| + | log_info " | ||
| </ | </ | ||
| - | ===== Мониторинг ===== | + | ==== Шаг 3: Настройка параметров (опционально) |
| - | ==== Просмотр логов | + | Перед запуском вы можете изменить следующие параметры в начале скрипта: |
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ==== Шаг 4: Запуск скрипта | ||
| <code bash> | <code bash> | ||
| - | # Последние 50 строк | + | chmod +x install-fail2ban.sh |
| - | tail -50 /var/log/fail2ban.log | + | ./install-fail2ban.sh |
| + | </ | ||
| - | # Только баны | + | Скрипт автоматически выполнит все необходимые действия: |
| - | tail -100 / | + | - Проверит наличие Nginx Proxy Manager |
| + | - Установит Fail2ban | ||
| + | - Создаст структуру каталогов | ||
| + | - Создаст и настроит парсер логов | ||
| + | - Создаст все фильтры | ||
| + | - Настроит jail конфигурацию | ||
| + | | ||
| + | - Добавит парсер в cron | ||
| + | - Запустит Fail2ban | ||
| + | - Выведет статистику работы | ||
| - | # Мониторинг в реальном времени | + | ==== Результат автоматической установки ==== |
| - | tail -f /var/ | + | |
| + | После успешного выполнения скрипта вы увидите: | ||
| + | |||
| + | < | ||
| + | ========================================== | ||
| + | Установка и настройка завершена успешно! | ||
| + | ========================================== | ||
| + | |||
| + | Защита: | ||
| + | ✅ nginx-scan-block (3 попытки, | ||
| + | ✅ nginx-404-flood (10 попыток, | ||
| + | ✅ nginx-dos-block (50/мин, бан 10 минут) | ||
| + | ✅ sshd | ||
| </ | </ | ||
| - | ==== Просмотр логов парсера ==== | + | ===== Ручная установка (пошаговая) ===== |
| + | |||
| + | Если вы предпочитаете ручную установку с полным контролем каждого | ||
| + | |||
| + | ==== Установка Fail2ban | ||
| <code bash> | <code bash> | ||
| - | tail -50 /opt/fail2ban/ | + | apt update |
| + | apt install | ||
| </ | </ | ||
| - | ==== Общая статистика ==== | + | ==== Создание |
| <code bash> | <code bash> | ||
| - | echo "=== NGINX SCAN BLOCK ===" | + | mkdir -p /opt/fail2ban/ |
| - | 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 | + | nano /opt/fail2ban/ |
| - | fail2ban-client set nginx-scan-block unbanip 1.2.3.4 | + | </ |
| - | # Разбан во всех jail | + | Содержимое файла указано в автоматическом |
| - | fail2ban-client unban 1.2.3.4 | + | |
| + | Установка прав: | ||
| + | |||
| + | <code bash> | ||
| + | chmod +x /opt/fail2ban/ | ||
| </ | </ | ||
| - | ==== Ручной бан IP адреса ==== | + | Первый запуск: |
| <code bash> | <code bash> | ||
| - | fail2ban-client set nginx-scan-block banip 1.2.3.4 | + | /opt/fail2ban/ |
| + | ls -lh / | ||
| </ | </ | ||
| - | ===== Настройка параметров защиты ===== | + | Добавление в cron: |
| - | ==== Описание параметров jail ==== | + | <code bash> |
| + | (crontab -l 2>/ | ||
| + | crontab -l | ||
| + | </ | ||
| - | ^ Параметр ^ Описание ^ Рекомендуемое значение | + | ==== Создание |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | ==== nginx-scan-block (сканирование) ==== | + | <code bash> |
| + | # Фильтр | ||
| + | cat > / | ||
| + | [Definition] | ||
| - | | + | failregex = ^\[.*\] - \d+ \d+ - GET https? .* ".*(/ |
| - | * **findtime**: 300 секунд | + | ^\[.*\] - 40\d \d+ - GET https? .* " |
| - | * **bantime**: 7200 секунд | + | ^\[.*\] - \d+ \d+ - GET https? .* ".*\.\.\/.*" \[Client < |
| + | ^\[.*\] - \d+ \d+ - GET https? .* ".*(union|select|insert|update|delete|drop|create|alter).*" \[Client < | ||
| + | ^\[.*\] - \d+ \d+ - (GET|POST) https? .* ".*(< | ||
| + | ^\[.*\] - \d+ \d+ - (GET|POST) https? .* " | ||
| + | ^\[.*\] - \d+ \d+ - GET https? .* " | ||
| - | Блокирует попытки доступа к: | + | ignoreregex = |
| - | * Конфигурационным файлам (.env, .git, wp-config.php) | + | EOF |
| - | * Скриптам (.php, .asp, .jsp, .cgi) | + | |
| - | * SQL инъекциям | + | |
| - | * XSS атакам | + | |
| - | * Path traversal | + | |
| - | ==== nginx-404-flood | + | # Фильтр 404 |
| + | cat > / | ||
| + | [Definition] | ||
| - | | + | failregex = ^\[.*\] - 404 \d+ - (GET|POST|HEAD) https? .* ".*" \[Client < |
| - | * **findtime**: | + | |
| - | | + | |
| - | Блокирует множественные запросы к несуществующим страницам. | + | ignoreregex = |
| + | EOF | ||
| - | ==== nginx-dos-block | + | # Фильтр DoS |
| + | cat > / | ||
| + | [Definition] | ||
| - | | + | failregex = ^\[.*\] - \d+ \d+ - (GET|POST|HEAD) https? .* ".*" \[Client < |
| - | * **findtime**: | + | |
| - | | + | |
| - | Блокирует слишком частые запросы, | + | ignoreregex = ^\[.*\] - \d+ \d+ - (GET|POST) https? .* ".*\.(css|js|jpg|jpeg|png|gif|ico|woff|woff2|ttf|svg).*" \[Client < |
| + | EOF | ||
| - | ===== Troubleshooting ===== | + | # Символические ссылки |
| + | ln -sf / | ||
| + | ln -sf / | ||
| + | ln -sf / | ||
| + | </ | ||
| - | ==== Fail2ban не запускается | + | ==== Создание |
| + | |||
| + | **ВАЖНО: | ||
| - | Проверка логов: | ||
| <code bash> | <code bash> | ||
| - | journalctl | + | cat > / |
| - | systemctl status | + | [DEFAULT] |
| + | bantime = 3600 | ||
| + | findtime = 300 | ||
| + | ignoreip = 127.0.0.1/8 ::1 192.168.0.0/ | ||
| + | |||
| + | [nginx-scan-block] | ||
| + | enabled = true | ||
| + | port = http, | ||
| + | filter = nginx-scan-block | ||
| + | logpath = /opt/fail2ban/ | ||
| + | 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 = / | ||
| + | backend = polling | ||
| + | maxretry = 50 | ||
| + | bantime = 600 | ||
| + | findtime = 60 | ||
| + | action = iptables-multiport[name=nginx-dos, | ||
| + | |||
| + | [nginx-404-flood] | ||
| + | enabled = true | ||
| + | port = http, | ||
| + | filter = nginx-404-flood | ||
| + | logpath = / | ||
| + | backend = polling | ||
| + | maxretry = 10 | ||
| + | bantime = 3600 | ||
| + | findtime = 600 | ||
| + | action = iptables-multiport[name=nginx-404, | ||
| + | EOF | ||
| + | |||
| + | ln -sf / | ||
| </ | </ | ||
| - | Проверка конфигурации: | + | ==== Тестирование и запуск ==== |
| <code bash> | <code bash> | ||
| - | fail2ban-client -d | + | # Тест конфигурации |
| + | fail2ban-client -t | ||
| + | |||
| + | # Тест фильтров | ||
| + | fail2ban-regex / | ||
| + | |||
| + | # Запуск | ||
| + | systemctl enable fail2ban | ||
| + | systemctl start fail2ban | ||
| + | systemctl status fail2ban | ||
| </ | </ | ||
| - | ==== 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 bash> | <code bash> | ||
| - | fail2ban-regex /opt/fail2ban/logs/nginx-access.log / | + | fail2ban-client status |
| + | fail2ban-client status | ||
| </ | </ | ||
| - | Проверка формата логов: | + | ==== Разбан 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 | ||
| </ | </ | ||
| - | Формат должен быть: | + | ==== Ручной бан ==== |
| - | < | + | |
| - | [DATE] | + | < |
| + | fail2ban-client set nginx-scan-block banip 1.2.3.4 | ||
| </ | </ | ||
| - | ==== Парсер не создает лог-файл | + | ==== Просмотр логов ==== |
| - | Проверка работы парсера: | ||
| <code bash> | <code bash> | ||
| - | bash -x /opt/fail2ban/ | + | tail -f /var/log/fail2ban.log |
| - | cat / | + | tail -f / |
| + | tail -100 / | ||
| </ | </ | ||
| - | Проверка наличия логов Nginx Proxy Manager: | + | ===== Настройка параметров |
| + | |||
| + | ^ Параметр ^ Описание ^ Значение ^ | ||
| + | | maxretry | Попытки до бана | ||
| + | | findtime | Окно поиска (секунды) | 300 (5 минут) | | ||
| + | | bantime | Время бана (секунды) | 3600-7200 (1-2 часа) | | ||
| + | |||
| + | Файл: ''/ | ||
| + | |||
| + | После изменений: | ||
| <code bash> | <code bash> | ||
| - | ls -la / | + | systemctl restart fail2ban |
| </ | </ | ||
| - | Проверка работы контейнера: | + | ===== Troubleshooting ===== |
| + | |||
| + | ==== Fail2ban не запускается ==== | ||
| <code bash> | <code bash> | ||
| - | docker ps | grep nginxpm | + | journalctl -xeu fail2ban |
| + | fail2ban-client -d | ||
| </ | </ | ||
| - | ===== Автоматическое обновление ===== | + | ==== Jail не банит ==== |
| - | + | ||
| - | Fail2ban обновляется вместе с системой: | + | |
| <code bash> | <code bash> | ||
| - | apt update | + | fail2ban-client status nginx-scan-block |
| - | apt upgrade | + | |
| - | systemctl restart fail2ban | + | |
| </ | </ | ||
| - | ===== Резервное копирование ===== | + | Должно быть: '' |
| - | ==== Файлы для бэкапа ==== | + | Если '' |
| + | |||
| + | ==== Фильтры не работают ==== | ||
| <code bash> | <code bash> | ||
| - | # Конфигурация | + | fail2ban-regex / |
| - | / | + | head -3 / |
| + | </ | ||
| - | # Скрипты | + | ==== Парсер не работает ==== |
| - | / | + | |
| - | # Логи (опционально) | + | <code bash> |
| - | / | + | bash -x / |
| + | cat /opt/ | ||
| + | ls -la / | ||
| + | docker ps | grep nginxpm | ||
| </ | </ | ||
| - | ==== Создание бэкапа ==== | + | ===== Резервное копирование ===== |
| <code bash> | <code bash> | ||
| tar -czf fail2ban-backup-$(date +%Y%m%d).tar.gz \ | tar -czf fail2ban-backup-$(date +%Y%m%d).tar.gz \ | ||
| / | / | ||
| - | / | + | / |
| - | / | + | |
| - | / | + | |
| </ | </ | ||
| Строка 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 / | 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 после истечения времени бана | ||
| ===== Полезные ссылки ===== | ===== Полезные ссылки ===== | ||