Fail2Ban защищает серверы Rocky Linux от атак перебором (brute-force), отслеживая логи и автоматически блокируя IP-адреса, проявляющие вредоносное поведение. Когда злоумышленник предпринимает повторяющиеся неудачные попытки входа по SSH, подбора паролей или сканирования уязвимостей, Fail2Ban блокирует его IP-адрес через правила firewalld, предотвращая дальнейшие попытки доступа. Для серверов, доступных из интернета, этот автоматический ответ останавливает большинство автоматизированных атак до того, как они достигнут цели.
💡 Если ваш сервер доступен из интернета (SSH, веб-сервер, почта) — Fail2Ban автоматически блокирует IP-адреса злоумышленников после нескольких неудачных попыток входа, защищая вас от атак перебором.
В этом руководстве мы установим и настроим Fail2Ban на Rocky Linux 8, 9 и 10. Вы узнаете:
- Как установить EPEL и Fail2Ban
- Как настроить защиту SSH
- Как настраивать время бана и игнорируемые IP
- Как управлять банами через командную строку
- Как добавлять защиты для веб-серверов (Apache/Nginx)
- Как устранять типичные проблемы
Для кого: сисадмины (защита серверов от взлома), DevOps (автоматизация безопасности), владельцы VPS (защита от ботов), новички (понимание основ безопасности).
1. Что такое Fail2Ban и как он работает
| Компонент | Что делает |
|---|---|
| Фильтр (filter) | Определяет, какие строки в логах считать подозрительными (например, «Failed password for root») |
| Действие (action) | Что делать при обнаружении атаки (например, добавить правило в firewalld) |
| Тюрьма (jail) | Связывает фильтр и действие, применяя их к конкретному сервису (SSH, Apache, Nginx) |
Типичный сценарий: Злоумышленник пытается подобрать пароль к SSH → Fail2Ban видит 5 неудачных попыток → добавляет IP в блокировку firewalld на 10 минут → атака прекращается.
💡 Вывод для новичка: Fail2Ban — это ваш личный охранник, который автоматически банит подозрительные IP-адреса.
2. Подготовка системы
2.1 Обновление системы
sudo dnf upgrade --refresh -y
Что делает:
sudo— права суперпользователя.dnf upgrade— обновляет все пакеты до последних версий.--refresh— принудительно перекачивает метаданные репозиториев (игнорирует кэш).-y— автоматически отвечает «yes».
Зачем: Это стандартная практика безопасности перед установкой нового ПО.
3. Установка EPEL и Fail2Ban
Fail2Ban отсутствует в стандартных репозиториях Rocky Linux. Он поставляется через EPEL (Extra Packages for Enterprise Linux).
3.1 Установка EPEL
sudo dnf install -y epel-release
3.2 Проверка, что EPEL подключён
dnf repolist | grep epel
✅ Ожидаемый вывод (Rocky 10):
epel Extra Packages for Enterprise Linux 10 - x86_64
3.3 Установка Fail2Ban
sudo dnf install -y fail2ban
Что делает: Устанавливает Fail2Ban вместе с интеграцией для firewalld (fail2ban-firewalld). На минимальных установках также подтянется firewalld.
3.4 Проверка установки
fail2ban-client --version
✅ Ожидаемый вывод (Rocky 10/9):
Fail2Ban v1.1.0
✅ Ожидаемый вывод (Rocky 8):
Fail2Ban v1.0.2
4. Запуск и включение автозагрузки
4.1 Запуск и включение
sudo systemctl enable --now fail2ban
4.2 Проверка статуса
systemctl status fail2ban
✅ Ожидаемый вывод:
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: disabled)
Active: active (running) since Wed 2026-01-15 10:30:00 UTC; 5s ago
Main PID: 12346 (fail2ban-server)
Tasks: 3 (limit: 4915)
Memory: 12.0M
Признаки успеха:
Active: active (running)— сервис работаетenabled— автозагрузка настроена
5. Понимание конфигурации Fail2Ban
Fail2Ban использует систему, где локальные файлы переопределяют настройки по умолчанию.
| Файл | Назначение |
|---|---|
/etc/fail2ban/jail.conf | Настройки по умолчанию (не редактировать!) |
/etc/fail2ban/jail.d/*.conf | Переопределения от пакетов (например, 00-firewalld.conf) |
/etc/fail2ban/jail.local | Ваши пользовательские настройки (создайте этот файл) |
Пакет fail2ban-firewalld создаёт файл /etc/fail2ban/jail.d/00-firewalld.conf, который настраивает Fail2Ban на использование firewalld.
6. Настройка защиты SSH (jail.local)
6.1 Создание файла конфигурации
sudo nano /etc/fail2ban/jail.local
6.2 Базовая конфигурация для SSH
Скопируйте и вставьте следующее:
[DEFAULT]
# Fail2Ban читает логи из systemd journal на Rocky Linux
backend = systemd
# IP-адреса, которые никогда не должны баниться (добавьте свои)
ignoreip = 127.0.0.1/8 ::1
# Длительность бана (10 минут по умолчанию)
bantime = 10m
# Временное окно для подсчёта неудач
findtime = 10m
# Количество неудач перед баном
maxretry = 5
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 1h
findtime = 10m
Что делает эта конфигурация:
- Защищает SSH с более строгими настройками: бан на 1 час после 3 неудачных попыток за 10 минут.
backend = systemd— Fail2Ban читает логи из systemd journal (стандарт для Rocky Linux).ignoreip— локальный хост никогда не будет забанен.
6.3 Применение конфигурации
sudo systemctl restart fail2ban
7. Настройка времени бана
7.1 Фиксированное время
| Значение | Длительность |
|---|---|
bantime = 10m | 10 минут |
bantime = 1h | 1 час |
bantime = 1d | 1 день |
bantime = -1 | Навсегда (до ручного разбана) |
7.2 Инкрементальные баны (для повторных нарушителей)
Добавьте в секцию [DEFAULT]:
bantime.increment = true
bantime.multipliers = 1 2 4 8 16 32 64
Как работает: При первой блокировке IP банится на 10 минут, при второй — на 20 минут, при третьей — на 40 минут и так далее.
7.3 Белый список (игнорируемые IP)
Добавьте свои IP-адреса в ignoreip, чтобы они никогда не блокировались:
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.50
⚠️ Важно: Всегда добавляйте свой IP-адрес при работе с удалённым сервером, чтобы случайно не заблокировать себе доступ.
8. Защита веб-серверов (Apache/Nginx)
8.1 Для Apache
Добавьте в jail.local:
[apache-auth]
enabled = true
port = http,https
logpath = %(apache_error_log)s
maxretry = 3
bantime = 1h
[apache-badbots]
enabled = true
port = http,https
logpath = %(apache_access_log)s
maxretry = 2
bantime = 48h
8.2 Для Nginx
Добавьте в jail.local:
[nginx-http-auth]
enabled = true
port = http,https
logpath = %(nginx_error_log)s
maxretry = 3
bantime = 1h
[nginx-botsearch]
enabled = true
port = http,https
logpath = %(nginx_access_log)s
maxretry = 2
bantime = 2h
8.3 Применение изменений
sudo systemctl restart fail2ban
9. Управление банами (fail2ban-client)
9.1 Просмотр активных тюрем (jails)
sudo fail2ban-client status
✅ Ожидаемый вывод:
Status
|- Number of jail: 1
`- Jail list: sshd
9.2 Просмотр забаненных IP в конкретной тюрьме (jail)
sudo fail2ban-client status sshd
✅ Ожидаемый вывод:
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 15
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 2
`- Banned IP list: 203.0.113.7
9.3 Ручной бан IP
sudo fail2ban-client set sshd banip 203.0.113.7
9.4 Ручной разбан IP
sudo fail2ban-client set sshd unbanip 203.0.113.7
9.5 Перезагрузка конфигурации без потери банов
sudo fail2ban-client reload
10. Мониторинг логов
10.1 Просмотр последних записей
sudo tail -20 /var/log/fail2ban.log
10.2 Мониторинг в реальном времени
sudo tail -f /var/log/fail2ban.log
Нажмите Ctrl+C для выхода.
10.3 Поиск по логам
# Найти все баны
grep "Ban" /var/log/fail2ban.log
# Найти конкретный IP
grep "203.0.113.7" /var/log/fail2ban.log
11. Настройка email-уведомлений
11.1 Установка Postfix (для отправки почты)
sudo dnf install -y postfix s-nail
sudo systemctl enable --now postfix
11.2 Настройка email в Fail2Ban
Добавьте в секцию [DEFAULT] файла jail.local:
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_mwl)s
Что делает: action_mwl отправляет email с whois-информацией о забаненном IP и строками лога, которые вызвали бан.
11.3 Тест отправки письма
echo "Test email from Fail2Ban server" | mail -s "Fail2Ban Test" admin@example.com
12. Диагностика проблем
12.1 Ошибка: «log file not found» для SSH
Причина: Rocky Linux использует systemd journal, а не текстовые файлы логов.
Решение: Убедитесь, что в jail.local есть backend = systemd в секции [DEFAULT].
12.2 Тюрьма (jail) не запускается
Проверка конфигурации:
sudo fail2ban-client -t
✅ Ожидаемый вывод:
OK: configuration test is successful
Проверка логов:
sudo journalctl -xeu fail2ban
12.3 Firewalld не запущен
Проверка:
sudo systemctl status firewalld
Запуск:
sudo systemctl enable --now firewalld
sudo systemctl restart fail2ban
12.4 Тест работы баннера
sudo fail2ban-client set sshd banip 203.0.113.7
sudo firewall-cmd --list-rich-rules
✅ Ожидаемый вывод:
rule family="ipv4" source address="203.0.113.7" port port="ssh" protocol="tcp" reject type="icmp-port-unreachable"
Очистка:
sudo fail2ban-client set sshd unbanip 203.0.113.7
13. Удаление Fail2Ban
13.1 Остановка и отключение
sudo systemctl stop fail2ban
sudo systemctl disable fail2ban
13.2 Удаление пакетов
sudo dnf remove fail2ban fail2ban-firewalld fail2ban-sendmail fail2ban-server -y
13.3 Удаление конфигурации (опционально)
sudo rm -rf /etc/fail2ban/
sudo rm -f /var/log/fail2ban.log*
sudo rm -rf /var/lib/fail2ban/
13.4 Проверка удаления
rpm -qa | grep fail2ban
✅ Ожидаемый вывод: (пусто)
Чек-лист: всё готово к работе
# 1. Проверка версии Fail2Ban
fail2ban-client --version
# 2. Проверка статуса сервиса
systemctl status fail2ban
# 3. Просмотр активных тюрем
sudo fail2ban-client status
# 4. Проверка логов (должны видеть запуск)
sudo tail -10 /var/log/fail2ban.log
# 5. Тест бана (забаньте тестовый IP и проверьте firewalld)
sudo fail2ban-client set sshd banip 203.0.113.7 && sudo firewall-cmd --list-rich-rules && sudo fail2ban-client set sshd unbanip 203.0.113.7
Заключение
Вы установили и настроили Fail2Ban на Rocky Linux для защиты от атак перебором.
Что теперь есть в системе:
- ✅ Автоматическая блокировка IP при подозрительной активности
- ✅ Защита SSH (и опционально веб-серверов, почты)
- ✅ Интеграция с firewalld
- ✅ Инструменты для управления банами и мониторинга
Что дальше:
- Настройте дополнительные тюрьмы (jails) для сервисов, которые вы используете (vsftpd, postfix, dovecot)
- Для повышения безопасности отключите аутентификацию по паролю в SSH и используйте ключи
- Настройте email-уведомления для получения оповещений о банах
- Периодически просматривайте логи для обнаружения новых атакующих паттернов