Fail2Ban — Intrusion Prevention

If you like this project, consider supporting me on Buy Me a Coffee ☕️

Fail2Ban — Intrusion Prevention Framework

fail2ban is an intrusion prevention software framework that monitors log files for suspicious activity (e.g., repeated failed login attempts) and bans offending IP addresses using firewall rules (iptables/nftables/firewalld). It is the standard brute-force protection tool for SSH, web servers, and mail servers on Linux.

📚 Official Docs / Официальная документация: Fail2Ban

🔧 Basic Commands / Базовые команды

Service Management / Управление сервисом

sudo systemctl start fail2ban                 # Start fail2ban / Запустить fail2ban
sudo systemctl stop fail2ban                  # Stop fail2ban / Остановить fail2ban
sudo systemctl restart fail2ban               # Restart fail2ban / Перезапустить fail2ban
sudo systemctl status fail2ban                # Check status / Проверить статус
sudo systemctl enable fail2ban                # Enable on boot / Включить при загрузке

Client Commands / Команды клиента

sudo fail2ban-client status                   # List active jails / Список активных jails
sudo fail2ban-client ping                     # Test connection / Проверить соединение
sudo fail2ban-client reload                   # Reload configuration / Перезагрузить конфигурацию
sudo fail2ban-client version                  # Show version / Показать версию

🔒 Jail Management / Управление jail

Jail Status / Статус jail

sudo fail2ban-client status                   # List all jails / Список всех jails
sudo fail2ban-client status sshd              # Status of sshd jail / Статус jail sshd
sudo fail2ban-client status nginx-limit-req   # Status of nginx jail / Статус jail nginx
sudo fail2ban-client status apache-auth       # Status of apache jail / Статус jail apache

Jail Control / Управление jail

sudo fail2ban-client start sshd               # Start jail / Запустить jail
sudo fail2ban-client stop sshd                # Stop jail / Остановить jail
sudo fail2ban-client reload sshd              # Reload jail / Перезагрузить jail

🚫 Ban Operations / Операции бана

Manual Ban / Ручной бан

sudo fail2ban-client set sshd banip <IP>      # Ban IP in sshd jail / Забанить IP в jail sshd
sudo fail2ban-client set nginx-limit-req banip <IP>  # Ban IP in nginx jail / Забанить IP в jail nginx

Unban IP / Разбанить IP

sudo fail2ban-client set sshd unbanip <IP>    # Unban IP from sshd / Разбанить IP из sshd
sudo fail2ban-client set sshd unbanip --all   # Unban all IPs / Разбанить все IP

Check Banned IPs / Проверить забаненные IP

sudo fail2ban-client status sshd | grep "Banned IP"  # List banned IPs / Список забаненных IP
sudo iptables -L -n | grep fail2ban           # Check iptables rules / Проверить правила iptables
sudo nft list ruleset | grep fail2ban         # Check nftables rules / Проверить правила nftables

⚙️ Configuration / Конфигурация

Configuration Files / Файлы конфигурации

# /etc/fail2ban/fail2ban.conf                   # Main config / Основная конфигурация
# /etc/fail2ban/jail.conf                       # Default jail config / Конфигурация jail по умолчанию
# /etc/fail2ban/jail.local                      # Local jail overrides / Локальные переопределения jail
# /etc/fail2ban/jail.d/                         # Custom jail configs / Пользовательские конфигурации

Test Configuration / Проверить конфигурацию

sudo fail2ban-client -t                       # Test configuration / Проверить конфигурацию
sudo fail2ban-client reload                   # Reload after changes / Перезагрузить после изменений

Common Jail Settings / Общие настройки jail

[sshd]
enabled = true                                # Enable jail / Включить jail
port = ssh                                    # Port to protect / Порт для защиты
filter = sshd                                 # Filter to use / Фильтр для использования
logpath = /var/log/auth.log                   # Log file / Файл логов
maxretry = 5                                  # Max failed attempts / Макс неудачных попыток
findtime = 10m                                # Time window / Временное окно
bantime = 1h                                  # Ban duration / Длительность бана

🎯 Filters & Actions / Фильтры и действия

Filters / Фильтры

# /etc/fail2ban/filter.d/                       # Filter directory / Директория фильтров
# /etc/fail2ban/filter.d/sshd.conf              # SSH filter / SSH фильтр
# /etc/fail2ban/filter.d/nginx-limit-req.conf   # Nginx filter / Nginx фильтр

Test Filter / Проверить фильтр

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf  # Test SSH filter / Проверить SSH фильтр
sudo fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-limit-req.conf  # Test nginx filter / Проверить nginx фильтр

Actions / Действия

# /etc/fail2ban/action.d/                       # Action directory / Директория действий
# /etc/fail2ban/action.d/iptables.conf          # iptables action / iptables действие
# /etc/fail2ban/action.d/sendmail.conf          # Email notification / Email уведомление

📊 Monitoring & Logs / Мониторинг и логи

View Logs / Просмотр логов

sudo tail -f /var/log/fail2ban.log            # Follow fail2ban log / Следовать за логом fail2ban
sudo journalctl -u fail2ban -f                # Follow journal / Следовать за журналом
sudo grep "Ban" /var/log/fail2ban.log         # Show bans / Показать баны
sudo grep "Unban" /var/log/fail2ban.log       # Show unbans / Показать разбаны

Statistics / Статистика

sudo fail2ban-client status sshd              # Show jail stats / Показать статистику jail
sudo awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n  # Count bans by IP / Подсчитать баны по IP

🌟 Real-World Examples / Примеры из практики

Basic SSH Protection / Базовая защита SSH

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 10m
bantime = 1h

Nginx Rate Limiting / Ограничение скорости Nginx

# /etc/fail2ban/jail.local
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 1m
bantime = 1h

[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6
findtime = 1m
bantime = 1h

Apache Protection / Защита Apache

# /etc/fail2ban/jail.local
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
findtime = 10m
bantime = 1h

[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache2/error.log
maxretry = 6
findtime = 1m
bantime = 1h

MySQL/PostgreSQL Protection / Защита MySQL/PostgreSQL

# /etc/fail2ban/jail.local
[mysqld-auth]
enabled = true
port = 3306
filter = mysqld-auth
logpath = /var/log/mysql/error.log
maxretry = 5
findtime = 10m
bantime = 1h

[postgresql]
enabled = true
port = 5432
filter = postgresql
logpath = /var/log/postgresql/postgresql-*-main.log
maxretry = 5
findtime = 10m
bantime = 1h

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

# /etc/fail2ban/jail.local
[DEFAULT]
destemail = <EMAIL>
sendername = Fail2Ban
action = %(action_mwl)s

[sshd]
enabled = true
action = %(action_mwl)s

Permanent Ban After Recidive / Постоянный бан после рецидива

# /etc/fail2ban/jail.local
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = -1
findtime = 1d
maxretry = 5

Whitelist IPs / Белый список IP

# /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8

Custom Filter Example / Пример пользовательского фильтра

# /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^.*Failed login attempt from <HOST>.*$
            ^.*Authentication failure for .* from <HOST>.*$
ignoreregex =

Custom Action Example / Пример пользовательского действия

# /etc/fail2ban/action.d/telegram.conf
[Definition]
actionban = curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" -d "chat_id=<CHAT_ID>" -d "text=Banned IP: <ip>"
actionunban =

Monitor Fail2Ban Activity / Мониторинг активности Fail2Ban

#!/bin/bash
# Monitor fail2ban bans / Мониторинг банов fail2ban

while true; do
  echo "=== $(date) ==="
  sudo fail2ban-client status | grep "Jail list" | sed 's/.*://; s/,//g' | xargs -n1 | while read jail; do
    echo "Jail: $jail"
    sudo fail2ban-client status $jail | grep "Currently banned"
  done
  sleep 300
done

Unban All IPs / Разбанить все IP

#!/bin/bash
# Unban all IPs from all jails / Разбанить все IP из всех jails

for jail in $(sudo fail2ban-client status | grep "Jail list" | sed -E 's/^[^:]+:[ \t]+//' | sed 's/,//g')
do
  echo "Processing jail: $jail"
  sudo fail2ban-client set $jail unbanip --all
done

Export Ban List / Экспорт списка банов

# Export currently banned IPs / Экспортировать текущие забаненные IP
for jail in $(sudo fail2ban-client status | grep "Jail list" | sed 's/.*://; s/,//g'); do
  echo "=== $jail ==="
  sudo fail2ban-client status $jail | grep "Banned IP" | awk '{print $NF}'
done > banned-ips.txt

💡 Best Practices / Лучшие практики

🔧 Configuration Files / Файлы конфигурации

File Description (EN / RU)
/etc/fail2ban/fail2ban.conf Main config / Основная конфигурация
/etc/fail2ban/jail.conf Default jails / Jails по умолчанию
/etc/fail2ban/jail.local Local overrides / Локальные переопределения
/etc/fail2ban/filter.d/ Filter definitions / Определения фильтров
/etc/fail2ban/action.d/ Action definitions / Определения действий

📋 Common Jails / Распространённые jails

Jail Description (EN / RU)
sshd SSH protection / Защита SSH
apache-auth Apache authentication / Аутентификация Apache
nginx-limit-req Nginx rate limiting / Ограничение скорости Nginx
mysqld-auth MySQL protection / Защита MySQL
postfix Mail server protection / Защита почтового сервера
recidive Repeat offender jail / Jail для рецидивистов

⚠️ Important Notes / Важные примечания

On this page

Fail2Ban — Intrusion Prevention Framework 🔧 Basic Commands / Базовые команды Service Management / Управление сервисом Client Commands / Команды клиента 🔒 Jail Management / Управление jail Jail Status / Статус jail Jail Control / Управление jail 🚫 Ban Operations / Операции бана Manual Ban / Ручной бан Unban IP / Разбанить IP Check Banned IPs / Проверить забаненные IP ⚙️ Configuration / Конфигурация Configuration Files / Файлы конфигурации Test Configuration / Проверить конфигурацию Common Jail Settings / Общие настройки jail 🎯 Filters &amp; Actions / Фильтры и действия Filters / Фильтры Test Filter / Проверить фильтр Actions / Действия 📊 Monitoring &amp; Logs / Мониторинг и логи View Logs / Просмотр логов Statistics / Статистика 🌟 Real-World Examples / Примеры из практики Basic SSH Protection / Базовая защита SSH Nginx Rate Limiting / Ограничение скорости Nginx Apache Protection / Защита Apache MySQL/PostgreSQL Protection / Защита MySQL/PostgreSQL Email Notifications / Email уведомления Permanent Ban After Recidive / Постоянный бан после рецидива Whitelist IPs / Белый список IP Custom Filter Example / Пример пользовательского фильтра Custom Action Example / Пример пользовательского действия Monitor Fail2Ban Activity / Мониторинг активности Fail2Ban Unban All IPs / Разбанить все IP Export Ban List / Экспорт списка банов 💡 Best Practices / Лучшие практики 🔧 Configuration Files / Файлы конфигурации 📋 Common Jails / Распространённые jails ⚠️ Important Notes / Важные примечания