Встановлення Fail2ban на Ubuntu 24.04
Налаштування захисту SSH на Ubuntu 24.04 через apt. Як перевірити статус через fail2ban-client та виправити помилку, коли Total failed показує 0.
Що насправді робить Fail2ban
Fail2ban — це демон для читання логів. Він відстежує повідомлення про автентифікацію SSH і, після кількох невдалих спроб з однієї адреси за короткий проміжок часу, виконує команду firewall, яка блокує цю адресу на певний час. Це основна функція програми. Конфігурація складається приблизно з тридцяти рядків в одному файлі. На Ubuntu 24.04 встановлення виконується однією командою apt, що забезпечує захист ще до внесення будь-яких змін у налаштування.
Важливо розуміти можливості та обмеження програми. Fail2ban не виконує автентифікацію, не шифрує дані та не зупиняє одну цілеспрямовану спробу входу — лише повторювані спроби з одного джерела. Це фільтр шуму та обмежувач частоти запитів, а не замок. Його завдання — припинити марну трату ресурсів CPU, пропускної здатності каналу та місця в логах через постійне фонове сканування порту 22, а також сповільнити зловмисника, який змушений діяти з однієї адреси за раз.
Що Fail2ban не замінює
Fail2ban — це третій рівень захисту, а не перший. Якщо ваш сервер все ще приймає паролі SSH, ботнет із тисяч адрес може продовжувати перебір. Це можливо, якщо кожна окрема адреса не досягає порогу блокування. Надійним захистом є автентифікація лише за ключами. Вона робить перебір паролів неможливим незалежно від кількості спроб. Використання Fail2ban разом із автентифікацією за ключами дає два переваги: він очищує логи від шуму brute-force атак та видаляє сканери на ранніх етапах, щоб вони не перевантажували порт. Розглядайте це як стратегію ешелонованого захисту. Fail2ban працює після автентифікації за ключами та після firewall, а не перед ними.
Prerequisites, and the Ubuntu 24.04 reality
Вам потрібен VPS під керуванням Ubuntu 24.04 з правами root або sudo та налаштованим SSH — бажано з автентифікацією за ключами. Fail2ban споживає мало ресурсів: кілька десятків мегабайт RAM, налаштування лімітів не потрібні.
Тепер про помилку, яку припускають усі старі посібники. Роками стандартною порадою було: «встановіть Fail2ban, а потім додайте backend = systemd, тому що Ubuntu перестала створювати /var/log/auth.log». Ця порада описує реальну зміну — сучасні образи серверів та хмарних платформ постачаються без rsyslog, тому SSH пише логи лише в systemd journal, а відповідний текстовий файл відсутній. Проте у пакеті Fail2ban для Ubuntu 24.04 це вже враховано. Пакет містить /etc/fail2ban/jail.d/defaults-debian.conf, і саме цей файл, а не стандартні налаштування розробника, використовується вашим сервером:
[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, перезаписавши робочі налаштування за замовчуванням. У розділі failure-modes наведено детальний опис кожного випадку.
Step 1: Встановлення та перевірка роботи блокування
sudo apt update
sudo apt install -y fail2banUbuntu 24.04 постачається з Fail2ban 1.0.2. Пакет містить python3-systemd як обов'язкову залежність, тому backend журналу має всі необхідні компоненти. Сервіс увімкнено та запущено автоматично:
sudo systemctl status fail2banВам потрібен active (running). Перевірте jail, який вже виконує свої функції:
sudo fail2ban-client status sshdНа публічному VPS, доступному лише кілька хвилин, часто вже видно підрахунок помилок та заблоковані адреси — інтернет-сканери постійно сканують порт 22. Це підтверджує, що стандартна конфігурація працює. На цьому етапі ви лише вдосконалюєте налаштування, а не створюєте їх з нуля.
Step 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 залишаєте без змін як зразок.
Step 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, налаштовану під ваші порти та політику блокування, за цим посиланням, а потім вставити її у файл:
Step 4: Restart and verify it is reading the journal
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 або пізніше, де worker на кожне з'єднання — sshd-session); відповідні сценарії помилок враховують цей випадок.
Step 5: Перевірка реального блокування або примусове блокування для тестування
На будь-якому публічному VPS реальні блокування з'являються автоматично протягом декількох хвилин. Щоб відстежити процес, використовуйте команду tail для перегляду логів:
sudo tail -f /var/log/fail2ban.logПриклад блокування виглядає так:
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.66Щоб перевірити роботу механізму від початку до кінця без очікування, заблокуйте вручну адресу документації — ніколи не використовуйте власну адресу:
sudo fail2ban-client set sshd banip 10.0.0.66Буде виведено 1, а адреса з'явиться у Banned IP list у файлі fail2ban-client status sshd. Тепер переконайтеся, що блокування дійсно діє у firewall. В Ubuntu 24.04 використовується nftables, а не iptables:
sudo nft list table inet f2b-tableВи побачите набір (set) з назвою addr-set-sshd, що містить 10.0.0.66, та ланцюжок (chain) f2b-chain, який відхиляє будь-яку адресу з цього набору. Якщо fail2ban-client вказує, що адреса заблокована, але в nft list нічого не з'являється, це означає, що дія блокування не відповідає налаштуванням вашого firewall — перегляньте примітку щодо nftables/iptables у розділі типових помилок.
Step 6: Розблокуйте себе та відновіть доступ, якщо ви втратили доступ до системи
Якщо ви заблокували адресу помилково — наприклад, власну — видаліть її:
sudo fail2ban-client set sshd unbanip 10.0.0.66У разі успіху повертається 1. Щоб видалити всі блокування у всіх jail:
sudo fail2ban-client unban --allНе розраховуйте на збереження активної SSH-сесії: nftables відхиляє кожен пакет від заблокованої адреси на порт 22 — включно з established з'єднаннями. Існуюча сесія перестане відповідати одразу після застосування блокування. Якщо ви заблокували себе і у вас немає запису ignoreip, ви втратите доступ до системи до закінчення терміну дії блокування. Щоб відновити доступ, використовуйте веб-консоль провайдера (VNC або serial), яка не залежить від SSH. Ви можете дочекатися закінчення терміну дії bantime або виконати команду розблокування через консоль.
Step 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, де ці рядки відсутні.
Step 8: Pair it with key-only SSH, and better still a 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 від публічного інтернету: використовуйте self-hosted WireGuard VPN для SSH та налаштуйте firewall для порту 22 так, щоб він приймав з'єднання лише через тунель. Неможливо провести brute force на порт, який недоступний ззовні, тому Fail2ban стає додатковим захистом, а не основним рубежем.
Fail2ban призначений не лише для SSH. Будь-який сервіс із логуванням невдалих спроб входу може мати jail — поштовий сервер, сайт на nginx або self-hosted Vaultwarden password manager, веб-інтерфейс якого не варто залишати відкритим для 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, тому стандартний match його не знаходить. Розширте match у блоці [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. Це невідповідність між дією блокування та фаєрволом; на 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, або, якщо ви керуєте фаєрволом повністю через 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 journal замість відсутнього /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 journal для читання. Перевірте 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 для публічного інтернету.