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
- В Telegram найди бота @BotFather, отправь команду
/newbot, задай имя и юзернейм. Сохрани полученный токен (вида7710770860:AAE...). - Запусти своего бота командой
/start. - Узнай свой
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 пришли оба уведомления (о бане и разбане), значит, всё настроено верно.