[Сервер] Установка, настройка и полное удаление Fail2ban

Fail2ban анализирует логи и блокирует IP-адреса, совершающие brute-force атаки. Это обязательный инструмент для безопасности любого Linux-сервера.

Полная очистка и подготовка (Глубокое удаление)

Прежде чем ставить новую версию, нужно убрать все «хвосты» и снять возможные блокировки системы.

# 1. Снимаем блокировки apt (если установка зависла ранее)
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/apt/lists/lock

# 2. Останавливаем службу
sudo systemctl stop fail2ban
sudo systemctl disable fail2ban

# 3. Удаляем старый пакет и его зависимости
sudo apt-get purge fail2ban -y
sudo apt-get autoremove -y

# 4. КРИТИЧЕСКИЙ ШАГ: Удаляем старые системные юниты (защита от ошибки 203/EXEC)
sudo rm -f /lib/systemd/system/fail2ban.service
sudo rm -f /etc/systemd/system/fail2ban.service

# 5. Вычищаем все папки и конфиги
sudo rm -rf /etc/fail2ban
sudo rm -rf /var/lib/fail2ban
sudo rm -f /var/log/fail2ban.log*

# 6. Сбрасываем кэш служб
sudo systemctl daemon-reload

Установка последней версии из GitHub

Установка из исходников даёт самую свежую версию, которой нет в стандартных репозиториях.

sudo systemctl stop fail2ban
sudo apt update
sudo apt install python3-pip python3-setuptools python3-systemd git -y
cd /tmp
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo pip install . --break-system-packages
sudo cp -rT /tmp/fail2ban/config /etc/fail2ban

[!NOTE] Обратите внимание:
Если на первом шаге вы полностью удаляли папку /etc/fail2ban, зайдите в консольное меню x-ui и перевключите IP Limit, чтобы панель заново создала свой рабочий конфиг действия и фильтр.

Настройка системной службы (Systemd)

Проверяем путь к файлу:

sudo which fail2ban-server

(Запомните результат, обычно это /usr/local/bin/fail2ban-server).

Создаём файл службы:

sudo nano /etc/systemd/system/fail2ban.service

Вставляем содержимое:

[Unit]
Description=Fail2Ban Service
Documentation=man:fail2ban(1)
After=network.target

[Service]
Type=simple
RuntimeDirectory=fail2ban
PIDFile=/run/fail2ban/fail2ban.pid
ExecStart=/usr/local/bin/fail2ban-server -xf start
ExecStop=/usr/local/bin/fail2ban-client stop
ExecReload=/usr/local/bin/fail2ban-client reload
KillMode=process
Restart=on-failure
RestartSec=5s
RestartPreventExitStatus=0 255

[Install]
WantedBy=multi-user.target

Запуск и активация

sudo systemctl daemon-reload  
sudo systemctl enable fail2ban  
sudo systemctl start fail2ban  
sudo systemctl status fail2ban

Конфигурация защиты (jail.local)

Никогда не меняйте jail.conf, все настройки делаем в jail.local.

sudo nano /etc/fail2ban/jail.local

Вставьте настройки:

[DEFAULT]
# Добавьте свой IP и IP сервера через пробел, чтобы не забанить себя
ignoreip = 127.0.0.1/8 ::1 ВАШ_IP_КЛИЕНТА ВАШ_IP_СЕРВЕРА
bantime = 1h
findtime = 10m
maxretry = 5
allowipv6 = true
backend = systemd

[sshd]
enabled = true
maxretry = 3
# Пожизненный бан
bantime = -1

Перезапуск для применения:

sudo systemctl restart fail2ban

Проверить, что ваши IP действительно внесены в список исключений (белый список):

sudo fail2ban-client get sshd ignoreip

Управление банами

Просмотр статистики:

sudo fail2ban-client status sshd

Забанить вручную:

sudo fail2ban-client set sshd banip <IP>

Разбанить:

sudo fail2ban-client set sshd unbanip <IP>

Общее число банов в логе:

sudo grep "Ban" /var/log/fail2ban.log | wc -l

Логи в реальном времени:

sudo tail -f /var/log/fail2ban.log | grep Ban

Ротация логов

Создаём конфиг:

sudo nano /etc/logrotate.d/fail2ban

Вставляем настройки:

/var/log/fail2ban.log {  
    size 10M  
    rotate 5
    missingok  
    notifempty  
    copytruncate  
    create 640 root adm  
}

Проверка (запустить ротацию принудительно):

sudo logrotate -f /etc/logrotate.d/fail2ban

Конфигурация для панели 3x-ui

Открываем:

sudo nano /etc/fail2ban/jail.d/3x-ipl.conf

Вставляем:

[3x-ipl]
enabled = true
backend = auto
filter = 3x-ipl
action = 3x-ipl
logpath = /var/log/x-ui/3xipl.log
ignoreip = 127.0.0.1/8 ::1 IP_СЕРВЕРА IP_ИНТЕРНЕТА
maxretry = 3
findtime = 60
bantime = -1

Перезапускаем:

sudo systemctl restart fail2ban

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

sudo fail2ban-client status 3x-ipl

Ротация логов для панели 3x-ui

Открываем:

sudo nano /etc/logrotate.d/3x-ui-ipl

Вставляем:

/var/log/x-ui/3xipl.log {  
    size 10M  
    rotate 5
    missingok  
    notifempty  
    copytruncate  
    create 640 root adm  
}

Проверка:

sudo logrotate -d /etc/logrotate.d/3x-ui-ipl

Флаг -d (debug) просто покажет, что именно logrotate собирается сделать, не совершая реальных действий. Если в выводе нет ошибок, то всё отлично.

Команда для разбана:

sudo fail2ban-client set 3x-ipl unbanip ТВОЙ_IP

Настройка уведомлений в Telegram

Fail2ban умеет присылать отчёты о блокировках и разблокировках прямо в Telegram.

1. Подготовка бота и получение Chat ID

  1. В Telegram найди бота @BotFather, отправь команду /newbot, задай имя и юзернейм. Сохрани полученный токен (вида 7710770860:AAE...).
  2. Запусти своего бота командой /start.
  3. Узнай свой Chat ID через бота @userinfobot или @getmyid_bot.

2. Создание файла действия (action)

Создаём конфигурационный файл:

sudo nano /etc/fail2ban/action.d/telegram.conf

Для сервера DE (напрямую):

[Definition]
norestored = 1
actionban = curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" -d "chat_id=<CHAT_ID>" -d "text=🚨 <b>[DE] Заблокирован IP:</b> <code><ip></code>%%0A<b>Тюрьма:</b> <name>%%0A<b>Попыток:</b> <failures>" -d "parse_mode=HTML" > /dev/null 2>&1

actionunban = curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" -d "chat_id=<CHAT_ID>" -d "text=✅ <b>[DE] Разблокирован IP:</b> <code><ip></code>%%0A<b>Тюрьма:</b> <name>" -d "parse_mode=HTML" > /dev/null 2>&1

Для сервера РФ (через SOCKS5):

[Definition]
norestored = 1
actionban = curl -s -x socks5h://127.0.0.1:10808 -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" -d "chat_id=<CHAT_ID>" -d "text=🚨 <b>[РФ] Заблокирован IP:</b> <code><ip></code>%%0A<b>Тюрьма:</b> <name>%%0A<b>Попыток:</b> <failures>" -d "parse_mode=HTML" > /dev/null 2>&1

actionunban = curl -s -x socks5h://127.0.0.1:10808 -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" -d "chat_id=<CHAT_ID>" -d "text=✅ <b>[РФ] Разблокирован IP:</b> <code><ip></code>%%0A<b>Тюрьма:</b> <name>" -d "parse_mode=HTML" > /dev/null 2>&1

3. Подключение уведомлений в тюрьмах

Открываем:

sudo nano /etc/fail2ban/jail.local

В секцию [DEFAULT] добавляем telegram ко всем стандартным действиям бана:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 <ВАШ_IP_КЛИЕНТА> <IP_СЕРВЕРА>
bantime = 1h
findtime = 10m
maxretry = 5
allowipv6 = true
backend = systemd
action = %(action_)s
         telegram

[sshd]
enabled = true
maxretry = 3
bantime = -1

Конфиг для панели 3x-ui

открываем:

sudo nano /etc/fail2ban/jail.d/3x-ipl.conf

Так как тюрьма 3x-ipl переопределяет директиву action, дописываем telegram второй строкой, чтобы срабатывали и блокировка панели, и бот:

[3x-ipl]
enabled = true
backend = auto
filter = 3x-ipl
action = 3x-ipl
         telegram
logpath = /var/log/x-ui/3xipl.log
ignoreip = 127.0.0.1/8 ::1 <IP_СЕРВЕРА> <ВАШ_IP_КЛИЕНТА>
maxretry = 3
findtime = 60
bantime = -1

После сохранения файлов применяем настройки:

sudo fail2ban-client reload

Проверка отправки сообщений

Забаним и разбаним тестовый IP-адрес:

sudo fail2ban-client set sshd banip 192.0.2.10
sudo fail2ban-client set sshd unbanip 192.0.2.10
sudo fail2ban-client set 3x-ipl banip 192.0.2.10
sudo fail2ban-client set 3x-ipl unbanip 192.0.2.10

Универсальный вариант (снимет блокировку сразу со всех джейлов, если адрес попал куда-то ещё):

sudo fail2ban-client unban 192.0.2.10

Заблокировать IP  во всех активных джейлах сразу через цикл:

for jail in $(sudo fail2ban-client status | sed -n 's/.*Jail list:\s*//p' | tr -d ','); do sudo fail2ban-client set "$jail" banip 192.0.2.10; done 

Если в Telegram пришли оба уведомления (о бане и разбане), значит, всё настроено верно.