Перейти к содержимому

Уведомления Fail2ban в Notifly

Fail2ban автоматически банит IP, которые ломятся в SSH, веб-панель или почтовый сервер. По умолчанию он пишет только в лог. Подключим к нему Notifly — увидим живую картину атак.

Создайте файл /etc/fail2ban/action.d/notifly.conf:

[Definition]
actionstart = curl -s --max-time 10 "%(notifly_url)s/message?token=%(notifly_token)s" \
-H "Content-Type: application/json" \
-d '{"title":"🟢 Fail2ban запущен","message":"Jail <name> on <fq-hostname>","priority":3}'
actionstop = curl -s --max-time 10 "%(notifly_url)s/message?token=%(notifly_token)s" \
-H "Content-Type: application/json" \
-d '{"title":"🔴 Fail2ban остановлен","message":"Jail <name> on <fq-hostname>","priority":4}'
actionban = curl -s --max-time 10 "%(notifly_url)s/message?token=%(notifly_token)s" \
-H "Content-Type: application/json" \
-d '{"title":"🚫 Бан в jail <name>","message":"IP <ip> заблокирован на <fq-hostname>. Попыток: <failures>.","priority":5}'
actionunban = curl -s --max-time 10 "%(notifly_url)s/message?token=%(notifly_token)s" \
-H "Content-Type: application/json" \
-d '{"title":"✅ Разбан в jail <name>","message":"IP <ip> разблокирован на <fq-hostname>","priority":3}'
[Init]
notifly_url = https://your-notifly.example.com
notifly_token = AGdjfk_L.dKe8q

В /etc/fail2ban/jail.local добавьте action к нужному jail:

[sshd]
enabled = true
maxretry = 5
bantime = 1h
action = %(action_)s
notifly

Перезапустите Fail2ban:

Окно терминала
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

Спровоцируйте бан — например, с другой машины введите неправильный пароль 5 раз:

Окно терминала
for i in 1 2 3 4 5; do ssh -o PreferredAuthentications=password wronguser@server; done

В Notifly придёт «🚫 Бан в jail sshd».

Если хотите, чтобы громкое уведомление приходило только при «массовой атаке», поднимите priority до 9 в actionban и фильтруйте по <failures>:

actionban = curl -s --max-time 10 "%(notifly_url)s/message?token=%(notifly_token)s" \
-H "Content-Type: application/json" \
-d '{"title":"🚨 Атака на <name>","message":"IP <ip>: <failures> попыток за <bantime>s","priority":9}'

Или сделайте отдельный jail с очень коротким findtime/maxretry — он будет триггериться только на массированные брутфорсы.

  • Real-time картина атак. Сразу понятно, по каким сервисам идёт огонь и из каких сетей.
  • Подтверждение, что Fail2ban работает. Старт/стоп тоже приходят — если на сервере падает fail2ban, вы об этом узнаете.
  • Удобно для аудитов. История уведомлений в Notifly = история банов с поиском и фильтрами.
  • Добавьте геолокацию: получайте <ip> через geoiplookup в скрипте-обёртке.
  • Сделайте отдельный jail для «постоянных гостей» (recidive) — на них настройте priority=10.
  • Объедините с уведомлением о SSH-входах, чтобы весь периметр был как на ладони.