Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия | |||
| vm:n8n:04-fail2ban [2025/08/31 00:18] – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1 | vm:n8n:04-fail2ban [2025/08/31 00:18] (текущий) – ↷ Имя страницы vm:n8n:03-fail2ban изменено на vm:n8n:04-fail2ban admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | Вот пошаговая инструкция по настройке fail2ban для защиты от сканирования Папки все создадутся по этому адресу **/ | ||
| + | Создать файл в папке **/opt/** install-fail2ban-complete.sh и вставить в него скрипт | ||
| + | |||
| + | < | ||
| + | |||
| + | # Полная автоматическая установка и настройка fail2ban для Docker nginx-proxy | ||
| + | # Все файлы будут созданы в / | ||
| + | # Запуск: | ||
| + | |||
| + | set -e | ||
| + | |||
| + | # Цвета для вывода | ||
| + | RED=' | ||
| + | GREEN=' | ||
| + | YELLOW=' | ||
| + | NC=' | ||
| + | |||
| + | echo_info() { echo -e " | ||
| + | echo_warn() { echo -e " | ||
| + | echo_error() { echo -e " | ||
| + | |||
| + | # Проверка прав root | ||
| + | if [[ $EUID -ne 0 ]]; then | ||
| + | | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | echo_info "=== Начинаем установку fail2ban в / | ||
| + | |||
| + | # 1. Создание структуры директорий | ||
| + | echo_info " | ||
| + | mkdir -p / | ||
| + | mkdir -p / | ||
| + | |||
| + | # 2. Установка fail2ban и зависимостей | ||
| + | echo_info " | ||
| + | apt update | ||
| + | apt install -y fail2ban iptables-persistent | ||
| + | |||
| + | # 3. Создание скрипта парсинга логов Docker | ||
| + | echo_info " | ||
| + | cat > / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # Скрипт парсинга логов nginx-proxy Docker контейнера | ||
| + | LOG_FILE="/ | ||
| + | CONTAINER_NAME=" | ||
| + | TEMP_FILE="/ | ||
| + | |||
| + | # Проверяем, | ||
| + | if ! docker ps --format "table {{.Names}}" | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Получаем последние 2000 строк логов | ||
| + | docker logs " | ||
| + | |||
| + | # Фильтруем только nginx.1 записи и убираем префикс | ||
| + | grep ' | ||
| + | sed ' | ||
| + | grep -E '" | ||
| + | |||
| + | # Устанавливаем права доступа | ||
| + | chmod 644 " | ||
| + | |||
| + | # Логируем успешное выполнение (раз в час) | ||
| + | MINUTE=$(date +%M) | ||
| + | if [ " | ||
| + | LINES=$(wc -l < " | ||
| + | echo " | ||
| + | fi | ||
| + | |||
| + | # Очищаем временный файл | ||
| + | rm -f " | ||
| + | |||
| + | # Ротация логов (если файл больше 10MB) | ||
| + | if [ -f " | ||
| + | mv " | ||
| + | touch " | ||
| + | chmod 644 " | ||
| + | fi | ||
| + | EOF | ||
| + | |||
| + | # 4. Создание фильтра для сканирования | ||
| + | echo_info " | ||
| + | cat > / | ||
| + | # Фильтр для блокировки сканирования nginx | ||
| + | [Definition] | ||
| + | |||
| + | # Блокировка попыток доступа к конфигурационным файлам | ||
| + | failregex = ^.* < | ||
| + | ^.* < | ||
| + | ^.* < | ||
| + | ^.* < | ||
| + | ^.* < | ||
| + | ^.* < | ||
| + | ^.* < | ||
| + | ^.* < | ||
| + | |||
| + | ignoreregex = ^.* < | ||
| + | ^.* < | ||
| + | ^.* < | ||
| + | EOF | ||
| + | |||
| + | # 5. Создание фильтра для DoS атак | ||
| + | cat > / | ||
| + | # Фильтр для блокировки DoS атак | ||
| + | [Definition] | ||
| + | |||
| + | # Слишком много запросов с одного IP | ||
| + | failregex = ^.* < | ||
| + | |||
| + | # Игнорируем изображения и статические файлы | ||
| + | ignoreregex = ^.* < | ||
| + | EOF | ||
| + | |||
| + | # 6. Создание фильтра для 404 флуда | ||
| + | cat > / | ||
| + | # Фильтр для блокировки 404 флуда | ||
| + | [Definition] | ||
| + | |||
| + | # Много 404 ошибок подряд | ||
| + | failregex = ^.* < | ||
| + | |||
| + | ignoreregex = ^.* < | ||
| + | EOF | ||
| + | |||
| + | # 7. Создание jail конфигурации | ||
| + | cat > / | ||
| + | # Jail конфигурация для nginx защиты | ||
| + | [DEFAULT] | ||
| + | # Время бана в секундах (1 час = 3600) | ||
| + | bantime = 3600 | ||
| + | # Время поиска нарушений (5 минут = 300) | ||
| + | findtime = 300 | ||
| + | # Игнорировать локальные IP | ||
| + | ignoreip = 127.0.0.1/8 ::1 192.168.0.0/ | ||
| + | |||
| + | [nginx-scan-block] | ||
| + | enabled = true | ||
| + | port = http,https | ||
| + | filter = nginx-scan-block | ||
| + | logpath = / | ||
| + | maxretry = 3 | ||
| + | bantime = 7200 | ||
| + | findtime = 300 | ||
| + | action = iptables-multiport[name=nginx-scan, | ||
| + | |||
| + | [nginx-dos-block] | ||
| + | enabled = true | ||
| + | port = http, | ||
| + | filter = nginx-dos-block | ||
| + | logpath = / | ||
| + | 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 = / | ||
| + | maxretry = 10 | ||
| + | bantime = 3600 | ||
| + | findtime = 600 | ||
| + | action = iptables-multiport[name=nginx-404, | ||
| + | EOF | ||
| + | |||
| + | # 8. Создание скрипта управления | ||
| + | echo_info " | ||
| + | cat > / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # Скрипт управления fail2ban | ||
| + | |||
| + | case " | ||
| + | status) | ||
| + | echo "=== Статус fail2ban ===" | ||
| + | fail2ban-client status | ||
| + | echo "" | ||
| + | echo "=== Детальная информация ===" | ||
| + | for jail in nginx-scan-block nginx-dos-block nginx-404-flood; | ||
| + | if fail2ban-client status | grep -q " | ||
| + | echo "--- $jail ---" | ||
| + | fail2ban-client status $jail 2>/ | ||
| + | echo "" | ||
| + | fi | ||
| + | done | ||
| + | ;; | ||
| + | | ||
| + | logs) | ||
| + | echo "=== Последние 50 записей nginx логов ===" | ||
| + | tail -50 / | ||
| + | ;; | ||
| + | | ||
| + | banned) | ||
| + | echo "=== Заблокированные IP ===" | ||
| + | iptables -L -n | grep f2b || echo " | ||
| + | ;; | ||
| + | | ||
| + | unban) | ||
| + | if [ -z " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo " | ||
| + | fail2ban-client unban $2 | ||
| + | ;; | ||
| + | | ||
| + | ban) | ||
| + | if [ -z " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | echo " | ||
| + | fail2ban-client set $2 banip $3 | ||
| + | ;; | ||
| + | | ||
| + | reload) | ||
| + | echo " | ||
| + | systemctl restart fail2ban | ||
| + | sleep 3 | ||
| + | fail2ban-client status | ||
| + | ;; | ||
| + | | ||
| + | parse) | ||
| + | echo " | ||
| + | / | ||
| + | LINES=$(wc -l < / | ||
| + | echo " | ||
| + | ;; | ||
| + | | ||
| + | test) | ||
| + | echo "=== Тестирование конфигурации ===" | ||
| + | fail2ban-client -t && echo " | ||
| + | ;; | ||
| + | | ||
| + | block-suspicious) | ||
| + | echo " | ||
| + | SUSPICIOUS_IPS=(" | ||
| + | for ip in " | ||
| + | echo " | ||
| + | iptables -I INPUT -s $ip -j DROP 2>/ | ||
| + | done | ||
| + | iptables-save > / | ||
| + | echo " | ||
| + | ;; | ||
| + | | ||
| + | *) | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | ;; | ||
| + | esac | ||
| + | EOF | ||
| + | |||
| + | # 9. Установка прав доступа | ||
| + | echo_info " | ||
| + | chmod +x / | ||
| + | chmod 644 / | ||
| + | chmod 644 / | ||
| + | chown -R root:root / | ||
| + | |||
| + | # 10. Создание символических ссылок | ||
| + | echo_info " | ||
| + | ln -sf / | ||
| + | ln -sf / | ||
| + | |||
| + | # 11. Создание cron задачи | ||
| + | echo_info " | ||
| + | (crontab -l 2>/ | ||
| + | |||
| + | # 12. Первоначальный парсинг логов | ||
| + | echo_info " | ||
| + | / | ||
| + | |||
| + | # 13. Перезапуск fail2ban | ||
| + | echo_info " | ||
| + | systemctl restart fail2ban | ||
| + | systemctl enable fail2ban | ||
| + | |||
| + | # 14. Ожидание запуска | ||
| + | sleep 5 | ||
| + | |||
| + | # 15. Проверка статуса | ||
| + | echo_info " | ||
| + | fail2ban-client status || echo_warn " | ||
| + | |||
| + | # 16. Создание алиаса для удобства | ||
| + | echo_info " | ||
| + | echo 'alias f2b="/ | ||
| + | |||
| + | # 17. Блокировка подозрительных IP из логов | ||
| + | echo_info " | ||
| + | SUSPICIOUS_IPS=(" | ||
| + | for ip in " | ||
| + | echo " | ||
| + | iptables -I INPUT -s $ip -j DROP 2>/ | ||
| + | done | ||
| + | |||
| + | # Сохранение правил iptables | ||
| + | iptables-save > / | ||
| + | |||
| + | echo "" | ||
| + | echo_info "=== УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО! ===" | ||
| + | echo "" | ||
| + | echo "📁 Структура файлов:" | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo "🚀 Полезные команды:" | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo " | ||
| + | |||
| + | Далее запустить скрипт: | ||
| + | < | ||
| + | sudo bash install-fail2ban-complete.sh</ | ||
| + | |||
| + | Проверить статус | ||
| + | < | ||