Настройка правил Fail2Ban для SSH и веб-сервера
Дата публикации: 24.04.2026

Настройка правил Fail2Ban для SSH и веб-сервера

ccb9a536


Fail2Ban: Как защитить SSH и веб-сервер от брутфорса за 30 минут

Представьте: вы уезжаете в отпуск, а ваш дом остаётся без сигнализации. Воры могут подобрать ключ к двери или разбить окно. Так же и с сервером: если не закрыть "двери" (SSH, админки сайтов), боты будут атаковать его 24/7, пока не подберут пароль. Fail2Ban — это ваша сигнализация, которая блокирует злоумышленников после первых же попыток взлома.

В этом уроке вы научитесь: ✅ Настраивать Fail2Ban для защиты SSH (чтобы никто не подобрался к вашему серверу по паролю). ✅ Блокировать атаки на веб-сервер (Nginx/Apache), включая брутфорс админок WordPress, ботов, сканирующих уязвимости. ✅ Поймёте, как кастомизировать правила под свои нужды и избежать ложных срабатываний.


1. Что такое Fail2Ban и почему он нужен

Fail2Ban — это программа, которая мониторит логи сервера (файлы, куда записываются все действия) и блокирует IP-адреса, если замечает подозрительную активность. Например:

  • Многократные неудачные попытки входа по SSH.
  • Массовые запросы к /wp-admin/ (админка WordPress).
  • Сканирование уязвимостей (например, запросы к /phpmyadmin/setup.php).

Как это работает?

  1. Fail2Ban читает логи (например, /var/log/auth.log для SSH или /var/log/nginx/access.log для веб-сервера).
  2. Ищет шаблоны атак (например, строку "Failed password for root").
  3. Блокирует IP на заданное время (по умолчанию — 10 минут) с помощью iptables (встроенный фаервол Linux).

Аналогия: Представьте, что у вас на двери стоит камера. Если кто-то пытается подобрать ключ 3 раза подряд, камера отправляет сигнал охране, и они блокируют этого человека на сутки.


2. Установка Fail2Ban

На Debian/Ubuntu

sudo apt update && sudo apt install fail2ban -y

На CentOS/RHEL

sudo yum install epel-release -y && sudo yum install fail2ban -y

Проверка работы

sudo systemctl status fail2ban

Если видите active (running), значит, Fail2Ban запущен.


3. Базовая настройка для SSH

3.1. Конфигурационные файлы

Fail2Ban использует два типа файлов:

  • /etc/fail2ban/jail.conf — основной конфиг (не редактируйте его напрямую!).
  • /etc/fail2ban/jail.local — ваш кастомный конфиг (создаётся вручную).

Важно: Все изменения вносите в jail.local — так они не слетят при обновлении Fail2Ban.

3.2. Создаём jail.local

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

3.3. Настраиваем защиту SSH

Найдите секцию [sshd] и измените её так:

[sshd]
enabled  = true          # Включаем защиту
port     = ssh           # Порт SSH (по умолчанию 22)
filter   = sshd          # Правило для фильтрации логов
logpath  = /var/log/auth.log  # Путь к логу (для Ubuntu/Debian)
maxretry = 3             # Сколько попыток разрешено до блокировки
bantime  = 1h            # Время блокировки (1 час)
findtime = 10m           # Время, за которое считаются попытки (10 минут)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24  # IP, которые никогда не блокируются (ваш локальный и доверенные)

Пояснения:

  • maxretry=3 — после 3 неудачных попыток входа IP блокируется.
  • bantime=1h — блокировка на 1 час (можно увеличить до 1d — сутки).
  • ignoreip — добавьте сюда свой статический IP (если есть), чтобы не заблокировать себя.

3.4. Перезапускаем Fail2Ban

sudo systemctl restart fail2ban

3.5. Проверяем статус блокировок

sudo fail2ban-client status sshd

Вывод должен быть примерно таким:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     15
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     3
   `- Banned IP list:   185.22.44.11

4. Настройка защиты для веб-сервера (Nginx/Apache)

4.1. Создаём фильтр для атак на веб-сервер

Fail2Ban не знает, как обрабатывать логи Nginx/Apache "из коробки". Нам нужно создать правило.

Для Nginx

  1. Создаём файл фильтра:

    sudo nano /etc/fail2ban/filter.d/nginx-botsearch.conf
  2. Вставляем правило (блокирует сканирование уязвимостей):

    [Definition]
    failregex = ^<HOST> .* "(GET|POST|HEAD).*(etc/passwd|wp-login\.php|\.env|phpmyadmin|admin|login|sql|backup|config)"
    ignoreregex =

    Что блокирует это правило?

    • Запросы к /etc/passwd (попытка доступа к системным файлам).
    • /wp-login.php (брутфорс WordPress).
    • /phpmyadmin, /admin (сканирование админок).
  3. Создаём джейл (правило блокировки) в jail.local:

    [nginx-botsearch]
    enabled  = true
    port     = http,https
    filter   = nginx-botsearch
    logpath  = /var/log/nginx/access.log
    maxretry = 2
    bantime  = 24h

Для Apache

Аналогично, но путь к логу другой:

logpath = /var/log/apache2/access.log  # Для Debian/Ubuntu
# или
logpath = /var/log/httpd/access_log    # Для CentOS/RHEL

4.2. Защита от брутфорса WordPress

Если у вас WordPress, добавьте правило для /wp-login.php:

  1. Создаём фильтр:

    sudo nano /etc/fail2ban/filter.d/wordpress.conf
  2. Вставляем:

    [Definition]
    failregex = ^<HOST> .* "POST .*wp-login\.php"
    ignoreregex = ^<HOST> .* "POST .*wp-login\.php.* 200"

    Логика: Блокируем все POST-запросы к wp-login.php, кроме тех, что завершились успехом (200 OK).

  3. Добавляем джейл в jail.local:

    [wordpress]
    enabled  = true
    port     = http,https
    filter   = wordpress
    logpath  = /var/log/nginx/access.log
    maxretry = 3
    bantime  = 6h

4.3. Применяем изменения

sudo systemctl restart fail2ban

Проверяем статус:

sudo fail2ban-client status nginx-botsearch
sudo fail2ban-client status wordpress

5. Продвинутые настройки

5.1. Белый список (ignoreip)

Добавьте в jail.local свои IP, чтобы не блокировать себя:

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 111.222.333.444

Как узнать свой IP? Зайдите на 2ip.ru или выполните:

curl ifconfig.me

5.2. Настройка уведомлений по email

Если хотите получать письма о блокировках:

  1. Установите sendmail (или другой MTA):
    sudo apt install sendmail -y
  2. Добавляем в jail.local:
    destemail = ваш@email.com
    sender = fail2ban@ваш-сервер.com
    action = %(action_mwl)s
  3. Перезапускаем Fail2Ban.

5.3. Постоянная блокировка для опасных IP

Если какой-то IP постоянно атакует, добавьте его в черный список навсегда:

sudo iptables -A INPUT -s 185.22.44.11 -j DROP

Чтобы правило сохранилось после перезагрузки:

sudo apt install iptables-persistent -y
sudo netfilter-persistent save

6. Мониторинг и отладка

6.1. Просмотр заблокированных IP

sudo fail2ban-client status sshd
sudo iptables -L -n | grep DROP

6.2. Разблокировать IP вручную

sudo fail2ban-client set sshd unbanip 185.22.44.11

6.3. Логи Fail2Ban

Если что-то не работает, смотрите логи:

sudo tail -f /var/log/fail2ban.log

6.4. Тестирование правил

Попробуйте подключиться по SSH с другого IP и намеренно введите неверный пароль 3 раза. Через минуту IP должен заблокироваться.


7. Типичные ошибки и их решения

Проблема Решение
Fail2Ban не блокирует IP Проверьте путь к логу (logpath) в jail.local. Убедитесь, что логи пишутся (например, tail -f /var/log/auth.log).
Ложные срабатывания Увеличьте maxretry или добавьте исключения в ignoreregex.
Не приходят email-уведомления Проверьте работу sendmail (echo "Test" | mail -s "Test" ваш@email.com).
После перезагрузки правила сбрасываются Установите iptables-persistent (см. раздел 5.3).

Практика для закрепления

Упражнение 1: Базовая защита SSH

  1. Установите Fail2Ban на тестовый сервер.
  2. Настройте jail.local для SSH с параметрами:
    • maxretry = 2
    • bantime = 30m
    • Добавьте свой IP в ignoreip.
  3. Попробуйте подключиться по SSH с другого устройства и намеренно введите неверный пароль 2 раза.
  4. Проверьте, заблокировался ли IP (sudo fail2ban-client status sshd).

Упражнение 2: Защита веб-сервера

  1. Создайте правило для блокировки сканирования /phpmyadmin.
  2. Протестируйте, открыв в браузере http://ваш-сервер/phpmyadmin (IP должен заблокироваться после 2-х запросов).
  3. Проверьте логи Nginx/Apache (tail -f /var/log/nginx/access.log).

Упражнение 3: Настройка уведомлений

  1. Настройте отправку email при блокировке (см. раздел 5.2).
  2. Заблокируйте свой тестовый IP и проверьте, пришло ли письмо.

Упражнение 4: Анализ логов

  1. Посмотрите логи Fail2Ban (/var/log/fail2ban.log).
  2. Найдите строки с Ban — это заблокированные IP. Сколько атак было за последние сутки?

Вопрос для размышления

Почему не стоит ставить bantime навечно (например, bantime = -1)?

Подсказка: Подумайте о динамических IP провайдеров и возможных ложных срабатываниях.


Итоги

Теперь ваш сервер защищён от: ✔ Брутфорса SSH (никто не подберёт пароль). ✔ Сканирования уязвимостей (боты не найдут дыры в веб-сервере). ✔ Атак на админки (WordPress, phpMyAdmin и др.).

Следующий шаг: Настройте двухфакторную аутентификацию (2FA) для SSH и обновите все пароли на сложные (или используйте ключи SSH вместо паролей). Это сделает ваш сервер практически непробиваемым.


Вопросы? Пишите в комментариях — разберём любые сложные моменты! 🚀


Генератор паролей с длинной 64 символа
Женская одежда с бахромой
Кадастровые работы в Бийске
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать планировку сайта для блогов на DreamHost
Как выбрать Vdsina вечный хостинг для своего проекта
Казань окна VEKA - профессионализм и опыт
Курьерская вода
Новостройки Оренбурга: недвижимость с отличной ценой
Онлайн чат-партнерство
Пиломатериалы для возведения бани
Почему VDSina — лучший выбор хостинга
Секреты Вконтакте: тонкости и хитрости
Скидки до 50% на тур в Коста-Рике
Видеочат рулетка бесплатно
рейтинг хостингов 2026 Быстрые VDS серверы