Введение: зачем нужен Fail2Ban и что пошло не так
Fail2Ban мониторит логи (sshd, exim, nginx), банит IP через iptables при неудачных попытках входа. Но иногда банит "своих": тестовый IP, CDN, мониторинг.
Типичный сценарий из логов:
fail2ban-client status exim
Status for the jail: exim
|- Filter
| |- Currently failed: 1
| |- Total failed: 150
| `- File list: /var/log/exim4/mainlog
`- Actions
|- Currently banned: 5
|- Total banned: 42
`- Banned IP list: 185.189.14.130 94.26.115.245 ...
IP 185.189.14.130 забанен exim-jail'ом. Команды из вашего примера решают проблему, но вручную чистить iptables — риск сломать цепочку. Разберём по шагам.
Команда 1: Проверка общего статуса Fail2Ban
fail2ban-client status
Вывод:
Status
|- Number of jail: 3
`- Jail list: sshd, exim, nginx-http-auth
Зачем: Видите все активные jail'ы. Если exim нет — проверьте /etc/fail2ban/jail.local.
Команда 2: Статус конкретного jail'а (exim)
fail2ban-client status exim
Полный разбор вывода:
-
Currently failed: 1 — активных срабатываний фильтра сейчас
-
Total failed: 150 — всего попыток за время работы
-
File list — логи, которые мониторит (
/var/log/exim4/mainlog) -
Currently banned: 5 — забаненных IP в данный момент
-
Banned IP list — список IP для разбана
Совет: grep "185.189.14.130" /var/log/exim4/mainlog — почему забанили.
Команда 3: Разбан IP через Fail2Ban (основной метод)
fail2ban-client set exim unbanip 185.189.14.130
Что происходит:
-
Fail2Ban удаляет IP из внутренней базы banned
-
Автоматически чистит iptables-правило
-
Логирует в
/var/log/fail2ban.log
Проверка: Повторите status exim — IP исчезнет из списка.
Для всех jail'ов сразу:
fail2ban-client set ALL unbanip 185.189.14.130
Ручная чистка iptables (когда Fail2Ban глючит)
Если unbanip не сработал, удалите правила вручную:
# Найти цепочку Fail2Ban
iptables -L | grep f2b
# Удалить правило для IP (2 варианта из примера)
iptables -D f2b-exim -s 185.189.14.130 -j DROP
iptables -D fail2ban-exim -s 185.189.14.130 -j DROP
# Перезагрузить Fail2Ban (сохранит состояние)
fail2ban-client reload
Осторожно: -D удаляет первое совпадение. Сначала iptables -L f2b-exim -n --line-numbers — посмотрите номера строк.
Настройка exim-jail для предотвращения
Создайте /etc/fail2ban/jail.d/exim.conf:
[exim]
enabled = true
port = smtp,ssmtp,submission
filter = exim
logpath = /var/log/exim4/mainlog
maxretry = 5
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 185.189.14.130 # ваши IP
Перезапуск: systemctl restart fail2ban
Полный workflow разбана (скрипт)
Сохраните как unban-ip.sh:
#!/bin/bash
IP=$1
if [ -z "$IP" ]; then
echo "Usage: $0 <IP>"
exit 1
fi
echo "=== Проверка статуса ==="
fail2ban-client status
echo "=== Разбан $IP во всех jail'ах ==="
fail2ban-client set ALL unbanip $IP
echo "=== Проверка iptables ==="
iptables -L | grep $IP && echo "Остатки удалите вручную"
echo "=== Готово. Проверьте: fail2ban-client status ==="
Использование: chmod +x unban-ip.sh && ./unban-ip.sh 185.189.14.130
Сравнение методов разбана
Типичные ошибки и решения
-
"jail exim not found":
fail2ban-client status— включите в jail.local -
IP не разбанивается:
systemctl status fail2ban— сервис упал? -
Правила iptables остаются:
iptables -t filter -L f2b-exim -n -v -
Exim продолжает банить: Добавьте IP в
ignoreipjail'а
Мониторинг: watch -n 5 'fail2ban-client status' — каждые 5 сек.
Заключение
Fail2Ban спасает от брутфорса, но требует ухода. Команды status, set unbanip и ручной iptables -D — ваш арсенал. Автоматизируйте скриптом, настройте ignoreip для "своих", мониторьте логи. Exim-jail с maxretry=5 и bantime=1h оптимален для почты.
Сохраните скрипт, добавьте в PATH — проблема решена за 5 сек. Тестируйте на staging, делитесь в комментах своими jail'ами!