Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| fail2ban [2015/03/18 12:38] – создано - внешнее изменение 127.0.0.1 | fail2ban [2025/12/21 03:21] (текущий) – 192.168.1.159 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== | + | ====== |
| + | **Fail2ban** — программа для автоматической защиты серверов Linux и Unix-подобных систем от взлома методом подбора пароля и других видов несанкционированного доступа. Она отслеживает подозрительную активность в логах сервисов (чаще всего SSH, но не только) и реагирует на повторяющиеся ошибки входа. | ||
| + | <code bash> | ||
| + | $ sudo apt install fail2ban | ||
| + | $ sudo systemctl status fail2ban | ||
| + | </ | ||
| + | |||
| + | ===== Активные jails ===== | ||
| + | |||
| + | <code bash> | ||
| + | $ sudo fail2ban-client status | ||
| + | Status | ||
| + | |- Number of jail: 1 | ||
| + | `- Jail list: sshd | ||
| + | </ | ||
| + | |||
| + | Есть только один 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: | ||
| + | `- Actions | ||
| + | |- Currently banned: 0 | ||
| + | |- Total banned: 0 | ||
| + | `- Banned IP list: | ||
| + | </ | ||
| + | |||
| + | В стандартной конфигурации fail2ban защитит SSH-сервер и заблокирует злоумышленника на 10 минут после 5 неудачных попыток входа в систему в течение 10 минут. Файл конфигурации по умолчанию можно найти в / | ||
| + | |||
| + | <code bash> | ||
| + | $ sudo nft list ruleset | grep -A5 -B5 " | ||
| + | # Warning: table ip nat is managed by iptables-nft, | ||
| + | |||
| + | 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, | ||
| + | # Warning: table ip6 nat is managed by iptables-nft, | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | Chain DOCKER-USER (1 references) | ||
| + | target | ||
| + | |||
| + | Chain f2b-sshd (1 references) | ||
| + | target | ||
| + | REJECT | ||
| + | RETURN | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | $ # 1. Проверить актуальное правило (должен быть порт 2234) | ||
| + | sudo nft list table inet f2b-table | ||
| + | |||
| + | # 2. Проверить счётчики после 30 секунд ожидания | ||
| + | echo " | ||
| + | sudo nft list table inet f2b-table | grep -A1 -B1 " | ||
| + | |||
| + | # 3. Проверить статус Fail2Ban | ||
| + | echo -e " | ||
| + | sudo fail2ban-client status sshd | ||
| + | |||
| + | # 4. Проверить порт в конфигурации sshd | ||
| + | echo -e " | ||
| + | sudo grep -E " | ||
| + | |||
| + | # 5. Проверить логи Fail2Ban за последние 5 минут | ||
| + | echo -e " | ||
| + | sudo journalctl -u fail2ban --since "5 minutes ago" | grep -E " | ||
| + | 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: | ||
| + | `- Actions | ||
| + | |- Currently banned: 0 | ||
| + | |- Total banned: 2 | ||
| + | `- Banned IP list: | ||
| + | |||
| + | Порт SSH в конфиге: | ||
| + | Port 2234 | ||
| + | |||
| + | Логи Fail2Ban: | ||
| + | </ | ||
| + | |||
| + | <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 " | ||
| + | sudo nft list table inet f2b-table | grep -B2 -A2 " | ||
| + | </ | ||
| + | |||
| + | <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 bash> | ||
| + | # 1. Убедиться, | ||
| + | sudo tee / | ||
| + | [sshd] | ||
| + | port = 2234 | ||
| + | action = nftables-multiport[name=SSH, | ||
| + | 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 bash> | ||
| + | # Сбросить счётчики | ||
| + | sudo nft reset counters table inet f2b-table | ||
| + | |||
| + | # Подождать 30 секунд (пока бот пытается подключиться) | ||
| + | echo " | ||
| + | sleep 30 | ||
| + | |||
| + | # Проверить счётчики | ||
| + | sudo nft list table inet f2b-table | grep -A1 -B1 " | ||
| + | </ | ||
| + | |||
| + | <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 / | ||
| + | </ | ||