
Короткое вступление. Сразу скажу, для меня это тёмный лес, и я пытаюсь пробраться сквозь эту чащу моего непонимания.
В чём вся эта подоплёка? Наблюдаю на рабочем сервере высокий трафик сканирования. Загрузка процессора виртуального хоста держится в районе 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 надо понять кто/что повышает нагрузку на процессор. Да, видно, что не просто так там процессор напрягается. Понять бы по делу он это делает или нет?

Я увидел, что постоянно под нагрузкой находится 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 обрабатывает настройки?
- Читает
fail2ban.conf
- Настройки самого демона (например, как часто проверять логи).
- Не трогаем, если нет особых причин.
- Загружает
jail.conf
- Стандартные правила для сервисов (SSH, Apache, Nginx).
- Важно: Этот файл не редактируют — он обновляется при апгрейдах!
- поэтому делают дополнительно
jail.local
- так:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
- поэтому делают дополнительно
- Добавляет ваши настройки из
jail.d/
- Fail2ban объединяет
jail.conf
и все.conf
-файлы изjail.d/
(ваши правила имеют приоритет).
- Fail2ban объединяет
- Использует фильтры из
filter.d/
- Каждый файл здесь — это шаблон для анализа логов (например, как находить атаки на SSH или WordPress).
- Применяет действия из
action.d/
- Здесь прописано, как именно банить IP (через
iptables
,ufw
, Cloudflare API и т.д.).
- Здесь прописано, как именно банить IP (через
Вот если бы мне кто-то так сразу пояснил, что и как тут работает)))
Последовательность настройки
Создаем свой «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 это обрабатывает:
- Читает лог Apache → находит 404 ошибки.
- Сравнивает с фильтром
my-php-botscan
→ видит совпадение. - Применяет правило из
jail.d/my-php-botscan.conf
→ добавляет IP вiptables
. - Злоумышленник получает Connection timed out 😈.
Наблюдайте в интерактиве как выдаются баны:
sudo tail -f /var/log/fail2ban.log | grep 'Ban'
Fail2ban — игра в защиту с продуманной стратегией
Главное правило — не бросаться настраивать все фильтры разом. Слишком жёсткие или конфликтующие правила могут сломать работу сервисов, и вместо защиты вы получите головную боль. Начинайте с малого:
- Этап 1 — базовые правила (SSH, веб-сервер).
- Этап 2 — мониторинг логов, проверка ложных срабатываний.
- Этап 3 — постепенное добавление сложных фильтров (почта, API).
Так вы постепенно построите надёжную защиту, а не утонете в отладке. Fail2ban — это многоуровневая игра, где важно не спешить и тестировать каждый шаг.
(P.S. Лучшая защита — та, которую вы понимаете и контролируете.)