Пошаговые руководства, шпаргалки, полезные ссылки...
БлогФорумАвторы
Полезные Online-сервисы
Перечень Бесплатного ПО
Подписка на RSS-канал
fail2ban это популярное ПО для предотвращения вторжений, которое отслеживает файлы журналов на предмет подозрительной активности и динамически обновляет правила брандмауэра, блокируя подозрительные IP-адреса. В рассмотренной ниже конфигурации мы будем использовать fail2ban с журналом systemd в качестве бэкенда (вместо традиционного syslog) и nftables в качестве бэкенда брандмауэра.
Установим fail2ban и модуль python для systemd:
# apt install fail2ban python3-systemd
Основные настройки fail2ban расположены в файле fail2ban.conf (/etc/fail2ban/fail2ban.conf) и в большинстве случаев можно оставить его параметры в значениях по умолчанию. В нашем примере в этом файле изменяется только значение dbpurgeage с 1d на 10d и отключается поддержка IPv6.
/etc/fail2ban/fail2ban.conf
dbpurgeage
Приведу пример базовой конфигурации fail2ban.conf без учёта комментариев:
fail2ban.conf
# egrep -v "^[[:space:]]*#|^$" /etc/fail2ban/fail2ban.conf [DEFAULT] loglevel = INFO logtarget = /var/log/fail2ban.log syslogsocket = auto socket = /var/run/fail2ban/fail2ban.sock pidfile = /var/run/fail2ban/fail2ban.pid allowipv6 = off dbfile = /var/lib/fail2ban/fail2ban.sqlite3 dbpurgeage = 10d dbmaxmatches = 10 [Definition] [Thread]
Основные настройки блокировок для разных приложений можно найти в файле jail.conf (/etc/fail2ban/jail.conf).
/etc/fail2ban/jail.conf
Скопируем файл jail.conf в jail.local и будем править именно него, чтобы можно было обновлять в дальнейшем пакет без дополнительных предупреждений о переписывании основного конфига jail.conf:
# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # nano /etc/fail2ban/jail.local
Файл разделён на секции. Секция [DEFAULT] содержит основные настройки для блокировок любых приложений. Далее идут секции, описывающие параметры блокировок для конкретных приложений.
[DEFAULT]
Пример изменённых параметров в секции [DEFAULT] в конфигурационном файле jail.local:
[DEFAULT] # Время блокировки в секундах, # по истечении которого IP–адрес удаляется из пула заблокированных bantime = 1d # Время, в течение которого суммируются подозрительные попытки в количестве maxretry findtime = 30m # Количество подозрительных попыток, после которых применяется правило. # Применительно к sshd — это число неудачных попыток входа, # после которых происходит блокировка. maxretry = 3 # Используем библиотеку python systemd для доступа к журналу systemd backend = systemd # Файлы с правилами реагирования - в каталоге /etc/fail2ban/action.d/. # По умолчанию используются файлы iptables-multiport.conf и iptables-allports.conf # Заменим на файлы, связанные с nftables. # Заглянув в эти файлы можно понять как fail2ban работает с правилами iptables/nftables. banaction = nftables-multiport banaction_allports = nftables-allports
Пример изменённых параметров в секции [sshd] в конфигурационном файле jail.local.
[sshd]
Здесь мы переключаем режим работы по умолчанию с normal на aggressive, явно меняем backend на systemd и при необходимости корректируем номер порта, который используется sshd:
[sshd] #mode = normal #port = ssh #logpath = %(sshd_log)s #backend = %(sshd_backend)s mode = aggressive enabled = true backend = systemd port = 758 maxretry = 3
Перезапустим службу fail2ban и проверим ее статус:
# systemctl restart fail2ban # systemctl status fail2ban
Проверим состояние fail2ban и посмотрим какие Jail активны:
# fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd
Убедимся в том, что активен Jail для службы sshd и посмотрим его текущий статус:
# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
Проверим то, как отработает блокировка. Попытаемся подключиться к нашему серверу с внешнего IP, отличного от нашего (чтобы не заблокировать свой же адрес), с помощью SSH клиента:
$ ssh -p 758 fakeuser@your-server-ip
После третьей попытки ввода неверных учётных данных SSH-сервер должен начать отвергать запросы клиента на соединение.
Проверим статус fail2ban и убедимся в том, что для зловредного клиента появилось правило блокировки:
# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 3 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 77.88.44.242
Проверим состояние текущей конфигурации nftables. Здесь должна появится отдельная таблица f2b-table с цепочкой правил f2b-chain:
f2b-table
f2b-chain
# nft list ruleset... table inet f2b-table { set addr-set-sshd { type ipv4_addr elements = { 77.88.44.242 } } chain f2b-chain { type filter hook input priority filter - 1; policy accept; tcp dport 758 ip saddr @addr-set-sshd reject with icmp port-unreachable } }
Как видим, механизм защиты сработал. Добавленное в nftables правило должно будет автоматически удалиться через 24 часа, согласно заданным нами настройкам. Это предотвратит разрастание соответствующих цепочек и не окажет отрицательного влияния на производительность nftables.
Чтобы вручную разблокировать определённый IP-адрес, который был заблокирован fail2ban, можно выполнить команду в формате:
fail2ban-client set <JAIL> unbanip <IP>
Например, удалим из блокировки IP-адрес 77.88.44.242, который был заблокирован в соответствии с правилами секции [sshd] :
# fail2ban-client set sshd unbanip 77.88.44.242
Мы можем усилить уровень защиты, активировав дополнительный Jail «recidive» для анализа рецидивов. Этот джейл будет отслеживать файл журнала fail2ban и банить IP-адреса, которые были забанены несколько раз. Чтобы активировать Jail «recidive», отредактируйте в файле /etc/fail2ban/jail.local соответствующую секцию:
/etc/fail2ban/jail.local
# Jail for more extended banning of persistent abusers # !!! WARNINGS !!! # 1. Make sure that your loglevel specified in fail2ban.conf/.local # is not at DEBUG level -- which might then cause fail2ban to fall into # an infinite loop constantly feeding itself with non-informative lines # 2. Increase dbpurgeage defined in fail2ban.conf to e.g. 648000 (7.5 days) # to maintain entries for failed logins for sufficient amount of time [recidive] backend = auto logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 1w findtime = 3d enabled = true
Эта конфигурация сообщает fail2ban, что для отслеживания повторных нарушителей нужно использовать файл журнала fail2ban.log и блокировать для нарушителей все порты, используя для этого действие nftables-allports (берётся из переменной banaction_allports, значение которой мы указали ранее в конфигурации jail.local).
nftables-allports
banaction_allports
После внесения этих изменений перезапускаем fail2ban еще раз и проверяем, что теперь работают Jail «sshd» и «recidive»:
# systemctl restart fail2ban # fail2ban-client status Status |- Number of jail: 2 `- Jail list: recidive, sshd
Для процедур диагностики и отладки fail2ban и работающий в нём Jail, помимо выше обозначенной утилиты fail2ban-client, наглядным инструментом будет основной лог, где фиксируются практически все активности fail2ban:
# less /var/log/fail2ban.log
Дополнительные источники информации:
Проверено на следующих конфигурациях:
Автор первичной редакции: Алексей Максимов Время публикации: 14.08.2025 12:26