С чего начать Первые шаги трек · 15 ступеней
Linux Labs

fail2ban

6 мин Ubuntu 24.04 · fail2ban 1.0

Бан по логам — защита SSH и сервисов от перебора; jail'ы, статус, разбан.

Шпаргалка

4 команды Версия для печати
  • sudo fail2ban-client status jail'ы
  • sudo fail2ban-client status sshd забаненные
  • sudo fail2ban-client set sshd unbanip 1.2.3.4 разбан
  • sudo fail2ban-regex /var/log/auth.log sshd тест фильтра
  • jail.local: bantime, findtime, maxretry, ignoreip, backend

Обзор

fail2ban читает логи сервисов, ловит признаки атаки (например, неудачные входы по SSH) и временно банит IP через файрвол. Служба fail2ban под systemd.

bash
systemctl status fail2ban
sudo fail2ban-client status        # список активных jail'ов
sudo fail2ban-client status sshd   # детали jail sshd (забаненные IP)

Конфигурация

Настройка

Не правь jail.conf — создай jail.local (переживает обновления пакета):

ini
# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h          # на сколько банить (поддерживает 10m, 1h, 1d)
findtime = 10m         # окно, в котором считаем попытки
maxretry = 5           # сколько промахов до бана
ignoreip = 127.0.0.1/8 10.0.0.0/24    # белый список (свои сети!)
backend  = systemd     # в Ubuntu логи SSH часто в journald

[sshd]
enabled = true

[recidive]             # бан повторных нарушителей надолго
enabled  = true
bantime  = 1w
findtime = 1d
maxretry = 5
bash
sudo systemctl restart fail2ban

Свой jail/фильтр

Для своего сервиса: фильтр (regex с группой <HOST>) + jail:

ini
# /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^.*authentication failed from <HOST>.*$

# /etc/fail2ban/jail.local
[myapp]
enabled  = true
logpath  = /var/log/myapp/access.log
maxretry = 4

Проверь регуляркой до включения: fail2ban-regex <лог> <фильтр> (покажет, сколько совпадений поймал).

Порядок файлов

fail2ban читает настройки jail по порядку, и действует последнее значение:

  1. jail.conf — из пакета, не правят;
  2. jail.d/*.conf — по алфавиту, тут же defaults-debian.conf;
  3. jail.local;
  4. jail.d/*.local — по алфавиту.

maxretry = 6 в jail.d/aa.conf, 4 в jail.local и 3 в jail.d/zz.local дают 3. Итог для jail печатает fail2ban-client -d:

text
student@ubuntu:~$ sudo fail2ban-client -d | grep "'sshd', '"
['set', 'sshd', 'maxretry', 3]
['set', 'sshd', 'findtime', '10m']
['set', 'sshd', 'bantime', '10m']
['set', 'sshd', 'addignoreip', '127.0.0.1/8', '192.0.2.20']

Ошибка в любом файле не даёт службе стартовать — fail2ban-client -d покажет и её.

Что задаёт Ubuntu

На учебной машине служба fail2ban выключена. Пакет кладёт jail.d/defaults-debian.conf:

ini
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd

[sshd]
enabled = true

backend = systemd — jail читает журнал systemd, logpath ему не нужен. fail2ban-client status sshd показывает, что он ищет: Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd (+ — «или»; на Ubuntu 24.04 служба называется ssh.service, строки находятся по _COMM=sshd).

Бан — адрес в наборе таблицы inet f2b-table, правило отвечает reject:

text
table inet f2b-table {
	set addr-set-sshd {
		type ipv4_addr
		elements = { 192.0.2.20 }
	}
	chain f2b-chain {
		type filter hook input priority filter - 1; policy accept;
		tcp dport 22 ip saddr @addr-set-sshd reject with icmp port-unreachable
	}
}

Забаненный адрес видит порт 22 как filtered (см. nmap), после unbanip — снова open.

Рецепты

1

Управление

bash
sudo fail2ban-client status               # все jail'ы
sudo fail2ban-client status sshd          # кто забанен, счётчики
sudo fail2ban-client set sshd unbanip 1.2.3.4   # разбанить
sudo fail2ban-client set sshd banip 1.2.3.4     # забанить вручную
sudo fail2ban-client get sshd bantime     # текущее значение параметра
sudo fail2ban-client reload               # перечитать конфиг
sudo fail2ban-regex /var/log/auth.log sshd  # тест фильтра
sudo tail -f /var/log/fail2ban.log        # решения: Found, Ban

Неполадки

5

Забанил сам себя

С консоли (гипервизор/serial) или с разрешённого IP: fail2ban-client set sshd unbanip <твой IP>. Добавь свою сеть в ignoreip.

Jail не банит

  • enabled = true? fail2ban-client status показывает jail?
  • Верный logpath и фильтр под формат логов; в Ubuntu SSH часто в journald — нужен backend = systemd.
  • Проверь фильтр: fail2ban-regex на реальном логе — ловит ли строки.

Адрес не банится: Ignore by ip

Адрес попал в ignoreip: неудачи с него не считаются, Total failed остаётся 0, а /var/log/fail2ban.log пишет на каждую строку журнала:

text
fail2ban.filter [3147]: INFO    [sshd] Ignore 192.0.2.20 by ip

Без адреса в ignoreip те же попытки дают Found и бан:

text
fail2ban.filter  [3147]: INFO    [sshd] Found 192.0.2.20
  - 2026-10-21 05:50:02
fail2ban.actions [3147]: NOTICE  [sshd] Ban 192.0.2.20

Сеть администратора в ignoreip нужна, адрес атакующего — нет. После правки — sudo fail2ban-client reload.

Банит, но атака продолжается с других IP

Это распределённый брутфорс. Включи recidive, ужесточи maxretry/findtime, рассмотри гео/ASN-блок на firewall (см. whois для CIDR).

Не уверен, работает ли вообще

fail2ban-client status sshd → Total/Currently failed и banned. Строки Found, Ban, Unban — в /var/log/fail2ban.log.

Термины

2
перебор паролей (brute force) brute force (password guessing)
Атака, при которой входят подряд с разными паролями, пока какой-то не подойдёт. Следы — сотни строк «Failed password» в журнале sshd. Защита — вход по ключу, faillock и бан адреса fail2ban.
jail (правило fail2ban) jail (fail2ban)
Связка в fail2ban: откуда читать журнал (backend, logpath), какой фильтр искать, сколько неудач допустить (maxretry за findtime) и на сколько банить адрес (bantime). Состояние — fail2ban-client status <jail>. Ещё встречается в: Файрвол, nmap: какие порты видны снаружи, PAM: проверка входа, политика паролей и блокировка, whois

См. также

  • sshd — Сервер SSH — удалённый доступ по ключам, конфиг и хардненинг.
  • firewall — Фильтрация трафика — простой ufw и низкоуровневый nftables.
  • journalctl — Чтение журнала systemd (journald) — фильтры по службе, времени, приоритету.
Загрузка…