[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"/ru/kb/how-to/vps/fail2ban-ustanovka-i-nastrojka-instrumentaKbData":3},{"page":4,"pages":137,"recommendedPages":138,"category":69,"categoryTree":69,"total":15,"currentOrder":166,"activeManualCategoryId":69,"tag":-1},{"route":5,"uuid":8,"title":9,"excerpt":10,"content":11,"view_count":12,"published_at":13,"modified_at":13,"like":14,"category":17,"hero_image":62,"seo_metadata":63,"schema_org_metadata":67,"open_graph_metadata":70,"sections":71,"tags":128,"breadcrumbs":129,"images":136},{"language":6,"path":7},"ru","/kb/how-to/vps/fail2ban-ustanovka-i-nastrojka-instrumenta","3c06c5bc-01ca-14b9-cc21-a2e45db85224","Fail2Ban: установка и настройка инструмента для защиты от брутфорса","Брутфорс (перебор паролей) – одна из самых частых атак на серверы. Боты круглосуточно сканируют интернет и подбирают логины и пароли к SSH, панелям управления, почте и сайтам.","\n\u003Cp>Брутфорс (перебор паролей) – одна из самых частых атак на серверы. Боты круглосуточно сканируют интернет и подбирают логины и пароли к SSH, панелям управления, почте и сайтам. При помощи Fail2Ban сервер можно защитить от брутфорса – эта служба-демон анализирует логи сервисов, ловит подозрительную активность и автоматически блокирует IP-адреса нарушителей через файрвол.&nbsp;\u003C/p>\n\n\n\n\u003Cp>В этой статье разберем, как установить Fail2Ban и выполнить его тонкую настройку: подобрать пороги блокировок, защитить нужные сервисы, написать собственный фильтр (\u003Ccode>failregex\u003C/code>) и проверить его утилитой \u003Ccode>fail2ban-regex\u003C/code>, настроить email-уведомления, а также включить прогрессивные блокировки.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Fail2Ban управляет правилами файрвола (\u003Ccode>iptables\u003C/code>/\u003Ccode>nftables\u003C/code>) и требует root-доступа. Поэтому он применим на \u003Ca href=\"https://beget.com/ru/vps?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=fail2ban&amp;utm_content=site_vps\">\u003Cstrong>VPS\u003C/strong>\u003C/a>\u003Cstrong> \u003C/strong>и \u003Ca href=\"https://beget.com/ru/dedicated-servers?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=fail2ban&amp;utm_content=site_dedicated_servers\">\u003Cstrong>выделенных серверах\u003C/strong>\u003C/a>. На виртуальном хостинге настроить его нельзя.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"chto-takoe-fail2ban-i-kak-on-rabotaet\">Что такое Fail2Ban и как он работает\u003C/h2>\n\n\n\n\u003Cp>Fail2Ban – это служба-демон, написанная на Python, которая работает по простой схеме:\u003C/p>\n\n\n\n\u003Col>\u003Cli>\u003Cstrong>Читает логи\u003C/strong> сервисов (например, \u003Ccode>/var/log/auth.log\u003C/code> или журнал systemd для SSH).\u003C/li>\u003Cli>\u003Cstrong>Сравнивает строки \u003C/strong>с шаблонами – регулярными выражениями (фильтрами), которые описывают неудачные попытки входа.\u003C/li>\u003Cli>\u003Cstrong>Считает совпадения \u003C/strong>для каждого IP за заданный промежуток времени.\u003C/li>\u003Cli>Если число попыток превысило лимит – \u003Cstrong>выполняет действие\u003C/strong> (action), как правило, добавляет правило блокировки в файрвол.\u003C/li>\u003Cli>По истечении времени бана IP \u003Cstrong>автоматически разблокируется\u003C/strong>.\u003C/li>\u003C/ol>\n\n\n\n\u003Cp>Три ключевых понятия Fail2Ban:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Cstrong>Jail (тюрьма)\u003C/strong> – связка «лог + фильтр + действие + пороги» для конкретного сервиса. Например, jail \u003Ccode>sshd\u003C/code> защищает SSH.\u003C/li>\u003Cli>\u003Cstrong>Filter (фильтр)\u003C/strong> – набор регулярных выражений (\u003Ccode>failregex\u003C/code>), по которым находятся подозрительные строки в логе.\u003C/li>\u003Cli>\u003Cstrong>Action (действие)\u003C/strong> – что делать с нарушителем: заблокировать в iptables, отправить письмо администратору и т. д.\u003C/li>\u003C/ul>\n\n\n\n\u003Ch2 id=\"ustanovka-fail2ban\">Установка Fail2Ban\u003C/h2>\n\n\n\n\u003Cp>\u003Cstrong>Debian / Ubuntu\u003C/strong>\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>apt update\napt install fail2ban -y\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>\u003Cstrong>CentOS / RHEL / AlmaLinux / Rocky Linux\u003C/strong>\u003C/p>\n\n\n\n\u003Cp>Пакет находится в репозитории EPEL:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>dnf install epel-release -y\ndnf install fail2ban -y\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>После установки включите автозапуск и стартуйте службу:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>systemctl enable --now fail2ban\nsystemctl status fail2ban\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Проверить работу можно командой:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>fail2ban-client ping\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В ответ должно прийти \u003Ccode>Server replied: pong\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Конфигурация Fail2Ban хранится в каталоге \u003Ccode>/etc/fail2ban/\u003C/code>. Основные файлы:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>jail.conf\u003C/code> – конфигурация по умолчанию. \u003Cstrong>Редактировать ее не нужно\u003C/strong>: при обновлении пакета файл перезапишется, а ваши изменения пропадут.\u003C/li>\u003Cli>\u003Ccode>jail.local\u003C/code> – ваш собственный файл с настройками. Параметры из него переопределяют значения из \u003Ccode>jail.conf\u003C/code>.\u003C/li>\u003Cli>\u003Ccode>jail.d/*.conf\u003C/code> – отдельные файлы для конфигурации конкретных jail (альтернатива \u003Ccode>jail.local\u003C/code>).\u003C/li>\u003Cli>\u003Ccode>filter.d/\u003C/code> – фильтры (регулярные выражения).\u003C/li>\u003Cli>\u003Ccode>action.d/\u003C/code> – действия (способы блокировки и уведомлений).\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Всю тонкую настройку рекомендуется выполнять в \u003Ccode>jail.local\u003C/code>. Создать его можно следующим образом:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>nano /etc/fail2ban/jail.local\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"bazovye-parametry-v-sekcii-default\">Базовые параметры в секции [DEFAULT]\u003C/h2>\n\n\n\n\u003Cp>Секция \u003Ccode>[DEFAULT]\u003C/code> задает значения для всех jail. Их можно переопределять внутри каждой отдельной «тюрьмы». Пример \u003Ccode>jail.local\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[DEFAULT]\n# IP-адреса и подсети, которые никогда не блокируются\nignoreip = 127.0.0.1/8 ::1 203.0.113.10\n\n# Время блокировки (в секундах). 1h = 1 час\nbantime = 1h\n\n# Окно наблюдения: за какой период считаем попытки\nfindtime = 10m\n\n# Сколько неудачных попыток разрешено до блокировки\nmaxretry = 5\n\n# Способ блокировки\nbanaction = iptables-multiport\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Разберем каждый параметр.\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>ignoreip\u003C/code> – белый список\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Список IP-адресов и подсетей, которые Fail2Ban не будет блокировать никогда. Рекомендуется добавить сюда свой постоянный IP (например, рабочий или домашний с фиксированным адресом), чтобы случайно не заблокировать самого себя. Поддерживаются отдельные адреса, CIDR-подсети и доменные имена.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16 203.0.113.10\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>bantime\u003C/code> – длительность блокировки\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Время бана в секундах. Можно использовать суффиксы: \u003Ccode>m\u003C/code> (минуты), \u003Ccode>h\u003C/code> (часы), \u003Ccode>d\u003C/code> (дни), \u003Ccode>w\u003C/code> (недели).\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>bantime = 600\u003C/code> – 10 минут;\u003C/li>\u003Cli>\u003Ccode>bantime = 1d\u003C/code> – сутки;\u003C/li>\u003Cli>\u003Ccode>bantime = -1\u003C/code> – бессрочная блокировка.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Слишком короткий бан легко обходится ботами, слишком длинный – рискует надолго заблокировать легитимного пользователя, допустившего ошибку в пароле. Ниже, в разделе про прогрессивные баны, мы покажем, как автоматически увеличивать срок за повторные нарушения.&nbsp;\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>findtime\u003C/code> – окно подсчета попыток\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Промежуток времени, за который считаются неудачные попытки. Если за \u003Ccode>findtime\u003C/code> с одного IP накопилось \u003Ccode>maxretry\u003C/code> ошибок, IP блокируется. Пример: при \u003Ccode>findtime = 10m\u003C/code> и \u003Ccode>maxretry = 5\u003C/code> блокировка наступит после 5 неудачных входов в течение 10 минут.\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>maxretry\u003C/code> – порог срабатывания\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Допустимое число неудачных попыток до блокировки. Чем меньше значение, тем строже защита, но тем выше риск заблокировать пользователя, который просто ошибся при вводе пароля.&nbsp;\u003C/p>\n\n\n\n\u003Ch2 id=\"otkuda-fail2ban-chitaet-logi-backend-i-logpath\">Откуда Fail2Ban читает логи: backend и logpath\u003C/h2>\n\n\n\n\u003Cp>У Fail2Ban есть два принципиально разных способа получать записи логов, и они не комбинируются в рамках одного jail:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>backend = systemd\u003C/code> – чтение из журнала \u003Ccode>systemd\u003C/code> (\u003Ccode>journald\u003C/code>). Параметр \u003Ccode>logpath\u003C/code> при этом игнорируется; источник при необходимости уточняется через \u003Ccode>journalmatch\u003C/code>. Это рекомендуемый вариант получения записи логов Fail2Ban для современных Ubuntu (22.04/24.04) и Debian 12+, где многие сервисы (включая SSH) больше не пишут в текстовые файлы.\u003C/li>\u003Cli>\u003Ccode>backend = auto\u003C/code> / \u003Ccode>polling\u003C/code> / \u003Ccode>pyinotify\u003C/code> – отслеживание текстовых лог-файлов. Здесь обязательно нужен корректный \u003Ccode>logpath\u003C/code>.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Из-за этого важно не задавать глобально \u003Ccode>backend = systemd\u003C/code> в \u003Ccode>[DEFAULT]\u003C/code>, а потом во всех jail указывать \u003Ccode>logpath\u003C/code> на файлы – для journald-бэкенда эти пути просто не работают. Правильный подход – выбирать backend для каждого сервиса по тому, куда он реально пишет логи:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>SSH в последней Ubuntu/Debian – \u003Ccode>backend = systemd\u003C/code> (без \u003Ccode>logpath\u003C/code>);\u003C/li>\u003Cli>Nginx, Apache, FTP и большинство веб-приложений – они по умолчанию ведут собственные текстовые логи, поэтому \u003Ccode>backend = auto\u003C/code> + \u003Ccode>logpath\u003C/code>.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Поэтому в примерах ниже \u003Ccode>backend\u003C/code> указан в каждой «тюрьме» отдельно, а в \u003Ccode>[DEFAULT]\u003C/code> мы его жестко не фиксируем.\u003C/p>\n\n\n\n\u003Ch2 id=\"tonkaya-nastroyka-zashchity-ssh-s-fail2ban\">Тонкая настройка защиты SSH с Fail2Ban\u003C/h2>\n\n\n\n\u003Cp>SSH – главная цель брутфорс-программы. Вариант настройки зависит от того, куда система пишет SSH-логи.\u003C/p>\n\n\n\n\u003Ch3 id=\"sovremennye-ubuntu-24-04-debian-12-logi-v-journald\">Современные Ubuntu 24.04 / Debian 12 (логи в journald)\u003C/h3>\n\n\n\n\u003Cp>На Ubuntu 24.04 в облачных и минимальных образах \u003Ccode>rsyslog\u003C/code> по умолчанию не установлен – файла \u003Ccode>/var/log/auth.log\u003C/code> попросту нет, всё попадает в \u003Ccode>journald\u003C/code>. В этом случае нужен systemd-бэкенд без \u003Ccode>logpath\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[sshd]\nenabled = true\nport = 22\nfilter = sshd\nbackend = systemd\nmaxretry = 3\nfindtime = 10m\nbantime = 2h\n# По умолчанию фильтр sshd уже содержит подходящий journalmatch.\n# Уточнить источник можно вручную (на Ubuntu/Debian unit называется ssh.service):\n# journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"sistemy-s-tekstovymi-logami-centos-rhel-libo-ustanovlennyy-rsyslog\">Системы с текстовыми логами (CentOS/RHEL либо установленный rsyslog)\u003C/h3>\n\n\n\n\u003Cp>Если сервис пишет в файл, используйте файловый бэкенд и укажите путь к логу:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[sshd]\nenabled = true\nport = 22\nfilter = sshd\nbackend = auto\nlogpath = /var/log/auth.log   # на CentOS/RHEL: /var/log/secure\nmaxretry = 3\nfindtime = 10m\nbantime = 2h\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если был изменен стандартный SSH-порт, обязательно укажите актуальный в параметре \u003Ccode>port\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>После правок перезапустите службу и проверьте статус jail:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>systemctl restart fail2ban\nfail2ban-client status sshd\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В выводе вы увидите число найденных и заблокированных IP, а также список текущих банов.\u003C/p>\n\n\n\n\u003Ch2 id=\"zashchita-drugih-servisov\">Защита других сервисов\u003C/h2>\n\n\n\n\u003Cp>Fail2Ban поставляется с готовыми фильтрами для популярных сервисов. Достаточно включить нужный jail в \u003Ccode>jail.local\u003C/code>. Перечисленные ниже сервисы по умолчанию ведут собственные текстовые логи, поэтому для них используется файловый бэкенд и \u003Ccode>logpath\u003C/code>.\u003C/p>\n\n\n\n\u003Ch3 id=\"veb-server-nginx\">Веб-сервер Nginx\u003C/h3>\n\n\n\n\u003Cp>Блокировка перебора HTTP-авторизации:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[nginx-http-auth]\nenabled = true\nfilter = nginx-http-auth\nport = http,https\nbackend = auto\nlogpath = /var/log/nginx/error.log\nmaxretry = 5\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Защита от ботов, перебирающих несуществующие страницы и скрипты:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[nginx-botsearch]\nenabled = true\nfilter = nginx-botsearch\nport = http,https\nbackend = auto\nlogpath = /var/log/nginx/access.log\nmaxretry = 10\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"veb-server-apache\">Веб-сервер Apache\u003C/h3>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[apache-auth]\nenabled = true\nfilter = apache-auth\nport = http,https\nbackend = auto\nlogpath = /var/log/apache2/error.log\nmaxretry = 5\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"ftp-vsftpd-proftpd\">FTP (vsftpd / proftpd)\u003C/h3>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[vsftpd]\nenabled = true\nfilter = vsftpd\nport = ftp,ftp-data,ftps,ftps-data\nbackend = auto\nlogpath = /var/log/vsftpd.log\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>После включения любого jail проверяйте его статус и наличие нужного лог-файла. Fail2Ban не запустит «тюрьму», если путь к логу указан неверно.\u003C/p>\n\n\n\n\u003Ch2 id=\"sobstvennyy-filtr-pishem-i-proveryaem-failregex\">Собственный фильтр: пишем и проверяем failregex\u003C/h2>\n\n\n\n\u003Cp>Если сервис нестандартный (например, самописное приложение или панель), готового фильтра может не быть – придется написать свой.&nbsp;\u003C/p>\n\n\n\n\u003Cp>Фильтр – это файл в каталоге \u003Ccode>filter.d/\u003C/code> с регулярными выражениями. Ключевой элемент – токен \u003Ccode>&lt;HOST&gt;\u003C/code>, которым обозначается место, где в строке лога стоит IP-адрес нарушителя.\u003C/p>\n\n\n\n\u003Cp>Допустим, приложение пишет в \u003Ccode>/var/log/myapp/app.log\u003C/code> строки вида:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>2026-06-28 12:00:01 WARNING Failed login for user admin from 203.0.113.77\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Создаем фильтр \u003Ccode>/etc/fail2ban/filter.d/myapp.conf\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[Definition]\nfailregex = ^.*Failed login for user .* from &lt;HOST&gt;\\s*$\nignoreregex =\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>\u003Ccode>failregex\u003C/code> ловит подозрительные строки, \u003Ccode>ignoreregex\u003C/code> – исключения, которые нужно игнорировать даже при совпадении с \u003Ccode>failregex\u003C/code>.\u003C/p>\n\n\n\n\u003Ch3 id=\"proverka-filtra-utilitoy-fail2ban-regex\">Проверка фильтра утилитой fail2ban-regex\u003C/h3>\n\n\n\n\u003Cp>Перед тем как включать jail рекомендуется проверить фильтр на реальном логе – это избавляет от нерабочих или слишком «жадных» правил:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>bashfail2ban-regex /var/log/myapp/app.log /etc/fail2ban/filter.d/myapp.conf\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Утилита покажет, сколько строк совпало (\u003Ccode>matched\u003C/code>) и сколько проигнорировано (\u003Ccode>missed\u003C/code>). Можно проверить и одну конкретную строку, не трогая файл:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>bashfail2ban-regex \"2026-06-28 12:00:01 Failed login for user admin from 203.0.113.77\" \\\n  \"^.*Failed login for user .* from &lt;HOST&gt;\\s*$\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если совпадений нет, обычно проблема в формате даты – добавьте в фильтр свой \u003Ccode>datepattern\u003C/code> или используйте флаг \u003Ccode>--print-all-matched\u003C/code> для отладки.\u003C/p>\n\n\n\n\u003Cp>Когда фильтр отлажен, подключаем его в \u003Ccode>jail.local\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[myapp]\nenabled = true\nfilter = myapp\nbackend = auto\nlogpath = /var/log/myapp/app.log\nmaxretry = 5\nfindtime = 10m\nbantime = 1h\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"email-uvedomleniya-o-banah\">Email-уведомления о банах\u003C/h2>\n\n\n\n\u003Cp>По умолчанию Fail2Ban не отправляет писем о блокировках IP. Чтобы получать уведомления, нужен настроенный MTA на сервере (например, \u003Ccode>postfix\u003C/code> или \u003Ccode>sendmail\u003C/code>) и несколько параметров в \u003Ccode>[DEFAULT]\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[DEFAULT]\n# Кому отправлять письма\ndestemail = admin@example.com\n\n# От кого\nsender = fail2ban@example.com\n\n# Программа отправки почты\nmta = sendmail\n\n# Действие: бан + письмо\naction = %(action_mw)s\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Доступные варианты действий с уведомлением:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>%(action_)s\u003C/code> – только бан (по умолчанию);\u003C/li>\u003Cli>\u003Ccode>%(action_mw)s\u003C/code> – бан + письмо с краткой информацией и результатом \u003Ccode>whois\u003C/code> по IP;\u003C/li>\u003Cli>\u003Ccode>%(action_mwl)s\u003C/code> – то же, что \u003Ccode>action_mw\u003C/code>, плюс относящиеся к инциденту строки из лога.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Уведомления можно включить и точечно – указав \u003Ccode>action\u003C/code> внутри конкретного jail, а не глобально.\u003C/p>\n\n\n\n\u003Ch2 id=\"progressivnye-bany-bantime-increment\">Прогрессивные баны (bantime.increment)\u003C/h2>\n\n\n\n\u003Cp>Это одна из тех настроек, которые делают защиту по-настоящему «тонкой». По умолчанию все нарушители получают одинаковый срок бана. С \u003Ccode>bantime.increment\u003C/code> срок автоматически растет при каждом повторном попадании одного и того же IP в баны:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[DEFAULT]\n# Включить прогрессивное увеличение времени бана\nbantime.increment = true\n\n# Базовый срок\nbantime = 1h\n\n# Множитель: каждый следующий бан длиннее предыдущего\nbantime.factor = 2\n\n# Потолок: дольше этого срока бан не вырастет\nbantime.maxtime = 1w\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>При таких настройках первый бан длится час, второй – дольше, и так далее, пока не упрется в \u003Ccode>bantime.maxtime\u003C/code> (неделя). Настойчивые боты в итоге блокируются надолго, а случайно ошибившийся пользователь отделывается коротким первым баном.\u003C/p>\n\n\n\n\u003Ch2 id=\"jail-recidive-lovim-recidivistov\">Jail recidive: ловим рецидивистов\u003C/h2>\n\n\n\n\u003Cp>\u003Ccode>recidive\u003C/code> – отдельная «тюрьма», которая следит не за логами сервисов, а за собственным логом Fail2Ban (\u003Ccode>/var/log/fail2ban.log\u003C/code>) и блокирует надолго тех, кто уже неоднократно попадал в баны других jail. Это второй рубеж: даже если бот после короткого бана возвращается снова и снова, \u003Ccode>recidive\u003C/code> отправит его в долгую блокировку.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>[recidive]\nenabled = true\nfilter = recidive\nlogpath = /var/log/fail2ban.log\nbanaction = iptables-allports\n# 5 банов за сутки -&gt; длительная блокировка\nfindtime = 1d\nbantime = 1w\nmaxretry = 5\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Для работы recidive Fail2Ban должен вести лог в файл – убедитесь, что в \u003Ccode>fail2ban.conf\u003C/code> (или \u003Ccode>fail2ban.local\u003C/code>) задан \u003Ccode>logtarget = /var/log/fail2ban.log\u003C/code>, а не только \u003Ccode>syslog/systemd\u003C/code>.\u003C/p>\n\n\n\n\u003Ch2 id=\"upravlenie-cherez-fail2ban-client\">Управление через fail2ban-client\u003C/h2>\n\n\n\n\u003Cp>Основные команды для повседневной работы:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode># Общий статус: список активных jail\nfail2ban-client status\n\n# Подробный статус конкретной тюрьмы\nfail2ban-client status sshd\n\n# Вручную заблокировать IP\nfail2ban-client set sshd banip 203.0.113.50\n\n# Разблокировать IP\nfail2ban-client set sshd unbanip 203.0.113.50\n\n# Перезагрузить конфигурацию без полной остановки\nfail2ban-client reload\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Если вы случайно заблокировали себя и потеряли доступ по SSH – войдите на сервер через терминал в панели управления Beget и выполните команду разблокировки своего IP.\u003C/p>\n\n\n\n\u003Ch2 id=\"faq\">FAQ\u003C/h2>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Можно ли установить Fail2Ban на виртуальном хостинге Beget?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Нет. Fail2Ban управляет правилами файрвола и требует прав root, которых на виртуальном хостинге нет. Используйте его на VPS или выделенном сервере. На виртуальном хостинге защита от перебора уже реализована платформой.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Как проверить, что Fail2Ban действительно блокирует атаки?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Выполните \u003Ccode>fail2ban-client status sshd\u003C/code> – в строке \u003Ccode>Banned IP list\u003C/code> будут видны заблокированные адреса. Также можно изучить лог \u003Ccode>/var/log/fail2ban.log\u003C/code>.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Что делать, если я сам попал в бан?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Зайдите на сервер через терминал в панели управления Beget (минуя SSH) и выполните \u003Ccode>fail2ban-client set sshd unbanip ВАШ_IP\u003C/code>, после чего добавьте свой адрес в \u003Ccode>ignoreip\u003C/code>.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Заменяет ли Fail2Ban файрвол?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Нет. Fail2Ban работает поверх файрвола (\u003Ccode>iptables\u003C/code>/\u003Ccode>nftables\u003C/code>) и лишь динамически добавляет правила блокировки. Базовую настройку файрвола нужно выполнять отдельно.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Чем брутфорс отличается от DDoS, спасет ли Fail2Ban от DDoS?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Брутфорс-атака – это перебор паролей с относительно небольшого числа адресов, с ним Fail2Ban справляется хорошо. От массированных распределенных DDoS-атак он малоэффективен – для этого нужны специализированные средства защиты.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cp>Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел «\u003Ca href=\"https://cp.beget.com/support?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=fail2ban&amp;utm_content=cp_support\">Помощь и поддержка\u003C/a>»), а если вы захотите обсудить наши продукты с коллегами по цеху и сотрудниками Beget – ждем вас в нашем \u003Ca href=\"https://t.me/beget_chat\">сообществе\u003C/a> в Telegram.\u003C/p>\n",5,"2026-07-03T17:44:51+03:00",{"count":15,"liked":16},0,false,{"route":18,"title":20,"tags":21,"breadcrumbs":54,"uuid":55,"parent_uuid":56,"default_page_path":26,"seo_metadata":57},{"language":6,"path":19},"/kb/how-to/vps","VPS",[22,27,31,35,39,43,47,51],{"id":23,"title":24,"seo_metadata":25},"apache","Apache",{"title":26,"description":26,"header":26,"keywords":26},"",{"id":28,"title":29,"seo_metadata":30},"lets-encrypt","Let's Encrypt",{"title":26,"description":26,"header":26,"keywords":26},{"id":32,"title":33,"seo_metadata":34},"nginx","Nginx",{"title":26,"description":26,"header":26,"keywords":26},{"id":36,"title":37,"seo_metadata":38},"perenos-sajta","Перенос сайта",{"title":26,"description":26,"header":26,"keywords":26},{"id":40,"title":41,"seo_metadata":42},"ssl","SSL",{"title":26,"description":26,"header":26,"keywords":26},{"id":44,"title":45,"seo_metadata":46},"terminal","Терминал",{"title":26,"description":26,"header":26,"keywords":26},{"id":48,"title":49,"seo_metadata":50},"vestacp","VestaCP",{"title":26,"description":26,"header":26,"keywords":26},{"id":52,"title":20,"seo_metadata":53},"vps",{"title":26,"description":26,"header":26,"keywords":26},[],"957abe7d-4a90-1475-bfb0-6439507ed391","fa9a1354-631a-4206-df34-291f0db8f42a",{"title":58,"description":59,"header":60,"keywords":61},"VPS. Полезные статьи – Beget","Полезные статьи о VPS на сайте Beget","VPS. Полезные статьи","vps, вопрос ответ",{"src":26,"text":26},{"title":64,"description":65,"keywords":66},"Fail2Ban – установка и настройка защиты от брутфорса","Fail2Ban – установка и настройка инструмента для защиты от угроз брутфорса на виртуальный сервер VPS | Читайте статью подробнее на сайте","утилита для защиты сервера от брутфорс-атак, безопасность nginx, подбор пароля от SSH",{"faq":68,"how_to":69,"product":69},[],null,{},[72,76,79,82,85,88,92,95,98,101,104,107,110,113,116,119,122,125],{"level":73,"name":74,"anchor":75},1,"Что такое Fail2Ban и как он работает","chto-takoe-fail2ban-i-kak-on-rabotaet",{"level":73,"name":77,"anchor":78},"Установка Fail2Ban","ustanovka-fail2ban",{"level":73,"name":80,"anchor":81},"Базовые параметры в секции [DEFAULT]","bazovye-parametry-v-sekcii-default",{"level":73,"name":83,"anchor":84},"Откуда Fail2Ban читает логи: backend и logpath","otkuda-fail2ban-chitaet-logi-backend-i-logpath",{"level":73,"name":86,"anchor":87},"Тонкая настройка защиты SSH с Fail2Ban","tonkaya-nastroyka-zashchity-ssh-s-fail2ban",{"level":89,"name":90,"anchor":91},2,"Современные Ubuntu 24.04 / Debian 12 (логи в journald)","sovremennye-ubuntu-24-04-debian-12-logi-v-journald",{"level":89,"name":93,"anchor":94},"Системы с текстовыми логами (CentOS/RHEL либо установленный rsyslog)","sistemy-s-tekstovymi-logami-centos-rhel-libo-ustanovlennyy-rsyslog",{"level":73,"name":96,"anchor":97},"Защита других сервисов","zashchita-drugih-servisov",{"level":89,"name":99,"anchor":100},"Веб-сервер Nginx","veb-server-nginx",{"level":89,"name":102,"anchor":103},"Веб-сервер Apache","veb-server-apache",{"level":89,"name":105,"anchor":106},"FTP (vsftpd / proftpd)","ftp-vsftpd-proftpd",{"level":73,"name":108,"anchor":109},"Собственный фильтр: пишем и проверяем failregex","sobstvennyy-filtr-pishem-i-proveryaem-failregex",{"level":89,"name":111,"anchor":112},"Проверка фильтра утилитой fail2ban-regex","proverka-filtra-utilitoy-fail2ban-regex",{"level":73,"name":114,"anchor":115},"Email-уведомления о банах","email-uvedomleniya-o-banah",{"level":73,"name":117,"anchor":118},"Прогрессивные баны (bantime.increment)","progressivnye-bany-bantime-increment",{"level":73,"name":120,"anchor":121},"Jail recidive: ловим рецидивистов","jail-recidive-lovim-recidivistov",{"level":73,"name":123,"anchor":124},"Управление через fail2ban-client","upravlenie-cherez-fail2ban-client",{"level":73,"name":126,"anchor":127},"FAQ","faq",[],[130,134],{"route":131,"title":133},{"language":6,"path":132},"/kb/how-to","Полезные статьи",{"route":135,"title":20},{"language":6,"path":19},[],[],[139,148,157],{"route":140,"uuid":142,"title":143,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":69,"category":69,"hero_image":69,"seo_metadata":69,"schema_org_metadata":69,"open_graph_metadata":69,"sections":144,"tags":145,"breadcrumbs":146,"images":147},{"language":6,"path":141},"/kb/how-to/vps/mysql-with-private-network","81f7dbba-3202-be25-bd47-c1673a146bf3","Использование MySQL на отдельном сервере с приватной сетью VPS",[],[],[],[],{"route":149,"uuid":151,"title":152,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":69,"category":69,"hero_image":69,"seo_metadata":69,"schema_org_metadata":69,"open_graph_metadata":69,"sections":153,"tags":154,"breadcrumbs":155,"images":156},{"language":6,"path":150},"/kb/how-to/vps/rootless-kontejnery-v-podman-kak-systemd","07a5277f-c3f8-b1df-0d7f-4bddb2e97e46","Запуск rootless-контейнеров в Podman как systemd-юнит",[],[],[],[],{"route":158,"uuid":160,"title":161,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":69,"category":69,"hero_image":69,"seo_metadata":69,"schema_org_metadata":69,"open_graph_metadata":69,"sections":162,"tags":163,"breadcrumbs":164,"images":165},{"language":6,"path":159},"/kb/how-to/vps/sozdaniya-vps-nastrojka-i-monitoring","c4f101eb-e628-58cb-4c30-5294849093da","Первые шаги после создания VPS: настройка, защита, мониторинг",[],[],[],[],"popularity-desc"]