Fail2ban

Fail2ban — программа для автоматической защиты серверов Linux и Unix-подобных систем от взлома методом подбора пароля и других видов несанкционированного доступа. Она отслеживает подозрительную активность в логах сервисов (чаще всего SSH, но не только) и реагирует на повторяющиеся ошибки входа.

$ sudo apt install fail2ban $ sudo systemctl status fail2ban

Активные jails

$ sudo fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd

Есть только один jail — sshd — которsq отвечает за мониторинг журналов SSH-сервера на предмет неудачного входа в систему и настройку правил брандмауэра для блокировки дальнейших попыток.

Статистика по sshd jail

$ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:

В стандартной конфигурации fail2ban защитит SSH-сервер и заблокирует злоумышленника на 10 минут после 5 неудачных попыток входа в систему в течение 10 минут. Файл конфигурации по умолчанию можно найти в /etc/fail2ban/jail.conf.

$ sudo nft list ruleset | grep -A5 -B5 "77.238.249.136\|fail2ban" # Warning: table ip nat is managed by iptables-nft, do not touch! chain DOCKER-USER { } chain f2b-sshd { ip saddr 77.238.249.136 counter packets 0 bytes 0 reject counter packets 0 bytes 0 return } chain INPUT { type filter hook input priority filter; policy accept; # Warning: table ip filter is managed by iptables-nft, do not touch! # Warning: table ip6 nat is managed by iptables-nft, do not touch!
Chain DOCKER-USER (1 references) target prot opt source destination Chain f2b-sshd (1 references) target prot opt source destination REJECT all -- 77.238.249.136 0.0.0.0/0 reject-with icmp-port-unreachable RETURN all -- 0.0.0.0/0 0.0.0.0/0
$ # 1. Проверить актуальное правило (должен быть порт 2234) sudo nft list table inet f2b-table # 2. Проверить счётчики после 30 секунд ожидания echo "Текущие счётчики:" sudo nft list table inet f2b-table | grep -A1 -B1 "counter packets" # 3. Проверить статус Fail2Ban echo -e "\nСтатус Fail2Ban:" sudo fail2ban-client status sshd # 4. Проверить порт в конфигурации sshd echo -e "\nПорт SSH в конфиге:" sudo grep -E "^Port|#Port" /etc/ssh/sshd_config # 5. Проверить логи Fail2Ban за последние 5 минут echo -e "\nЛоги Fail2Ban:" sudo journalctl -u fail2ban --since "5 minutes ago" | grep -E "Found|Ban|77.238" table inet f2b-table { set addr-set-SSH { type ipv4_addr } chain f2b-chain { type filter hook input priority filter - 1; policy accept; tcp dport 22 ip saddr @addr-set-SSH reject with icmp port-unreachable } } Текущие счётчики: Статус Fail2Ban: Status for the jail: sshd |- Filter | |- Currently failed: 1 | |- Total failed: 18 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 2 `- Banned IP list: Порт SSH в конфиге: Port 2234 Логи Fail2Ban:
# Разблокировать и повторно заблокировать IP sudo fail2ban-client set sshd unbanip 77.238.249.136 sudo fail2ban-client set sshd banip 77.238.249.136 # Проверить, что правило создано с правильным портом sudo nft list table inet f2b-table # Тестовое подключение (с другого сервера если есть) # или подождать пока бот снова попытается подключиться # Проверить счётчики через 1 минуту sleep 60 echo "Счётчики после 1 минуты:" sudo nft list table inet f2b-table | grep -B2 -A2 "counter packets"