Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
fail2ban [2015/03/18 12:38] – создано - внешнее изменение 127.0.0.1fail2ban [2025/12/21 03:21] (текущий) 192.168.1.159
Строка 1: Строка 1:
-====== fail2ban ======+====== Fail2ban ======
  
 +**Fail2ban** — программа для автоматической защиты серверов Linux и Unix-подобных систем от взлома методом подбора пароля и других видов несанкционированного доступа. Она отслеживает подозрительную активность в логах сервисов (чаще всего SSH, но не только) и реагирует на повторяющиеся ошибки входа.
  
 +<code bash>
 +$ sudo apt install fail2ban
 +$ sudo systemctl status fail2ban
 +</code>
 +
 +===== Активные jails =====
 +
 +<code bash>
 +$ sudo fail2ban-client status
 +Status
 +|- Number of jail: 1
 +`- Jail list: sshd
 +</code>
 +
 +Есть только один jail — sshd — которsq отвечает за мониторинг журналов SSH-сервера на предмет неудачного входа в систему и настройку правил брандмауэра для блокировки дальнейших попыток.
 +
 +===== Статистика по sshd jail =====
 +
 +<code bash>
 +$ 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:
 +</code>
 +
 +В стандартной конфигурации fail2ban защитит SSH-сервер и заблокирует злоумышленника на 10 минут после 5 неудачных попыток входа в систему в течение 10 минут. Файл конфигурации по умолчанию можно найти в /etc/fail2ban/jail.conf.
 +
 +<code bash>
 +$ 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!
 +</code>
 +
 +<code bash>
 +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/           reject-with icmp-port-unreachable
 +RETURN     all  --  0.0.0.0/           0.0.0.0/0
 +</code>
 +
 +<code bash>
 +$ # 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:
 +</code>
 +
 +<code bash>
 +# Разблокировать и повторно заблокировать 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"
 +</code>
 +
 +<code bash>
 +# 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
 +</code>
 +
 +<code bash>
 +# 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
 +</code>
 +
 +<code bash>
 +# Сбросить счётчики
 +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"
 +</code>
 +
 +<code bash>
 +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"
 +</code>