Fail2ban — программа для автоматической защиты серверов Linux и Unix-подобных систем от взлома методом подбора пароля и других видов несанкционированного доступа. Она отслеживает подозрительную активность в логах сервисов (чаще всего SSH, но не только) и реагирует на повторяющиеся ошибки входа.
$ sudo apt install fail2ban $ sudo systemctl status fail2ban
$ sudo fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd
Есть только один jail — sshd — которsq отвечает за мониторинг журналов SSH-сервера на предмет неудачного входа в систему и настройку правил брандмауэра для блокировки дальнейших попыток.
$ 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"
# 1. Удалить старое правило с портом 22 sudo nft delete rule inet f2b-table f2b-chain tcp dport 22 ip saddr @addr-set-SSH reject with icmp port-unreachable # 2. Добавить IP в набор адресов sudo nft add element inet f2b-table addr-set-SSH { 77.238.249.136 } # 3. Добавить новое правило с портом 2234 sudo nft add rule inet f2b-table f2b-chain tcp dport 2234 ip saddr @addr-set-SSH reject with icmp port-unreachable # 4. Проверить результат sudo nft list table inet f2b-table
# 1. Убедиться, что конфиг с портом 2234 существует и правильный sudo tee /etc/fail2ban/jail.d/ssh-port-2234.conf << 'EOF' [sshd] port = 2234 action = nftables-multiport[name=SSH, port="2234", protocol=tcp] maxretry = 5 findtime = 10m bantime = 1h EOF # 2. Перезапустить Fail2Ban sudo systemctl restart fail2ban # 3. Принудительно обновить блокировку sudo fail2ban-client set sshd unbanip 77.238.249.136 sudo fail2ban-client set sshd banip 77.238.249.136 # 4. Проверить статус sudo fail2ban-client status sshd
# Сбросить счётчики sudo nft reset counters table inet f2b-table # Подождать 30 секунд (пока бот пытается подключиться) echo "Наблюдаем за счётчиками 30 секунд..." sleep 30 # Проверить счётчики sudo nft list table inet f2b-table | grep -A1 -B1 "counter packets"
echo "=== 1. Проверка nftables ===" sudo nft list table inet f2b-table echo -e "\n=== 2. Проверка Fail2Ban ===" sudo fail2ban-client status sshd echo -e "\n=== 3. Проверка порта SSH ===" sudo ss -tlnp | grep sshd echo -e "\n=== 4. Проверка логов (последние 10 записей) ===" sudo tail -10 /var/log/fail2ban.log | grep -E "sshd|77.238"