Установка Fail2ban на Ubuntu 24.04 от ботов
Узнайте, как настроить Fail2ban в Ubuntu 24.04 через apt install. Разбор вывода fail2ban-client status sshd и решение проблемы, когда Total failed равно 0.
Что на самом деле делает Fail2ban
Fail2ban — это демон для чтения логов. Он отслеживает сообщения аутентификации SSH. Если с одного адреса за короткий промежуток времени поступает несколько неудачных попыток, демон выполняет команду firewall, которая блокирует этот адрес на некоторое время. В этом заключается основная идея. Настройка занимает около тридцати строк в одном файле. В Ubuntu 24.04 установка выполняется одной командой apt, которая обеспечивает защиту еще до внесения каких-либо изменений.
Четко понимайте возможности и ограничения инструмента. Fail2ban не выполняет аутентификацию, не шифрует данные и не остановит одну целенаправленную попытку входа — он блокирует только повторяющиеся попытки с одного и того же источника. Это фильтр шума и ограничитель частоты запросов, а не замок. Его задача — прекратить бесполезную трату ресурсов CPU, пропускной способности сети и места в логах из-за постоянного сканирования порта 22, а также замедлить злоумышленника, который вынужден использовать по одному адресу за раз.
Что не заменяет Fail2ban
Fail2ban является третьим уровнем защиты, а не первым. Если ваш сервер по-прежнему принимает пароли для SSH, ботнет, распределенный по тысячам адресов, сможет продолжать перебор. Это происходит потому, что каждый отдельный адрес не достигает порога блокировки и не активирует её. Настоящая защита от таких атак — это аутентификация только по ключам. Она делает перебор паролей невозможным, независимо от количества попыток. Использование Fail2ban вместе с аутентификацией по ключам решает две задачи: очистка логов от шума brute-force атак и ранняя блокировка сканеров, чтобы они перестали нагружать порт. Рассматривайте это как эшелонированную оборону. Fail2ban работает после аутентификации по ключам и после firewall, но никогда не вместо них.
Предварительные требования и особенности Ubuntu 24.04
Вам потребуется VPS под управлением Ubuntu 24.04 с правами root или sudo и настроенным SSH — желательно с аутентификацией по ключам. Fail2ban потребляет мало ресурсов: всего несколько десятков мегабайт RAM, дополнительная настройка лимитов не требуется.
Ниже приведено утверждение, в котором ошибаются все старые руководства. Долгое время стандартным советом было: «установите Fail2ban, затем добавьте backend = systemd, потому что Ubuntu перестала записывать /var/log/auth.log». Этот совет описывает реальное изменение — современные образы серверов и облачных платформ поставляются без rsyslog, поэтому логи SSH пишутся только в systemd journal, а текстовый файл отсутствует. Однако в Ubuntu 24.04 пакет Fail2ban уже учитывает это изменение. Пакет устанавливает /etc/fail2ban/jail.d/defaults-debian.conf, и именно этот файл, а не стандартные настройки upstream, используется на вашем сервере:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueПрочитайте это внимательно, так как это дает ответы на два вопроса до начала работы. backend = systemd означает, что SSH jail читает журнал journal, поэтому отсутствие auth.log не имеет значения. banaction = nftables означает, что блокировки применяются через nftables — именно этот файрвол использует Ubuntu 24.04 вместо устаревшего iptables. [sshd] enabled = true означает, что jail включен сразу после первой загрузки. Итог: стандартный apt install fail2ban на Ubuntu 24.04 блокирует SSH brute-force «из коробки». Основная часть вашей работы заключается в проверке этой функции, настройке политик и обеспечении возможности предотвратить случайную блокировку собственного доступа.
Старая ловушка auth.log все еще актуальна в трех ситуациях, которые важно распознать: вы установили Fail2ban с помощью pip вместо apt, поэтому defaults-debian.conf отсутствует; вы находитесь внутри непривилегированного контейнера, где нет доступа к systemd journal; или вы следовали старому руководству и вставили backend = auto в свой собственный jail.local, переопределив рабочую настройку по умолчанию. В разделе «Режимы сбоев» показано, как выглядит каждый из этих случаев.
Шаг 1: Установка и проверка работы блокировки
sudo apt update
sudo apt install -y fail2banВ Ubuntu 24.04 предустановлен Fail2ban 1.0.2. Пакет включает python3-systemd в качестве обязательной зависимости, поэтому backend для работы с journal содержит все необходимые компоненты. Служба активируется и запускается автоматически:
sudo systemctl status fail2banВам требуется active (running). Проверьте jail, который уже работает:
sudo fail2ban-client status sshdНа публильном VPS, доступном в сети даже несколько минут, часто уже видны зафиксированные ошибки и заблокированные адреса — интернет-сканеры непрерывно сканируют порт 22. Это подтверждает работоспособность стандартной конфигурации. На данном этапе вы вносите правки, а не создаете систему с нуля.
Шаг 2: Редактируйте jail.local, а не jail.conf
Fail2ban хранит стандартные настройки в /etc/fail2ban/jail.conf. Не редактируйте этот файл. Любой apt upgrade пакета может заменить его, и ваши изменения будут потеряны без предупреждения. Fail2ban читает файлы в строго определенном порядке: сначала jail.conf, затем все файлы в jail.d/, затем jail.local; побеждает последнее значение. Файл .local принадлежит вам, и обновления пакетов никогда не изменяют его. Это же правило применяется к фильтрам, где файл *.local переопределяет стандартный filter.d/*.conf.
Создайте небольшой jail.local, который переопределяет только необходимые вам параметры. Оставьте файлы jail.conf и стандартный jail.d/defaults-debian.conf без изменений для использования в качестве справочных материалов.
Шаг 3: Создайте файл /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.localВставьте этот текст, заменив адрес в строке ignoreip на ваш публичный IP:
[DEFAULT]
# Ubuntu 24.04 already sets these two in jail.d/defaults-debian.conf.
# Pinning them here documents the dependency and survives if that
# file is ever removed or changed by an upgrade.
backend = systemd
banaction = nftables
# Ban for one hour ...
bantime = 1h
# ... if an address fails ...
maxretry = 5
# ... 5 times within 10 minutes.
findtime = 10m
# Never ban these. PUT YOUR OWN IP HERE.
ignoreip = 127.0.0.1/8 ::1 10.0.0.24
# Longer bans for repeat offenders: 1h, 2h, 4h ... up to a week.
bantime.increment = true
bantime.maxtime = 1w
[sshd]
enabled = trueКаждая строка имеет значение:
bantime,findtime,maxretry— это параметры политики. Значение по умолчаниюbantimeсоставляет всего десять минут; один час — более разумный порог. Пять неудачных попыток с одного адреса в течение десяти минут приводят к блокировке. Реальные пользователи могут ошибиться в пароле один или два раза; пять ошибок за десять минут — это признак работы скрипта.ignoreip— это ваша страховка. Укажите здесь публичный адрес, с которого вы подключаетесь, чтобы Fail2ban не заблокировал ваш собственный доступ к серверу. Если у вашего домашнего соединения динамический IP, это повод использовать VPN (описано в конце), но это не повод пропускать эту строку.bantime.increment = trueувеличивает длительность каждой последующей блокировки — один час, затем два, затем четыре — вплоть доbantime.maxtime. Повторяющиеся попытки входа приводят к прогрессивному увеличению времени блокировки адреса.
Узнайте адрес для добавления в белый список на машине, с которой вы подключаетесь по SSH, а не на самом сервере:
curl -s ifconfig.meВы можете сгенерировать конфигурацию jail.local под ваши порты и политику блокировок здесь, а затем вставить её в файл:
Шаг 4: Перезапуск и проверка чтения журнала
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd-t сначала выполняет проверку конфигурации. Ошибка в jail.local будет обнаружена сразу, что предотвращает остановку сервиса. Статус исправной jail выглядит следующим образом:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 14
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 10.0.0.66Показатель, подтверждающий, что Fail2ban действительно читает ваши логины — это Total failed. Если значение больше нуля или оно увеличивается при намеренном вводе неверного пароля с другого устройства, значит, журнал читается и настройка завершена. Если значение остается равным 0 при любых попытках входа (и вы уверены, что не тестируете с адреса ignoreip), перейдите к разделу с возможными ошибками ниже.
Обратите внимание, что в строке Journal matches по-прежнему указан sshd.service. В Ubuntu юнит SSH называется ssh.service, но стандартный фильтр также учитывает _COMM=sshd. В OpenSSH версии 24.04 ошибки логируются процессом с именем sshd, поэтому сопоставление работает. Это имеет значение только при использовании более новой версии OpenSSH (9.8 или выше, где процесс на каждое соединение — sshd-session); соответствующие сценарии ошибок описаны ниже.
Step 5: Watch a real ban land, or force one to test
Real bans arrive on their own within minutes on any public VPS. To watch one, tail the log:
sudo tail -f /var/log/fail2ban.logA ban looks like this:
2026-07-15 10:31:40,502 fail2ban.filter [812]: INFO [sshd] Found 10.0.0.66 - 2026-07-15 10:31:40
2026-07-15 10:31:44,118 fail2ban.actions [812]: NOTICE [sshd] Ban 10.0.0.66To prove the machinery end to end without waiting, ban a documentation address by hand — never your own:
sudo fail2ban-client set sshd banip 10.0.0.66It prints 1, and the address appears under Banned IP list in fail2ban-client status sshd. Now confirm the block really exists in the firewall. On Ubuntu 24.04 that is nftables, not iptables:
sudo nft list table inet f2b-tableYou will see a set named addr-set-sshd holding 10.0.0.66, and a chain f2b-chain that rejects any source in that set. If fail2ban-client says an address is banned but nothing appears in nft list, your ban action does not match your firewall — see the nftables/iptables note in the failure modes.
Step 6: Unban yourself, and recover if you are locked out
If you banned an address you should not have — your own — remove it:
sudo fail2ban-client set sshd unbanip 10.0.0.66It returns 1 on success. To clear every ban across every jail:
sudo fail2ban-client unban --allDo not count on an already-open SSH session to save you: the nftables ban rejects every packet from the banned address to port 22 — established connections included — so an existing session freezes the moment the ban lands. If you ban yourself and have no ignoreip entry, you are locked out until the ban expires — recover through your provider's web console (VNC or serial), which does not go through SSH, and either wait out bantime or run the unban command there.
Шаг 7: Обеспечение постоянства и эскалации блокировок
Fail2ban хранит активные блокировки в базе данных SQLite по пути /var/lib/fail2ban/fail2ban.sqlite3. Это позволяет сохранять их после перезапуска службы или перезагрузки системы; данные не будут потеряны. Добавленные вами строки bantime.increment превращают каждое повторное нарушение в нарастающую проблему для нарушителя: время блокировки увеличивается примерно вдвое, от одного часа до одной недели.
Для реализации общесистемной политики «трех предупреждений» Fail2ban поставляется с jail recidive. Этот jail отслеживает собственный /var/log/fail2ban.log и применяет длительные блокировки к любому адресу, который неоднократно блокировался в различных jail. Поскольку ваш [DEFAULT] теперь использует backend systemd, привяжите этот jail обратно к лог-файлу, для чтения которого он предназначен:
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5Использование backend = auto с явным указанием logpath заставляет recidive читать обычный fail2ban.log. Именно в нем появляются строки Ban, которые необходимо подсчитывать. Настройка systemd, установленная вами глобально, направит поиск в journal, где эти строки отсутствуют.
Шаг 8: Используйте только SSH-ключи и, что еще лучше, VPN
Fail2ban эффективен только при использовании аутентификации по ключам. Создайте конфигурационный файл в директории /etc/ssh/sshd_config.d/ — например, /etc/ssh/sshd_config.d/00-hardening.conf — и установите:
PasswordAuthentication no
KbdInteractiveAuthentication noЗатем выполните sudo systemctl restart ssh. При отключенной аутентификации по паролю атаки методом перебора (brute force) становятся невозможными. В этом случае Fail2ban нужен только для уменьшения объема логов и раннего обнаружения сканеров. Еще более надежный вариант — полностью закрыть SSH от публичного интернета: разместите SSH за собственным VPN WireGuard и настройте firewall так, чтобы порт 22 был доступен только через туннель. Невозможно перебирать пароли на порту, который недоступен извне; тогда Fail2ban станет дополнительным уровнем защиты, а не основным рубежом обороны.
Fail2ban предназначен не только для SSH. Любой сервис, который записывает неудачные попытки входа, можно защитить с помощью jail — это может быть почтовый сервер, сайт на nginx или менеджер паролей Vaultwarden, веб-интерфейс которого не стоит оставлять открытым для атак методом подстановки учетных данных (credential stuffing). Как только веб-приложение будет размещено за сайтом nginx с сертификатом Let's Encrypt, настройте фильтр Fail2ban на его access log так же, как настроен SSH jail на journal.
Режимы сбоев и соответствующие сообщения об ошибках
"Have not found any log file for sshd jail", и Fail2ban не запускается. Это старая проблема auth.log. В Ubuntu 24.04 она возникает только если стандартные настройки пакета были изменены: при установке pip без defaults-debian.conf, в контейнере без journal или из-за ошибочного backend = auto, добавленного в jail.local. При использовании файлового бэкенда без /var/log/auth.log jail для sshd не может найти лог, и весь демон завершает работу. fail2ban.log выводит:
ERROR Failed during configuration: Have not found any log file for sshd jailТак как эта ошибка является критической, служба не запускается, и fail2ban-client status сообщает о последующем симптоме:
ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?Строка "socket path" не означает, что Fail2ban поврежден. Это означает, что он не запустился, так как один из jail не смог найти свой лог. Настройка backend = systemd в [DEFAULT] (которую пакет Ubuntu уже выполняет за вас) исправляет оба сообщения одновременно.
Jail активен, но Total failed не меняется. Демон запущен и читает journal, но реальные сбои накапливаются в journalctl -u ssh, в то время как счетчик замер на 0. Сначала исключите очевидное: вы проводите тесты с адреса, указанного в ignoreip, поэтому ваши собственные сбои игнорируются по умолчанию. Если дело не в этом, вы используете сборку OpenSSH, где рабочий процесс на каждое соединение — это sshd-session (версии 9.8 и выше), чей journal _COMM является sshd-session, а не sshd, поэтому стандартное правило поиска его не находит. Расширьте область поиска в блоке [sshd]:
[sshd]
enabled = true
backend = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd + _COMM=sshd-sessionПерезапустите сервис, намеренно совершите неудачную попытку входа с адреса, не входящего в ignoreip, и убедитесь, что Total failed начал расти.
Вы забанили сами себя: Connection refused. Вы не включили свой адрес в ignoreip, совершили несколько неудачных попыток входа, и теперь:
ssh: connect to host 10.0.0.10 port 22: Connection refusedОтказ в доступе вместо скрытого тайм-аута — это стандартный вердикт reject для действия nftables, который сработал против вас. Исправьте это, как описано в Шаге 6: разблокируйте себя через сессию с другого, не заблокированного адреса или через консоль провайдера — сессия, уже открытая с заблокированного адреса, также зависнет. Затем добавьте свой адрес в ignoreip, чтобы это не повторилось.
Fail2ban сообщает, что адрес заблокирован, но соединение все еще устанавливается. Счетчик в status sshd растет, но адрес по-прежнему может подключиться к порту 22. Это несоответствие между действием по блокировке (ban-action) и настройками firewall. В Ubuntu 24.04 это почти всегда означает, что вы заменили рабочую настройку banaction = nftables на banaction = iptables-multiport из старого руководства на системе без уровня iptables. fail2ban.log показывает:
fail2ban.actions [812]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport'Удалите это переопределение и используйте стандартное действие nftables из пакета. Если вы полностью управляете firewall через ufw и хотите, чтобы блокировки отображались там, установите banaction = ufw в [DEFAULT]. Перезапустите сервис и проверьте наличие правила с помощью sudo nft list ruleset | grep f2b.
Fail2ban не запускается после редактирования jail.local. Опечатка — лишний заголовок или неверное значение времени — приводит к отказу службы в запуске. Попросите Fail2ban проверить конфигурацию перед запуском:
sudo fail2ban-client -tКоманда укажет файл и jail с ошибкой, например Errors in jail 'sshd'. Skipping..., что позволит вам исправить причину, а не гадать.
FAQ
Блокирует ли стандартная установка Fail2ban на Ubuntu 24.04 SSH-атаки?
Да. Пакет содержит /etc/fail2ban/jail.d/defaults-debian.conf, который включает jail sshd, устанавливает backend = systemd для чтения системного журнала systemd вместо отсутствующего /var/log/auth.log и устанавливает banaction = nftables для применения блокировок через стандартный firewall Ubuntu. Базовая конфигурация apt install fail2ban защищает SSH с момента первой загрузки. Проверьте это с помощью sudo fail2ban-client status sshd; значение Total failed должно быть больше нуля.
Почему Fail2ban ничего не блокирует на моем сервере?
Проверьте три распространенные причины по порядку. Вы можете выполнять тесты с адреса в ignoreip, который исключен из блокировок по умолчанию. Вы могли переопределить рабочие настройки, вставив backend = auto в jail.local из старого руководства, что нарушает чтение журнала в образах без auth.log. Или вы можете находиться внутри контейнера, где системный журнал systemd отсутствует. Проверьте Total failed в fail2ban-client status sshd: если значение не растет, в то время как journalctl -u ssh фиксирует реальные ошибки, значит, jail читает неверный источник.
Как разблокировать мой собственный IP-адрес?
Выполните sudo fail2ban-client set sshd unbanip YOUR.IP.HERE, что вернет 1 при успехе, или sudo fail2ban-client unban --all, чтобы очистить все блокировки. Если вы потеряли доступ к SSH, используйте веб-консоль или VNC-консоль вашего провайдера для выполнения той же команды. Блокировка отклоняет все пакеты с вашего адреса на порт 22, поэтому даже уже открытая сессия перестанет работать. Затем добавьте свой адрес в ignoreip, чтобы избежать повторных блокировок.
В чем разница между jail.conf и jail.local?
jail.conf содержит стандартные настройки Fail2ban, которые перезаписываются при каждом обновлении пакета, поэтому любые изменения в этом файле будут утеряны. Пакет Debian/Ubuntu накладывает собственные настройки через jail.d/defaults-debian.conf. Ваши изменения следует вносить в jail.local: этот файл читается последним и имеет приоритет над остальными, а обновления его не затрагивают. Используйте jail.conf только для чтения.
Заменяет ли Fail2ban аутентификацию SSH по ключам?
Нет. Fail2ban ограничивает частоту повторных неудачных попыток входа с одного адреса; он не защищает от медленного распределенного перебора, когда каждый адрес не превышает порог. Аутентификация только по ключам (PasswordAuthentication no) полностью исключает возможность подбора пароля, а Fail2ban в этом случае лишь уменьшает объем шума в логах и блокирует сканеры на ранних этапах. Используйте оба метода и, в идеале, полностью закройте SSH от публичного интернета.