Fail2ban: шпаргалка IT-инженера по защите сервера от брутфорса

Fail2ban: шпаргалка IT-инженера по защите сервера от брутфорса

Если читаете, то вы уже знаете о возможностях: fail2ban — это автоматический бан IP-адресов, которые слишком часто ошибаются с паролем. SSH брутфорсят? Fail2ban забанит после 5 попыток. Asterisk атакуют? Fail2ban заблокирует через iptables. Настраивается за 10 минут, работает годами.

Эта шпаргалка — для тех, кто хочет быстро защитить SSH, веб-сервер, Asterisk, почту и другие сервисы от брутфорс-атак, научиться разбанивать IP, настраивать кастомные правила и управлять fail2ban через веб-интерфейс.

Когда это использовать

Реальные кейсы:

  • SSH брутфорс — тысячи попыток подбора пароля в день
  • Asterisk/FreePBX атаки — подбор SIP-аккаунтов
  • Веб-атаки — брутфорс WordPress, Joomla, панелей управления
  • Почтовый сервер — подбор паролей SMTP/IMAP
  • FTP брутфорс — попытки взлома FTP-аккаунтов
  • DDoS митигация — блокировка источников флуда

Типовые ситуации:

  • В логах SSH сотни неудачных попыток входа
  • Asterisk показывает REGISTER flood
  • Nginx логи полны 404/403 с одного IP
  • SMTP-сервер получает спам с одних и тех же адресов
  • Нужно автоматически блокировать подозрительные IP

Ошибки новичков:

  • Устанавливают fail2ban, но не запускают — защита не работает
  • Банят себя и не знают как разбанить
  • Не добавляют свой IP в whitelist — остаются без доступа
  • Используют дефолтные настройки — слишком мягкие для реальных атак
  • Не настраивают email-уведомления — не знают о банах
  • Забывают про logrotate — fail2ban перестаёт работать после ротации логов

Быстрый старт

Установка на Ubuntu/Debian:


# Установка
sudo apt update
sudo apt install fail2ban -y

# Запуск и автозагрузка
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# Проверка статуса
sudo systemctl status fail2ban

Базовая настройка SSH (минимум для работы):


# Создаём локальный конфиг
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Редактируем
sudo nano /etc/fail2ban/jail.local

Включаем защиту SSH:


[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600

# Перезапускаем
sudo systemctl restart fail2ban

# Проверяем статус SSH jail
sudo fail2ban-client status sshd

Проверка забаненных IP:


sudo fail2ban-client status sshd

Разблокировка IP:


sudo fail2ban-client set sshd unbanip 192.168.1.100

Установка fail2ban

Debian/Ubuntu/Astra Linux


# Обновляем репозитории
sudo apt update

# Устанавливаем fail2ban
sudo apt install fail2ban -y

# Запускаем
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# Проверяем версию
fail2ban-client version
# Вывод: Fail2Ban v1.0.2

CentOS/RHEL/Rocky/AlmaLinux


# Включаем EPEL репозиторий
sudo dnf install epel-release -y
# ИЛИ для CentOS 7
sudo yum install epel-release -y

# Устанавливаем fail2ban
sudo dnf install fail2ban fail2ban-systemd -y
# ИЛИ
sudo yum install fail2ban fail2ban-systemd -y

# Запускаем
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# Проверяем статус
sudo systemctl status fail2ban

Fedora


sudo dnf install fail2ban fail2ban-systemd -y
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

Arch Linux


sudo pacman -S fail2ban

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

FreeBSD


# Через pkg
pkg install py39-fail2ban

# Через ports
cd /usr/ports/security/py-fail2ban
make install clean

# Включаем в rc.conf
echo 'fail2ban_enable="YES"' >> /etc/rc.conf

# Запускаем
service fail2ban start

Структура конфигурации

Основные файлы и директории


/etc/fail2ban/
├── action.d/          # Действия при бане (iptables, mail, и т.д.)
├── filter.d/          # Фильтры для парсинга логов
├── jail.d/            # Дополнительные jail конфиги
├── fail2ban.conf      # Основной конфиг (не редактируем)
├── fail2ban.local     # Локальный конфиг (создаём сами)
├── jail.conf          # Jail конфиг (не редактируем)
└── jail.local         # Локальный jail конфиг (создаём сами)

ВАЖНО: Никогда не редактируйте .conf файлы напрямую. Всегда создавайте .local копии.

Создание локальных конфигов


# Копируем jail.conf в jail.local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Редактируем jail.local
sudo nano /etc/fail2ban/jail.local

# Создаём кастомный jail (рекомендуется)
sudo nano /etc/fail2ban/jail.d/custom.local

Приоритет конфигов

Fail2ban читает конфиги в порядке:

  1. jail.conf (базовые настройки)
  2. jail.local (переопределяет jail.conf)
  3. jail.d/*.conf (дополнительные настройки)
  4. jail.d/*.local (переопределяют всё)

Базовая настройка jail.local

Секция [DEFAULT] — глобальные настройки


sudo nano /etc/fail2ban/jail.local

[DEFAULT]
# Игнорируемые IP (whitelist)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.100

# Время бана (секунды)
bantime = 3600        # 1 час
# ИЛИ
bantime = 86400       # 1 день
# ИЛИ
bantime = -1          # Навсегда (не рекомендуется)

# Окно времени для подсчёта попыток (секунды)
findtime = 600        # 10 минут

# Максимум неудачных попыток
maxretry = 5

# Backend для мониторинга логов
backend = systemd     # Для systemd (Ubuntu 16.04+, Debian 9+, CentOS 7+)
# ИЛИ
backend = auto        # Автоопределение

# Email уведомления
destemail = admin@example.com
sendername = Fail2Ban
sender = fail2ban@example.com

# Действие при бане
action = %(action_mwl)s
# action_   = только бан
# action_mw = бан + email с whois
# action_mwl = бан + email с whois + логи (рекомендуется)

Включение конкретных jail


# SSH защита
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log    # Debian/Ubuntu
# logpath = /var/log/secure     # CentOS/RHEL
maxretry = 5
bantime = 3600
findtime = 600

# Nginx защита от HTTP flood
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5

# Apache защита
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5

Применение изменений


# Проверка конфигурации
sudo fail2ban-client -d

# Перезагрузка fail2ban
sudo systemctl restart fail2ban

# ИЛИ перезагрузка конфигов без остановки
sudo fail2ban-client reload

# Проверка статуса
sudo fail2ban-client status

Настройка защиты SSH

Базовая защита SSH


sudo nano /etc/fail2ban/jail.d/sshd.local

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600

SSH на нестандартном порту


[sshd]
enabled = true
port = 2222           # Ваш нестандартный порт
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400       # 24 часа
findtime = 600

Агрессивная защита SSH


[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3          # Всего 3 попытки
bantime = 86400       # Бан на сутки
findtime = 3600       # Окно 1 час

Защита от SSH DDoS


[sshd-ddos]
enabled = true
port = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 6
bantime = 600
findtime = 60

Проверка работы SSH jail


# Статус SSH jail
sudo fail2ban-client status sshd

# Вывод:
# Status for the jail: sshd
# |- Filter
# |  |- Currently failed: 2
# |  |- Total failed:     145
# |  `- File list:        /var/log/auth.log
# `- Actions
#    |- Currently banned: 3
#    |- Total banned:     12
#    `- Banned IP list:   192.168.1.50 10.0.0.25 203.0.113.100

# Список забаненных IP
sudo fail2ban-client get sshd banned

# Логи fail2ban
sudo tail -f /var/log/fail2ban.log

Настройка защиты Asterisk/FreePBX

Asterisk — защита от брутфорса SIP


sudo nano /etc/fail2ban/jail.d/asterisk.local

[asterisk]
enabled = true
port = 5060,5061
filter = asterisk
logpath = /var/log/asterisk/full
maxretry = 5
bantime = 86400
findtime = 600
action = iptables-allports[name=ASTERISK, protocol=all]

FreePBX — полная защита


# Защита от неудачных регистраций
[asterisk-iptables]
enabled = true
filter = asterisk
port = 5060,5061
logpath = /var/log/asterisk/full
maxretry = 5
bantime = 86400
findtime = 600
action = iptables-allports[name=ASTERISK]

# Защита от security events
[asterisk-security]
enabled = true
filter = asterisk-security
port = 5060,5061
logpath = /var/log/asterisk/security
maxretry = 3
bantime = 86400
findtime = 600
action = iptables-allports[name=ASTERISK-SEC]

Создание кастомного фильтра для Asterisk

Если стандартный фильтр не срабатывает:


sudo nano /etc/fail2ban/filter.d/asterisk-custom.conf

[Definition]
failregex = NOTICE.* .*: Registration from '.*' failed for ':.*' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for ':.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for ':.*' - Username/auth name mismatch
            NOTICE.* .*: Call from '.*' \(:.*\) to extension .* rejected because extension not found
            NOTICE.* .*: No registration for peer '.*' \(from \)

ignoreregex =

Используем кастомный фильтр:


[asterisk-custom]
enabled = true
filter = asterisk-custom
port = 5060,5061
logpath = /var/log/asterisk/full
maxretry = 3
bantime = 86400

Тестирование фильтра Asterisk


# Тестируем фильтр на реальном логе
sudo fail2ban-regex /var/log/asterisk/full /etc/fail2ban/filter.d/asterisk.conf

# Вывод должен показать найденные совпадения
# Success, the total number of match is 45

Настройка защиты веб-серверов

Nginx — базовая защита


sudo nano /etc/fail2ban/jail.d/nginx.local

# Защита от брутфорса HTTP auth
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600

# Защита от 404 флуда
[nginx-noscript]
enabled = true
filter = nginx-noscript
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 10
bantime = 600

# Защита от плохих ботов
[nginx-badbots]
enabled = true
filter = nginx-badbots
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400

# Защита от сканеров уязвимостей
[nginx-noproxy]
enabled = true
filter = nginx-noproxy
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400

# Лимит запросов (req-limit)
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 600
findtime = 60

Apache — базовая защита


sudo nano /etc/fail2ban/jail.d/apache.local

# HTTP auth брутфорс
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 3600

# 404 errors
[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache2/error.log
maxretry = 10
bantime = 600

# Баны плохих ботов
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
bantime = 86400

# Overflows (попытки overflow атак)
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache2/error.log
maxretry = 2
bantime = 86400

WordPress — защита от брутфорса


sudo nano /etc/fail2ban/filter.d/wordpress.conf

[Definition]
failregex = ^ .* "POST /wp-login.php
            ^ .* "POST /xmlrpc.php

ignoreregex =

sudo nano /etc/fail2ban/jail.d/wordpress.local

[wordpress]
enabled = true
filter = wordpress
port = http,https
logpath = /var/log/nginx/access.log
# ИЛИ для Apache
# logpath = /var/log/apache2/access.log
maxretry = 5
bantime = 3600
findtime = 600

Настройка защиты почтовых серверов

Postfix — защита SMTP


sudo nano /etc/fail2ban/jail.d/postfix.local

# Postfix SMTP auth
[postfix-sasl]
enabled = true
port = smtp,submission,smtps
filter = postfix-sasl
logpath = /var/log/mail.log
maxretry = 5
bantime = 3600

# Postfix general
[postfix]
enabled = true
port = smtp,submission,smtps
filter = postfix
logpath = /var/log/mail.log
maxretry = 5
bantime = 3600

Dovecot — защита IMAP/POP3


sudo nano /etc/fail2ban/jail.d/dovecot.local

[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot
logpath = /var/log/mail.log
maxretry = 5
bantime = 3600

Управление fail2ban через fail2ban-client

Основные команды


# Статус fail2ban
sudo fail2ban-client status

# Вывод:
# Status
# |- Number of jail:      3
# `- Jail list:   sshd, nginx-http-auth, asterisk

# Статус конкретного jail
sudo fail2ban-client status sshd
sudo fail2ban-client status nginx-http-auth

# Список всех забаненных IP
sudo fail2ban-client banned

# Перезагрузка конфигурации
sudo fail2ban-client reload

# Перезагрузка конкретного jail
sudo fail2ban-client reload sshd

# Остановка fail2ban
sudo fail2ban-client stop

# Запуск fail2ban
sudo fail2ban-client start

# Ping (проверка работы сервера)
sudo fail2ban-client ping
# Вывод: Server replied: pong

Работа с банами IP


# Разбанить IP в конкретном jail
sudo fail2ban-client set sshd unbanip 192.168.1.100

# Забанить IP вручную
sudo fail2ban-client set sshd banip 203.0.113.50

# Список забаненных IP в jail
sudo fail2ban-client get sshd banned

# Проверка, забанен ли IP
sudo fail2ban-client get sshd banned | grep 192.168.1.100

Получение статистики


# Текущие неудачные попытки
sudo fail2ban-client get sshd failed

# Общее количество банов
sudo fail2ban-client get sshd banned

Управление jail


# Остановить jail (но не fail2ban)
sudo fail2ban-client stop sshd

# Запустить jail
sudo fail2ban-client start sshd

# Перезапустить jail
sudo fail2ban-client reload sshd

Разблокировка IP (unban)

Разблокировка через fail2ban-client


# Разбанить в конкретном jail
sudo fail2ban-client set sshd unbanip 192.168.1.100

# Разбанить везде (все jail)
for jail in $(sudo fail2ban-client status | grep "Jail list" | sed "s/.*://g" | sed "s/,//g"); do
    sudo fail2ban-client set $jail unbanip 192.168.1.100
done

Разблокировка через iptables напрямую

Если fail2ban-client не помогает:


# Смотрим правила iptables
sudo iptables -L -n --line-numbers | grep 192.168.1.100

# Удаляем правило (замените N на номер строки)
sudo iptables -D f2b-sshd N

# ИЛИ удаляем по IP
sudo iptables -D f2b-sshd -s 192.168.1.100 -j REJECT

Постоянное игнорирование IP (whitelist)


sudo nano /etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.100 203.0.113.50

# Перезагружаем
sudo systemctl restart fail2ban

Скрипт массовой разблокировки


#!/bin/bash
# unban-all.sh - Разбанить IP во всех jail

IP=$1

if [ -z "$IP" ]; then
    echo "Usage: $0 "
    exit 1
fi

echo "Unbanning $IP from all jails..."

for jail in $(fail2ban-client status | grep "Jail list" | sed "s/.*://g" | sed "s/,//g"); do
    echo "Jail: $jail"
    fail2ban-client set $jail unbanip $IP 2>/dev/null
done

echo "Done."

Использование:


chmod +x unban-all.sh
sudo ./unban-all.sh 192.168.1.100

Логи и мониторинг

Основной лог fail2ban


# Просмотр логов
sudo tail -f /var/log/fail2ban.log

# Последние баны
sudo grep "Ban" /var/log/fail2ban.log | tail -20

# Последние разбаны
sudo grep "Unban" /var/log/fail2ban.log | tail -20

# Поиск по IP
sudo grep "192.168.1.100" /var/log/fail2ban.log

# Статистика банов за сегодня
sudo grep "$(date '+%Y-%m-%d')" /var/log/fail2ban.log | grep "Ban" | wc -l

Мониторинг активных банов


# Все активные баны
sudo fail2ban-client status | grep "Jail list" | sed "s/.*://g" | sed "s/,//g" | while read jail; do
    echo "=== $jail ==="
    sudo fail2ban-client status $jail | grep "Banned IP"
done

Проверка iptables правил


# Все правила fail2ban в iptables
sudo iptables -L -n | grep f2b

# Детальный вывод с номерами строк
sudo iptables -L f2b-sshd -n --line-numbers

# Количество забаненных IP
sudo iptables -L f2b-sshd -n | grep REJECT | wc -l

Email уведомления

Настройка отправки email при банах:


sudo nano /etc/fail2ban/jail.local

[DEFAULT]
destemail = admin@example.com
sendername = Fail2Ban Server
sender = fail2ban@example.com
mta = sendmail

# Действие: бан + email с логами
action = %(action_mwl)s

Установка sendmail (если нет):


# Debian/Ubuntu
sudo apt install sendmail -y

# CentOS/RHEL
sudo dnf install sendmail -y

sudo systemctl start sendmail
sudo systemctl enable sendmail

Скрипт ежедневного отчёта


#!/bin/bash
# daily-report.sh

LOGFILE="/var/log/fail2ban.log"
REPORT="/tmp/fail2ban-report-$(date +%Y%m%d).txt"

echo "Fail2ban Daily Report - $(date)" > $REPORT
echo "========================================" >> $REPORT
echo "" >> $REPORT

echo "Total Bans Today:" >> $REPORT
grep "$(date '+%Y-%m-%d')" $LOGFILE | grep "Ban" | wc -l >> $REPORT
echo "" >> $REPORT

echo "Banned IPs:" >> $REPORT
grep "$(date '+%Y-%m-%d')" $LOGFILE | grep "Ban" | awk '{print $NF}' | sort | uniq -c | sort -rn >> $REPORT
echo "" >> $REPORT

echo "Active Jails:" >> $REPORT
fail2ban-client status >> $REPORT

# Отправляем email
mail -s "Fail2ban Daily Report" admin@example.com < $REPORT

Добавляем в cron:


sudo crontab -e

# Добавляем строку (запуск каждый день в 23:00)
0 23 * * * /usr/local/bin/daily-report.sh

WEB-GUI для fail2ban

Вариант 1: Fail2ban Web UI (Python Flask)

Ссылка: https://github.com/Sean-Der/fail2ban-web-ui

Установка:


# Установка зависимостей
sudo apt install python3-pip -y

# Клонируем репозиторий
cd /opt
sudo git clone https://github.com/Sean-Der/fail2ban-web-ui.git
cd fail2ban-web-ui

# Устанавливаем зависимости
sudo pip3 install -r requirements.txt

# Запускаем
sudo python3 app.py

Открываем в браузере: http://сервер:5000

Создание systemd сервиса:


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

[Unit]
Description=Fail2ban Web UI
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/fail2ban-web-ui
ExecStart=/usr/bin/python3 /opt/fail2ban-web-ui/app.py
Restart=always

[Install]
WantedBy=multi-user.target

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

Вариант 2: Webmin модуль для fail2ban

Установка Webmin:


# Добавляем репозиторий
sudo nano /etc/apt/sources.list
# Добавляем: deb http://download.webmin.com/download/repository sarge contrib

# Добавляем ключ
wget -qO - http://www.webmin.com/jcameron-key.asc | sudo apt-key add -

# Устанавливаем
sudo apt update
sudo apt install webmin -y

Открываем: https://сервер:10000

Установка модуля fail2ban:

  1. Webmin → Webmin Configuration → Webmin Modules
  2. From ftp or http URL: http://www.webmin.com/third/fail2ban.wbm.gz
  3. Install Module

Теперь в меню Webmin → Networking → Fail2Ban Intrusion Detector

Вариант 3: Cockpit с плагином fail2ban

Установка Cockpit:


# Ubuntu/Debian
sudo apt install cockpit -y

# CentOS/RHEL
sudo dnf install cockpit -y

# Запуск
sudo systemctl start cockpit
sudo systemctl enable cockpit.socket

Открываем: https://сервер:9090

Плагин fail2ban для Cockpit:


# Клонируем плагин
cd /usr/share/cockpit
sudo git clone https://github.com/45Drives/cockpit-fail2ban.git fail2ban

# Перезапускаем cockpit
sudo systemctl restart cockpit

Теперь в Cockpit появится раздел Fail2ban.

Вариант 4: Fail2web

Ссылка: https://github.com/Kaleado/fail2web

Установка:


# Зависимости
sudo apt install python3-pip -y

# Клонируем
cd /opt
sudo git clone https://github.com/Kaleado/fail2web.git
cd fail2web

# Устанавливаем
sudo pip3 install -r requirements.txt

# Запускаем
sudo python3 fail2web.py

Открываем: http://сервер:5000

Особенности Fail2web:

  • Простой и лёгкий интерфейс
  • Показывает статус jail
  • Позволяет разбанивать IP
  • Просмотр логов

Вариант 5: pfSense/OPNsense плагин

Если используете pfSense или OPNsense как файрвол:

pfSense:

  1. System → Package Manager → Available Packages
  2. Ищем "pfBlockerNG" (имеет функции fail2ban)
  3. Install

OPNsense:

  1. System → Firmware → Plugins
  2. Ищем "os-fail2ban"
  3. Install

Вариант 6: Создание своего простого веб-интерфейса

Простой PHP скрипт для просмотра статуса:


sudo nano /var/www/html/fail2ban.php

<?php
// Простой веб-интерфейс для fail2ban
// ВАЖНО: Защитите этот скрипт авторизацией!

echo "<h1>Fail2ban Status</h1>";

// Статус
echo "<h2>Overall Status</h2>";
echo "<pre>";
echo shell_exec('sudo fail2ban-client status');
echo "</pre>";

// Статус SSH
echo "<h2>SSH Jail</h2>";
echo "<pre>";
echo shell_exec('sudo fail2ban-client status sshd');
echo "</pre>";

// Логи (последние 50 строк)
echo "<h2>Recent Logs</h2>";
echo "<pre>";
echo shell_exec('sudo tail -50 /var/log/fail2ban.log');
echo "</pre>";
?>

Даём права на выполнение команд:


sudo visudo

Добавляем:


www-data ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client
www-data ALL=(ALL) NOPASSWD: /usr/bin/tail /var/log/fail2ban.log

ВАЖНО: Это небезопасно для production. Используйте только для тестирования или добавьте HTTP авторизацию.

Сравнение WEB-GUI решений

Решение Сложность установки Функционал Рекомендация
Fail2ban Web UI (Flask) Средняя Просмотр статуса, разбан, логи ✅ Хороший выбор для небольших серверов
Webmin модуль Простая Полное управление через Webmin ✅ Если уже используете Webmin
Cockpit плагин Простая Интеграция с Cockpit ✅ Для RHEL/CentOS серверов
Fail2web Средняя Базовый функционал ⚠️ Проект не очень активен
pfSense/OPNsense Простая Интеграция с файрволом ✅ Если используете pfSense/OPNsense
Свой PHP скрипт Очень простая Только просмотр ⚠️ Только для тестирования

Создание кастомных фильтров

Структура фильтра


sudo nano /etc/fail2ban/filter.d/custom.conf

[Definition]
# Регулярные выражения для обнаружения атак
failregex = ^.*Failed password for .* from .*$
            ^.*Invalid user .* from .*$

# Игнорируемые строки
ignoreregex =

# Дата/время формат (опционально)
datepattern = {^LN-BEG}

Тестирование фильтра


# Тест на реальном логе
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/custom.conf

# Тест на строке
sudo fail2ban-regex "Failed password for root from 192.168.1.100 port 22" /etc/fail2ban/filter.d/custom.conf

# Подробный вывод
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/custom.conf --print-all-matched

Пример: Защита от SQL injection


sudo nano /etc/fail2ban/filter.d/nginx-sqli.conf

[Definition]
failregex = ^ -.*(?:select|union|insert|update|delete|drop|create|alter).*$

ignoreregex =

sudo nano /etc/fail2ban/jail.d/nginx-sqli.local

[nginx-sqli]
enabled = true
filter = nginx-sqli
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400

Оптимизация и best practices

Оптимизация производительности


[DEFAULT]
# Использовать systemd backend (быстрее для systemd систем)
backend = systemd

# Уменьшить частоту проверки логов (если низкая нагрузка)
# НЕ рекомендуется для высоконагруженных серверов
bantime.increment = true

Постепенное увеличение времени бана


[DEFAULT]
# Увеличение времени бана с каждым повторным баном
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 604800  # Максимум 7 дней

Whitelist надёжных IP


[DEFAULT]
# Всегда добавляйте свои IP в whitelist
ignoreip = 127.0.0.1/8 ::1
           192.168.1.0/24
           10.0.0.0/8
           ВАШ_СТАТИЧЕСКИЙ_IP

Регулярное обновление фильтров


# Проверяем доступные обновления fail2ban
sudo apt update
sudo apt list --upgradable | grep fail2ban

# Обновляем
sudo apt upgrade fail2ban -y

# Перезапускаем после обновления
sudo systemctl restart fail2ban

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

Убедитесь, что logrotate настроен правильно:


sudo nano /etc/logrotate.d/fail2ban

/var/log/fail2ban.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        fail2ban-client flushlogs 1>/dev/null || true
    endscript
}

Частые ошибки и решения

Ошибка: "Unable to contact server"

Причина: Fail2ban сервер не запущен.

Решение:


# Запускаем сервер
sudo systemctl start fail2ban

# Проверяем статус
sudo systemctl status fail2ban

# Смотрим ошибки в логах
sudo journalctl -xe -u fail2ban

Ошибка: "No section: 'sshd'"

Причина: Jail не определён в конфиге.

Решение:


# Проверяем наличие секции [sshd] в jail.local
sudo grep -A 5 "\[sshd\]" /etc/fail2ban/jail.local

# Если нет - добавляем
sudo nano /etc/fail2ban/jail.local

Ошибка: Забанил самого себя

Решение 1: Через консоль (если есть доступ):


sudo fail2ban-client set sshd unbanip ВАШ_IP

Решение 2: Через IPMI/KVM/физический доступ:


# Останавливаем fail2ban
sudo systemctl stop fail2ban

# Чистим iptables
sudo iptables -F f2b-sshd

# Добавляем IP в whitelist
sudo nano /etc/fail2ban/jail.local
# Добавляем в ignoreip

# Запускаем обратно
sudo systemctl start fail2ban

Ошибка: Fail2ban не банит

Диагностика:


# Проверяем, включен ли jail
sudo fail2ban-client status

# Проверяем логи fail2ban
sudo tail -f /var/log/fail2ban.log

# Тестируем фильтр на логах
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

# Проверяем backend
sudo fail2ban-client get sshd backend

Возможные причины:

  • Неправильный путь к логу
  • Неправильный формат логов (измененный syslog)
  • Backend не поддерживает ваш формат логов
  • maxretry слишком большой

Ошибка: "Backend auto failed to start"

Решение:


# Явно указываем backend
sudo nano /etc/fail2ban/jail.local

[DEFAULT]
backend = systemd  # Для systemd систем
# ИЛИ
backend = polling  # Универсальный, но медленнее

Краткий чек-лист

Установка и базовая настройка:

  • ☐ Установлен fail2ban: sudo apt install fail2ban
  • ☐ Запущен и включен: sudo systemctl enable --now fail2ban
  • ☐ Создан jail.local: sudo cp jail.conf jail.local
  • ☐ Добавлен свой IP в whitelist (ignoreip)
  • ☐ Настроена защита SSH

После настройки:

  • ☐ Проверен статус: sudo fail2ban-client status
  • ☐ Протестированы фильтры: sudo fail2ban-regex
  • ☐ Настроены email-уведомления (опционально)
  • ☐ Проверена работа: попытка неудачного входа → бан
  • ☐ Проверена разблокировка: sudo fail2ban-client set sshd unbanip

Дополнительная защита:

  • ☐ Защита веб-сервера (nginx/apache)
  • ☐ Защита почты (postfix/dovecot)
  • ☐ Защита Asterisk (если используется)
  • ☐ Кастомные фильтры для специфичных сервисов

Мониторинг:

  • ☐ Регулярный просмотр логов: /var/log/fail2ban.log
  • ☐ Проверка iptables: sudo iptables -L -n | grep f2b
  • ☐ Установлен веб-интерфейс (опционально)
  • ☐ Настроен ежедневный отчёт (опционально)

Обслуживание:

  • ☐ Периодическая проверка whitelist
  • ☐ Обновление fail2ban при выходе новых версий
  • ☐ Проверка ротации логов
  • ☐ Резервное копирование конфигов

Резюме

Fail2ban — это как охранник, который запоминает лица нарушителей. Пытался взломать SSH? Бан. Флудил веб-сервер? Бан. Подбирал SIP-пароли? Бан на сутки.

Три команды, которые решают 90% задач:

  1. sudo fail2ban-client status — что происходит
  2. sudo fail2ban-client status sshd — кто забанен в SSH
  3. sudo fail2ban-client set sshd unbanip IP — разбанить себя

Базовая настройка (минимум для защиты SSH):


sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
# Включаем [sshd] enabled = true
# Добавляем свой IP в ignoreip
sudo systemctl restart fail2ban

Что обязательно сделать:

  • Добавьте свой статический IP в whitelist (ignoreip) — иначе забаните себя
  • Настройте email-уведомления — будете знать об атаках
  • Протестируйте разблокировку — чтобы не паниковать, когда забаните себя

Web-GUI: Если нужен веб-интерфейс — используйте Webmin модуль (проще всего) или Cockpit плагин (для RHEL/CentOS). Для небольших серверов подойдёт Fail2ban Web UI на Flask.

Fail2ban не защитит от целенаправленной DDoS-атаки, но отсечет 99% ботов и скрипт-кидди. А это уже снижает нагрузку на сервер и количество записей в логах в сотни раз.

Сохраните статью в закладки — в следующий раз настроите fail2ban за 5 минут, а не будете гуглить "как разбанить IP в fail2ban" в панике без доступа к серверу.

Следующая шпаргалка: iptables и nftables — файрволы для Linux.


Meta Description

Fail2ban настройка и шпаргалка: защита SSH, Asterisk, nginx, apache от брутфорса на Ubuntu, Debian, CentOS. Установка fail2ban, разблокировка IP (unban), jail.local конфигурация, веб-интерфейсы (Webmin, Cockpit). Практические примеры для системных администраторов.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх