Ниже — чек-лист и конкретные команды, которые обычно помогают понять, почему Fail2ban не банит IP для панели 3x-ui. Сначала общая идея: нужно проверить, что Fail2ban запущен и «видит» правильные логи/строки, что фильтр (regex) совпадает с форматами логов 3x-ui, и что действие (action) действительно добавляет правило в iptables/nftables.
1) Проверка состояния сервисов
- Статус Fail2ban:
- systemctl status fail2ban
- journalctl -u fail2ban -n 200
Ищите ошибки запуска, исключения, проблемы с конфигом.
- Статус 3x-ui (если у него systemd unit):
- systemctl status 3x-ui
- journalctl -u 3x-ui -n 200
2) Логи Fail2ban и 3x-ui
- Основные логи Fail2ban:
- /var/log/fail2ban.log
- journalctl -u fail2ban
Откройте их и ищите: загрузку джейлов, ошибки фильтров, сообщения о банах/разбанах, ошибки backend (iptables/nft).
- Логи 3x-ui — найдите где пишет панель (варианты):
- /var/log/3x-ui/*.log
- /usr/local/3x-ui/log/*.log
- journalctl -u 3x-ui
Если не уверены, выполните: ps aux | grep 3x-ui и посмотрите аргументы запуска или конфиг, где указан путь к логу.
- Смотрите также /var/log/syslog или /var/log/messages (/var/log/auth.log) — в зависимости от дистрибутива.
3) Проверить, «видит» Fail2ban нужные логи и джейлы
- Посмотреть список джейлов:
- fail2ban-client status
- Статус конкретного джейла (например 3x-ui или ui):
- fail2ban-client status <jailname>
Результат покажет, какой лог файл использует джейл, какие IP в banned list, сколько найдено попыток и т.д.
4) Тестировать регулярные выражения фильтра
- Найдите соответствующий фильтр в /etc/fail2ban/filter.d/<filter>.conf
- Протестируйте реальный лог против фильтра:
- fail2ban-regex /путь/к/логу /etc/fail2ban/filter.d/<filter>.conf
Это покажет, какие строки совпадают, и какие нет. Очень часто причина в том, что лог-проект 3x-ui использует другой формат/таймштамп/JSON и фильтр не находит совпадений.
5) Проверить путь к логам и права доступа
- В конфиге джейла (jail.local или /etc/fail2ban/jail.d/*.conf) посмотрите параметр logpath. Убедитесь, что Fail2ban имеет права читать этот файл (проверить владельца и права). Если лог пишется только в systemd-journal, а logpath указывает на файл — фильтр не сработает.
- Если логи в journal, настройте джейл на использование systemd или укажите logpath = /var/log/syslog и т.п.
6) Проверить backend (iptables vs nftables) и соответствие firewall
- Узнать backend Fail2ban:
- fail2ban-client -v | head -n 20 (может показать)
- В логах fail2ban при старте видно, какой backend используется.
- Проверить правила:
- iptables -L -n -v
- nft list ruleset
- Если у вас nftables, а Fail2ban настроен на iptables, бан не появится — убедитесь, что action соответствует вашему firewall.
7) Проверить формат логов (IPv6/IPv4, прокси)
- Если 3x-ui стоит за обратным прокси (nginx, caddy) — логи могут содержать только 127.0.0.1 и fail2ban будет банить локалхост или ничего не банить. Убедитесь, что лог содержит реальный IP клиента.
- Если лог в JSON, фильтр может не распознавать строку. Возможно нужен другой фильтр или преобразование логов.
8) Debug-режим Fail2ban
- Включите подробный лог:
- В /etc/fail2ban/fail2ban.conf поставьте loglevel = DEBUG
- Перезапустите: systemctl restart fail2ban
- Просмотрите /var/log/fail2ban.log — там будет подробно, какие файлы открываются, какие строки проверяются, какие regex применяются.
9) Проверить лог-ротацию
- Если лог- файл был переименован/сжат logrotate, Fail2ban может «потерять» файл. Перезапуск Fail2ban или использование postrotate в logrotate, чтобы посылать HUP или рестарт, может решить проблему.
10) Частые ошибки и на что обратить внимание
- Неправильный path в jail (logpath указывает в другое место).
- Неправильный имя джейла (jail не включён: enabled = false).
- Фильтр написан для другого текста ошибок (нужно адаптировать regex).
- Fail2ban не может управлять firewall из-за отсутствия прав или несовместимого backend.
- SELinux/AppArmor мешает доступу к логам — смотрите audit.log или dmesg.
- Прокси/Cloudflare скрывают реальный IP.
11) Полезные команды-резюме
- systemctl status fail2ban
- journalctl -u fail2ban -f
- tail -F /var/log/fail2ban.log
- fail2ban-client status
- fail2ban-client status <jailname>
- fail2ban-regex /path/to/log /etc/fail2ban/filter.d/<filter>.conf
- iptables -L -n -v
- nft list ruleset
- ps aux | grep 3x-ui; journalctl -u 3x-ui -f; tail -F /path/to/3x-ui.log
Если хотите, пришлите:
- имя джейла (как вы его создали в jail.local),
- содержимое соответствующего /etc/fail2ban/filter.d/*.conf и /etc/fail2ban/jail.local (или секции джейла),
- несколько строк из логов 3x-ui (пример — строки входа/ошибки),
я помогу проверить и написать корректный фильтр или указать что именно не совпадает.