Если читаете, то вы уже знаете о возможностях: 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 читает конфиги в порядке:
jail.conf(базовые настройки)jail.local(переопределяет jail.conf)jail.d/*.conf(дополнительные настройки)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:
- Webmin → Webmin Configuration → Webmin Modules
- From ftp or http URL:
http://www.webmin.com/third/fail2ban.wbm.gz - 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:
- System → Package Manager → Available Packages
- Ищем "pfBlockerNG" (имеет функции fail2ban)
- Install
OPNsense:
- System → Firmware → Plugins
- Ищем "os-fail2ban"
- 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% задач:
sudo fail2ban-client status— что происходитsudo fail2ban-client status sshd— кто забанен в SSHsudo 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). Практические примеры для системных администраторов.



