Мои игры с Fail2Ban

Внимание! Боты атакуют!

Короткое вступление. Сразу скажу, для меня это тёмный лес, и я пытаюсь пробраться сквозь эту чащу моего непонимания.

В чём вся эта подоплёка? Наблюдаю на рабочем сервере высокий трафик сканирования. Загрузка процессора виртуального хоста держится в районе 60-70% процентов. Сайт откликается, но с некой задержкой. Для обслуживания 1200 соединений тратятся ресурсы и заметно притормаживание. Надо понять на сколько это целевой трафик и что требуется сделать, или увеличивать мощность, или разгонять набежавших ботов.

«Ловит → Считает → Банит»

Вводная часть про инструмент, который будет использоваться. Fail2ban — это автоматический “сторожевой пёс” для серверов, который анализирует логи, вычисляет атаки (например, подбор SSH-паролей) и банит злоумышленников через фаервол, экономя ваши нервы и время. Появился как ответ на рутинную борьбу с ботами, а теперь стал must-have инструментом в любом дистрибутиве Linux — работает из коробки, но гибко настраивается под любую службу.

Fail2ban написан на Python, работает как фоновый демон, сканируя логи (SSH, Apache, Nginx и др.) через регулярные выражения. При превышении лимита попыток (например, 5 неудачных входов в SSH) он добавляет IP вредителя в фаервол (iptables/nftables/ufw) через временные правила. Поддерживает любые сервисы с логами — от почты (Postfix) до веб-приложений.

Всё. Всем всё понятно о чём будет речь, идём дальше.


И так, всё описанное ниже, надо применять не как метод “копи-паст”, а как осмысленные действия. Да простят меня админы-профи.

Сразу проверяю про какую версию fail2ban пойдёт речь, и выполняю в терминале:

fail2ban-server -V

Ответ, версия такая: 0.11.1

План действия

Пожалуй в этот раз попробую писать не как я взял что-то такое непонятное и сразу сделал как надо или как хотел. Да, буду писать свои мысли. Опишу тот хаос, который происходи в моей голове. Сразу никакого плана и нет. Сперва простой набор мыслей. Вообще ничего не понятно, что и для чего и как быть. Вот как.

Вижу нагрузку на веб-сервер. Вижу это с помощью утилиты htop. Установите её если ещё нет.

Глядя на htop надо понять кто/что повышает нагрузку на процессор. Да, видно, что не просто так там процессор напрягается. Понять бы по делу он это делает или нет?

Это просто пример как работает утилита htop и что в ней видно

Я увидел, что постоянно под нагрузкой находится php-fpm, mysql и сам веб сервер apache2 уже не сильно.

Есть достаточное количество логов веб-сервера Apache2. В них и история, и текущий процесс обращения к ресурсу. Будем смотреть в логах, что не так и что делать дальше.

Смотрим лог в интерактиве, утилитой less, указав параметр +F, чтоб всё было интерактивно:

less +F /var/log/apache2/other_vhosts_access.log

У меня несколько виртуальных веб-серверов пишут в один other_vhosts_access.log

Но по-умолчанию он размещается и называется так: /var/log/apache2/access.log

Ниже мини-видео, для демонстрации как это всё происходило до того как заработал Fail2Ban.

Принцип работы fail2ban

Это я решил написать, потому как сам сперва в этом плавал, и вообще не мог понять, что с чем едят.

Как говориться: Хотите понять, читайте не спеша и вдумчиво.

Прежде чем начнёте всё подряд банить, попробуйте себе не отстрелить ногу)) и сразу сделайте себе и всем вашим нужным IP-адресам исключение (192.168.1.1 замените на нужное):

sudo iptables -I INPUT -s 192.168.1.1 -j ACCEPT

И ещё, в файле настроек jail.local, о котором будет сказано ниже по тексту, вам бы так же желательно указать игнорируемые IP-адреса, например: XXX, YYY и ZZZ:

ignoreip = 127.0.0.1/8 ::1 XXX.XXX.XXX.XXX YYY.YYY.YYY.YYY ZZZ.ZZZ.ZZZ.ZZZ

Структура каталогов и файлов

Основные папки и файлы fail2ban (в Linux Ubuntu/Debian):

/etc/fail2ban/
├── fail2ban.conf # Основные настройки демона (логи, уровень детализации)
├── jail.conf # Главный файл с «тюрьмами» (не редактируется!)
├── jail.d/ # Папка для ваших кастомных «тюрем»
│     └── custom-jail.conf # Ваши правила блокировок (например, для Apache)
├── filter.d/ # Папка с фильтрами (шаблонами для анализа логов)
│     ├── apache-badbots.conf
│     └── sshd.conf
└── action.d/ # Папка с действиями (как именно банить: iptables, nftables, Cloudflare)

Как Fail2ban обрабатывает настройки?

  1. Читает fail2ban.conf
    • Настройки самого демона (например, как часто проверять логи).
    • Не трогаем, если нет особых причин.
  2. Загружает jail.conf
    • Стандартные правила для сервисов (SSH, Apache, Nginx).
    • Важно: Этот файл не редактируют — он обновляется при апгрейдах!
      • поэтому делают дополнительно jail.local
      • так: sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  3. Добавляет ваши настройки из jail.d/
    • Fail2ban объединяет jail.conf и все .conf-файлы из jail.d/ (ваши правила имеют приоритет).
  4. Использует фильтры из filter.d/
    • Каждый файл здесь — это шаблон для анализа логов (например, как находить атаки на SSH или WordPress).
  5. Применяет действия из action.d/
    • Здесь прописано, как именно банить IP (через iptables, ufw, Cloudflare API и т.д.).

Вот если бы мне кто-то так сразу пояснил, что и как тут работает)))

Последовательность настройки

Создаем свой «jail» (правило блокировки)

Файл: /etc/fail2ban/jail.d/my-php-botscan.conf

[my-php-botscan]

enabled = true
port = http,https
filter = my-php-botscan
logpath = /var/log/apache2/other_vhosts_access.log
maxretry = 3
findtime = 600 
bantime = 86400
bantime.increment = true
bantime.rndtime = 0
bantime.factor = 2
bantime.formula = ban.time * (ban.count ** ban.factor)

Создаем фильтр (шаблон поиска атак)

Файл: /etc/fail2ban/filter.d/my-php-botscan.conf

[Definition]
failregex = ^\S+:\d+ <HOST> .*"(GET|POST) \/\S*\.php(\?.*)? HTTP\/.* 404
ignoreregex =

Проверяем работу фильтра

Выполняем команду в окне терминала:

sudo fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/my-php-botscan.conf

Можно и вот так проверить, просто указав регулярное выражение:

sudo fail2ban-regex /var/log/apache2/access.log '^\S+:\d+ <HOST> .*"(GET|POST) \/\S*\.php(\?.*)? HTTP\/.* 404'

Тут стоит отметить, что у меня виртуальные сервера и лог веб-сервера апачи с именем: other_vhosts_access.log и я делаю даже вот так (посмотрите на параметр --print-all-matched):

sudo fail2ban-regex /var/log/apache2/other_vhosts_access.log /etc/fail2ban/filter.d/my-php-botscan.conf --print-all-matched

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

Все уже давно поняли, что такое выполняется в окне терминала и пора это не объяснять:

sudo systemctl restart fail2ban

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

sudo fail2ban-client status my-php-botscan

Получим в ответ:

Status for the jail: my-php-botscan
|- Filter
| |- Currently failed:  0
| |- Total failed:      0
| `- File list:         /var/log/apache2/other_vhosts_access.log 
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   102.223.223.139

И тут видно, что одного гадёныша прижали ;-) вот и посмотрите, что за чёрт это:

Ключевые моменты

  • Фильтры (filter.d/) — это «шаблоны поиска» атак в логах.
  • Тюрьмы (jail.d/) — связывают фильтры с сервисами (например, Apache) и указывают, как банить.
  • Действия (action.d/) — определяют метод блокировки (например, через iptables).

Что делать, если не работает?

  • Проверь конфиги:
    fail2ban-client --test
  • Проверьте логи fail2ban:
    sudo tail -f /var/log/fail2ban.log
  • Тестируйте фильтры вручную (как выше) или вот так:
    fail2ban-regex {/path/to/logfile} {/etc/fail2ban/filter.d/your-filter.conf}
  • Убедитесь, что logpath правильный (путь к логам).
  • Перезагружай при смене настроек и смотри в лог:
    sudo systemctl restart fail2ban

💡 Пример из жизни

Допустим, бот агрессивно сканирует wp-admin.php.

Как Fail2ban это обрабатывает:

  1. Читает лог Apache → находит 404 ошибки.
  2. Сравнивает с фильтром my-php-botscan → видит совпадение.
  3. Применяет правило из jail.d/my-php-botscan.conf → добавляет IP в iptables.
  4. Злоумышленник получает Connection timed out 😈.

Наблюдайте в интерактиве как выдаются баны:

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

Fail2ban — игра в защиту с продуманной стратегией

Главное правило — не бросаться настраивать все фильтры разом. Слишком жёсткие или конфликтующие правила могут сломать работу сервисов, и вместо защиты вы получите головную боль. Начинайте с малого:

  1. Этап 1 — базовые правила (SSH, веб-сервер).
  2. Этап 2 — мониторинг логов, проверка ложных срабатываний.
  3. Этап 3 — постепенное добавление сложных фильтров (почта, API).

Так вы постепенно построите надёжную защиту, а не утонете в отладке. Fail2ban — это многоуровневая игра, где важно не спешить и тестировать каждый шаг.

(P.S. Лучшая защита — та, которую вы понимаете и контролируете.)