===== Защита сервера OpenSSH с помощью fail2ban и nftables на Debian GNU/Linux ===== {{:unix-linux:debian:pasted:20171124-194401.png }} **fail2ban** это популярное ПО для предотвращения вторжений, которое отслеживает файлы журналов на предмет подозрительной активности и динамически обновляет правила брандмауэра, блокируя подозрительные IP-адреса. В рассмотренной ниже конфигурации мы будем использовать **fail2ban** с журналом **systemd** в качестве бэкенда (вместо традиционного syslog) и **nftables** в качестве бэкенда брандмауэра. ---- ==== Базовая настройка fail2ban ==== Установим **fail2ban** и модуль **python** для **systemd**:
# apt install fail2ban python3-systemdОсновные настройки fail2ban расположены в файле **fail2ban.conf** (''/etc/fail2ban/fail2ban.conf'') и в большинстве случаев можно оставить его параметры в значениях по умолчанию. В нашем примере в этом файле изменяется только значение ''dbpurgeage'' с 1d на 10d и отключается поддержка IPv6. Приведу пример базовой конфигурации ''fail2ban.conf'' без учёта комментариев:
# egrep -v "^[[:space:]]*#|^$" /etc/fail2ban/fail2ban.conf [DEFAULT] loglevel = INFO logtarget = /var/log/fail2ban.log syslogsocket = auto socket = /var/run/fail2ban/fail2ban.sock pidfile = /var/run/fail2ban/fail2ban.pid allowipv6 = off dbfile = /var/lib/fail2ban/fail2ban.sqlite3 dbpurgeage = 10d dbmaxmatches = 10 [Definition] [Thread]Основные настройки блокировок для разных приложений можно найти в файле **jail.conf** (''/etc/fail2ban/jail.conf''). Скопируем файл jail.conf в **jail.local** и будем править именно него, чтобы можно было обновлять в дальнейшем пакет без дополнительных предупреждений о переписывании основного конфига jail.conf:
# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # nano /etc/fail2ban/jail.localФайл разделён на секции. Секция ''[DEFAULT]'' содержит основные настройки для блокировок любых приложений. Далее идут секции, описывающие параметры блокировок для конкретных приложений. Пример изменённых параметров в секции ''[DEFAULT]'' в конфигурационном файле jail.local:
# systemctl restart fail2ban # systemctl status fail2banПроверим состояние fail2ban и посмотрим какие Jail активны:
# fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshdУбедимся в том, что активен Jail для службы sshd и посмотрим его текущий статус:
# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:---- ==== Проверка блокировки ==== Проверим то, как отработает блокировка. Попытаемся подключиться к нашему серверу с внешнего IP, отличного от нашего (чтобы не заблокировать свой же адрес), с помощью SSH клиента:
$ ssh -p 758 fakeuser@your-server-ipПосле третьей попытки ввода неверных учётных данных SSH-сервер должен начать отвергать запросы клиента на соединение. Проверим статус fail2ban и убедимся в том, что для зловредного клиента появилось правило блокировки:
# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 3 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 77.88.44.242Проверим состояние текущей конфигурации **nftables**. Здесь должна появится отдельная таблица ''f2b-table'' с цепочкой правил ''f2b-chain'':
# nft list ruleset... table inet f2b-table { set addr-set-sshd { type ipv4_addr elements = { 77.88.44.242 } } chain f2b-chain { type filter hook input priority filter - 1; policy accept; tcp dport 758 ip saddr @addr-set-sshd reject with icmp port-unreachable } }Как видим, механизм защиты сработал. Добавленное в nftables правило должно будет автоматически удалиться через 24 часа, согласно заданным нами настройкам. Это предотвратит разрастание соответствующих цепочек и не окажет отрицательного влияния на производительность nftables. ---- ==== Разблокировка IP-адреса ==== Чтобы вручную разблокировать определённый IP-адрес, который был заблокирован fail2ban, можно выполнить команду в формате:
fail2ban-client set unbanip
Например, удалим из блокировки IP-адрес 77.88.44.242, который был заблокирован в соответствии с правилами секции [sshd] :
# fail2ban-client set sshd unbanip 77.88.44.242---- ==== Усиление защиты с помощью Jail "recidive" ==== Мы можем усилить уровень защиты, активировав дополнительный Jail "**recidive**" для анализа рецидивов. Этот джейл будет отслеживать файл журнала fail2ban и банить IP-адреса, которые были забанены несколько раз. Чтобы активировать Jail "recidive", отредактируйте в файле ''/etc/fail2ban/jail.local'' соответствующую секцию:
# systemctl restart fail2ban # fail2ban-client status Status |- Number of jail: 2 `- Jail list: recidive, sshd---- ==== Диагностика ==== Для процедур диагностики и отладки fail2ban и работающий в нём Jail, помимо выше обозначенной утилиты **fail2ban-client**, наглядным инструментом будет основной лог, где фиксируются практически все активности fail2ban:
# less /var/log/fail2ban.log\\ ---- Дополнительные источники информации: * [[https://www.server-world.info/en/note?os=Debian_12&p=fail2ban|Server World - Fail2Ban : Intrusion Prevention System]] * [[https://pieterbakker.com/secure-debian-12-with-fail2ban-and-nftables/|Pieter Bakker - Secure Debian 12 with Fail2ban and nftables]] * [[unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban|Настройка OpenSSH и Fail2ban на Ubuntu Server 14.04 LTS]] ---- Проверено на следующих конфигурациях: ^ Версия ОС ^ Версия fail2ban ^ Версия nftables ^ |Debian GNU/Linux 12.0 (Bookworm) | 1.0.2-2 | 1.0.6-2+deb12u2 | |Debian GNU/Linux 13.0 (Trixie) | 1.1.0-8 | 1.1.3-1 | ---- {{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 14.08.2025 12:26 {{tag>Linux Debian "Debian 12" "Debian Bookworm" "Debian 13" "Debian Trixie" Firewall fail2ban nftables SSH OpenSSH sshd}} ~~DISCUSSION~~