Ставим fail2ban на Ubuntu 24.04, меняем время бана и учимся разбанивать себя. Вывод с живого сервера.

Через несколько минут после создания сервера в его журнале появляются чужие попытки войти по SSH: боты перебирают имена admin, deploy, user. Это нормально для любого сервера в интернете. fail2ban читает журнал, замечает адреса, которые слишком часто ошибаются, и на время закрывает им доступ. Покажем, как его поставить, что он делает по умолчанию и как не запереть самого себя.

Коротко. Ставим: sudo apt install fail2ban. На Ubuntu 24.04 защита SSH включается сразу: 5 неудачных попыток за 10 минут - бан адреса на 10 минут. Состояние: sudo fail2ban-client status sshd. Свои значения пишем в /etc/fail2ban/jail.local, а не в jail.conf. Свой адрес добавляем в ignoreip. fail2ban не заменяет вход по ключу, а дополняет его.

Что происходит с SSH на новом сервере

Порт 22 открыт для всех, поэтому его проверяют автоматические сканеры. Видно это в журнале службы SSH. Команда ниже показывает последние записи об ошибках входа: journalctl читает системный журнал, -u ssh оставляет только службу SSH, а grep выбирает нужные строки.

sudo journalctl -u ssh --no-pager | grep "Invalid user" | tail -n 5

Вот последние пять таких записей на нашем сервере:

Адреса меняются, имена каждый раз новые. Взломать так вряд ли удастся, но журнал забивается, а каждая попытка нагружает сервер. Здесь и нужен fail2ban. (Адреса в выводе заменены на примерные, имя сервера тоже.)

Установка

Пакет есть в стандартном репозитории. Сначала обновляем список пакетов, потом ставим:

sudo apt update && sudo apt install -y fail2ban

Проверяем, что служба запущена и будет стартовать после перезагрузки:

systemctl is-active fail2ban && systemctl is-enabled fail2ban

Ответ должен быть active и enabled. Версию, которую ставит Ubuntu 24.04, смотрим так: fail2ban-client --version. У нас 1.0.2.

Что включено по умолчанию

Защита SSH уже настроена в файле, который идёт вместе с пакетом. Его содержимое:

Читаем по строкам. backend = systemd - искать записи в системном журнале, а не в текстовых файлах. banaction = nftables - банить правилом межсетевого экрана nftables. [sshd] с enabled = true - включить «тюрьму» (так fail2ban называет набор правил) для SSH. Остальные значения берутся из jail.conf. Спросим их у работающей службы:

sudo fail2ban-client get sshd maxretry

Так же читаются bantime и findtime. У нас получилось: maxretry = 5 попыток, findtime = 600 секунд (окно, в котором считаем попытки), bantime = 600 секунд (срок бана). Итого: 5 ошибок за 10 минут - адрес закрыт на 10 минут.

Как посмотреть, что он поймал

Сводка по «тюрьме» SSH:

sudo fail2ban-client status sshd

Вот ответ нашего сервера:

Total failed - неудачные попытки с момента запуска службы, Total banned - сколько адресов уже банили. За чуть больше суток: 706 попыток и 57 банов. Currently banned: 0 значит, что прямо сейчас никто не в бане: сроки истекли. Историю смотрим в журнале самого fail2ban:

sudo grep NOTICE /var/log/fail2ban.log | tail -n 4

Адрес забанен в 12:11:01 и разбанен в 12:21:01 - ровно 10 минут. Как именно адрес блокируется, показывает nftables:

sudo nft list table inet f2b-table

Правило простое: пакеты на порт 22 от адресов из набора addr-set-sshd отклоняются. fail2ban только добавляет и убирает адреса в этом наборе.

Свои настройки

Файлы jail.conf и defaults-debian.conf лучше не править: пакет может их заменить при обновлении. Свои значения кладём в jail.local, он читается позже и имеет приоритет. Открываем файл:

sudo nano /etc/fail2ban/jail.local

И вписываем, подставив свои значения. Пример: бан на час, 4 попытки, свой адрес не трогать:

[sshd]
bantime  = 1h
findtime = 10m
maxretry = 4
ignoreip = 127.0.0.1/8 ::1 203.0.113.5

Вместо 203.0.113.5 пишем свой постоянный адрес. Каждая строка идёт отдельной строкой файла. Применяем настройки:

sudo systemctl restart fail2ban

Если у вас динамический адрес, в ignoreip его надёжно не вписать. Тогда бан спасает только вход по ключу и запасной путь через консоль (ниже).

Если забанили вас самих

Пять опечаток в пароле подряд - и ваш адрес закрыт на срок бана. Если есть второй вход (другой сервер или консоль), снимаем бан так:

sudo fail2ban-client set sshd unbanip 203.0.113.5

Если доступа нет совсем, заходим через консоль сервера: в панели Weasel у сервера есть вкладка Console. Консоль, как правило, подключается не через порт 22 сервера, поэтому бан на неё не действует. Внутри снимаем бан командой выше или просто ждём срок бана.

Чего fail2ban не делает

Он не закрывает дыру, он снижает шум. На нашем сервере вход по паролю вообще выключен (PasswordAuthentication no), то есть ни одна из этих 706 попыток не могла сработать, а бот всё равно пробовал. Главная защита SSH - вход по ключу. fail2ban помогает, когда пароль всё же включён, и разгружает журнал и процессор. Если вы ещё не отключили пароли, начните с этого, а fail2ban добавьте сверху. Версию системы и сроки её обновлений проверьте по отдельной инструкции.

Частые вопросы

Нужен ли fail2ban, если вход по ключу?

Не обязателен: пароль выключен, и перебор безрезультатен. Но fail2ban убирает из журнала поток чужих попыток и не даёт ботам занимать соединения, так что ставить его всё равно полезно.

Как посмотреть забаненные адреса?

Выполните sudo fail2ban-client status sshd. Строка Banned IP list показывает адреса, которые сейчас в бане. Историю смотрите в /var/log/fail2ban.log.

Как разбанить адрес в fail2ban?

Командой sudo fail2ban-client set sshd unbanip АДРЕС. Чтобы не попадать в бан снова, добавьте свой адрес в ignoreip.

Где лежит конфиг fail2ban?

В каталоге /etc/fail2ban/. Свои значения пишите в jail.local, файлы jail.conf и из jail.d, которые идут с пакетом, не правьте.

Итог

  • Ставим: sudo apt install fail2ban, проверяем systemctl is-active fail2ban.
  • На Ubuntu 24.04 SSH защищён сразу: 5 ошибок за 10 минут - бан на 10 минут.
  • Состояние смотрим командой sudo fail2ban-client status sshd, историю - в /var/log/fail2ban.log.
  • Свои значения - в /etc/fail2ban/jail.local, свой адрес - в ignoreip.
  • Разбан: sudo fail2ban-client set sshd unbanip АДРЕС; если вход закрыт совсем - консоль в панели сервера.
  • Ключи важнее fail2ban: сначала отключите вход по паролю.