10-fail2ban — Fail2Ban (защита от брутфорса)
☐ Опциональный. Ставит Fail2Ban и настраивает jail для SSH: после нескольких неудачных попыток входа IP-адрес автоматически блокируется на заданное время. Локальные адреса в белом списке.
Зачем нужен
Fail2Ban следит за журналами и банит (временно блокирует файрволом) адреса, с которых идёт подбор пароля. Jail («тюрьма») — это правило: «какой лог смотреть, какой фильтр применять, при скольких провалах и на сколько банить». Модуль настраивает jail sshd — защиту SSH от брутфорса. Публичный сервер получает десятки-сотни попыток подбора в сутки; Fail2Ban отсекает их автоматически.
Когда включать и когда не нужен
Включайте на любом сервере с доступом по SSH из интернета.
Менее критично, если:
- SSH доступен только по ключам и полностью закрыт файрволом от внешнего мира (например, только через приватную сеть/VPN);
- вход по паролю отключён (
03-security). Даже тогда Fail2Ban полезен — он снижает шум в логах и нагрузку от ботов.
Зависимости и требования
- Отдельных модулей-зависимостей нет, но jail
sshdслушает ваш порт SSH (SSH_PORTиз03-security). - На семействе RHEL пакет берётся из EPEL — модуль подключает его сам (
os_ensure_epel). - backend = systemd: Fail2Ban читает журнал systemd (journald), а не текстовый файл
/var/log/auth.log. Это работает на всех современных дистрибутивах, включая те, гдеauth.logвообще не создаётся.
Что именно делает (по шагам module_install)
- Готовит репозитории: на RHEL подключает EPEL.
- Ставит пакет
fail2ban. - Рендерит
/etc/fail2ban/jail.localиз шаблонаtemplates/fail2ban/jail.local.template, подставляя ваши значения (бэкап прежнего файла делается заранее). - Включает и запускает службу
fail2ban. - Ждёт и проверяет jail: до 5 попыток
fail2ban-client status sshd, пока jail не станет активным (демону нужно время на старт). Если jail так и не поднялся — установка модуля падает.
Что в jail.local
[DEFAULT]
bantime = 1h # на сколько банить (F2B_BANTIME)
findtime = 10m # окно, в котором считаются провалы (F2B_FINDTIME)
maxretry = 5 # сколько провалов до бана (F2B_MAXRETRY)
backend = systemd # источник журналов — journald, не /var/log/auth.log
# Никогда не банить локальный трафик:
ignoreip = 127.0.0.1/8 ::1 # белый список адресов (ignoreip)
[sshd]
enabled = true
port = <SSH_PORT> # jail слушает ваш порт SSH
filter = sshd
maxretry = 5
Логика: если с одного IP за findtime (10 минут) наберётся maxretry (5) неудачных входов по SSH, адрес блокируется на bantime (1 час). Адреса из ignoreip (локальные) не банятся никогда.
Файлы, службы и порты
| Путь / юнит | Назначение | Права |
|---|---|---|
служба fail2ban |
демон, читает журнал и банит IP | root |
/etc/fail2ban/jail.local |
конфигурация jail'ов mitdev | root |
journald (journalctl) |
источник событий (backend=systemd) | — |
jail sshd |
правило защиты SSH на порту <SSH_PORT> |
— |
Fail2Ban своих портов не открывает — он управляет банами через файрвол/iptables.
Настройка
| Переменная | Значения | По умолчанию | Влияние | Когда менять |
|---|---|---|---|---|
SSH_PORT |
номер порта | 22 (SSH_PORT_DEFAULT) |
какой порт слушает jail sshd |
если SSH перенесён (03-security) |
F2B_BANTIME |
длительность (1h, 24h, -1=навсегда) |
1h |
на сколько банить нарушителя | ужесточить на агрессивном фоне атак |
F2B_FINDTIME |
длительность (10m, 1h) |
10m |
окно подсчёта провалов | увеличить, чтобы ловить «медленный» подбор |
F2B_MAXRETRY |
число | 5 |
провалов до бана | уменьшить для строгости, увеличить против ложных банов |
Как переопределить настройки
- Экспорт перед установкой:
F2B_BANTIME=24h F2B_MAXRETRY=3 F2B_FINDTIME=30m sudo -E ./install.sh - Правка
config/defaults.conf— строкиF2B_BANTIME,F2B_FINDTIME,F2B_MAXRETRY. - Правка
/etc/fail2ban/jail.localпосле установки, затемsudo systemctl restart fail2ban(илиsudo fail2ban-client reload).
Проверка, что всё работает
module_verify: служба fail2ban активна и fail2ban-client status sshd отрабатывает.
Вручную:
sudo fail2ban-client status # список активных jail'ов (есть sshd)
sudo fail2ban-client status sshd # детали: сколько провалов, забанено сейчас, список IP
mitdev doctor # строка «Fail2Ban … активен, забанено сейчас: N»
Пример вывода status sshd:
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| `- Total failed: 37
`- Actions
|- Currently banned: 1
`- Banned IP list: 203.0.113.45
Типовые задачи
# Статус конкретного jail (провалы, баны, список IP)
sudo fail2ban-client status sshd
# Разбанить свой IP, если случайно попал в бан
sudo fail2ban-client set sshd unbanip 203.0.113.45
# Забанить IP вручную
sudo fail2ban-client set sshd banip 203.0.113.45
# Перечитать конфиг после правки jail.local
sudo fail2ban-client reload
# Узнать свой публичный IP (чтобы не забанить себя / внести в ignoreip)
curl -s ifconfig.me
# Добавить свой офисный IP в белый список: правьте ignoreip в jail.local, затем reload
Частые ошибки
Симптом: сам не могу зайти по SSH — «Connection refused»/таймаут, хотя пароль верный. Причина: несколько неудачных попыток подряд — ваш IP забанен. Решение: зайдите с другого IP или через веб-консоль облака и разбаньте:
sudo fail2ban-client set sshd unbanip <ваш-ip>
# чтобы больше не банить себя — добавьте IP в ignoreip:
sudo nano /etc/fail2ban/jail.local # ignoreip = 127.0.0.1/8 ::1 <ваш-ip>
sudo fail2ban-client reload
Симптом: fail2ban-client status sshd — «Sorry but the jail 'sshd' does not exist».
Причина: служба не поднялась или jail не активен.
Решение: sudo systemctl status fail2ban; journalctl -u fail2ban -n 30; проверьте jail.local.
Симптом: после переноса SSH на новый порт баны не срабатывают.
Причина: в jail остался старый порт.
Решение: приведите port = <новый> в [sshd] секции jail.local (или переустановите модуль с новым SSH_PORT), затем reload.
Симптом: боюсь заблокировать себя при настройке.
Причина: нет своего адреса в белом списке.
Решение: заранее добавьте свой статический IP в ignoreip (см. первый рецепт) — эти адреса не банятся никогда.
Безопасность и продакшен
- Держите свой административный IP (офис/дом со статикой) в
ignoreip, чтобы не заблокировать себя при опечатках. - Fail2Ban — дополнение, а не замена: комбинируйте с входом по ключам и отключённым паролем (
03-security) и с файрволом (09-firewall). bantime = -1банит навсегда — используйте осознанно, иначе список банов будет расти.- Fail2Ban работает поверх файрвола: убедитесь, что
09-firewallустановлен и активен.
Откат и удаление
Автоматический откат (module_rollback): останавливает и отключает fail2ban, удаляет jail.local и пакет.
Ручное удаление:
mitdev remove fail2ban
При остановке службы все текущие баны снимаются (блокировки перестают действовать). Удаляются пакет и /etc/fail2ban/jail.local. Флаг --purge для этого модуля отдельного эффекта не имеет — пользовательских данных Fail2Ban не хранит.
См. также
- ../COMMANDS.md — обзор команд администрирования
- ../SECURITY.md — защита SSH и общая модель безопасности
- 03-security.md — усиление SSH и порт (
SSH_PORT) - 09-firewall.md — файрвол, поверх которого работают баны
- ../TROUBLESHOOTING.md — восстановление доступа при бане