Start typing to search across invoices, services, domains, tickets, and more...
Как только у сервера появляется публичный IP, боты в течение нескольких минут начинают подбирать пароль SSH, а сайты сканируют в поисках админок и заваливают запросами. Fail2ban анализирует логи и автоматически блокирует через файрвол IP, который слишком часто ошибается или шлёт слишком много запросов. В статье: установка Fail2ban на Debian/Ubuntu и Rocky Linux/AlmaLinux, файл jail.local, jail sshd против перебора паролей SSH, защита сайтов jail-ами nginx-limit-req и nginx-http-auth, связка с ufw/firewalld, разбан и белый список.
На Debian/Ubuntu ставьте из стандартных репозиториев вместе с python3-systemd, чтобы Fail2ban читал входы SSH из журнала systemd (начиная с Debian 12 файл /var/log/auth.log по умолчанию не создаётся). На Rocky/AlmaLinux Fail2ban берётся из EPEL, а пакет fail2ban-firewalld переключает блокировку на firewalld.
# Debian / Ubuntu
apt update
apt install -y fail2ban python3-systemd
# Rocky Linux / AlmaLinux (EPEL)
dnf install -y epel-release
dnf install -y fail2ban fail2ban-firewalld
systemctl enable --now fail2ban
fail2ban-client version
Не редактируйте jail.conf — он перезаписывается при обновлении; все изменения храните в jail.local. Конфигурация ниже блокирует IP на час после трёх неудачных входов за десять минут, а повторным нарушителям срок растёт вплоть до недели. Если SSH перенесён на другой порт (см. статью о смене порта SSH), укажите его в port, иначе блокировка не затронет реальный порт.
# Never edit jail.conf (it is overwritten on upgrade); use jail.local
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
# Your own IPs are never banned (office/home IP, monitoring, other servers)
ignoreip = 127.0.0.1/8 ::1 198.51.100.20 203.0.113.0/24
bantime = 1h
findtime = 10m
maxretry = 5
# Repeat offenders get longer bans, up to one week
bantime.increment = true
bantime.maxtime = 1w
[sshd]
enabled = true
# use your custom port if you changed it, e.g. port = 2222
port = ssh
backend = systemd
maxretry = 3
EOF
fail2ban-client -t # test the configuration
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
banaction определяет, чем Fail2ban блокирует адрес. При ufw на Ubuntu/Debian укажите ufw; на Rocky/AlmaLinux пакет fail2ban-firewalld уже выбирает rich rules firewalld; без этих файрволов используйте nftables-multiport. Выберите один вариант, пропишите его в секции [DEFAULT] файла jail.local и перезапустите Fail2ban (основы — в статье о файрволе Linux).
# Debian / Ubuntu with ufw - add to [DEFAULT] in /etc/fail2ban/jail.local
banaction = ufw
# Rocky / AlmaLinux with firewalld - set automatically by fail2ban-firewalld
# (/etc/fail2ban/jail.d/00-firewalld.conf), or explicitly:
banaction = firewallcmd-rich-rules
# Plain nftables without ufw/firewalld
banaction = nftables-multiport
# Check that bans really reach the firewall
ufw status numbered | head
firewall-cmd --list-rich-rules
nft list ruleset | grep -A5 f2b
Jail nginx-limit-req опирается на модуль limit_req: при превышении лимита Nginx пишет в error.log «limiting requests», и Fail2ban блокирует клиента. nginx-http-auth следит за ошибками Basic Auth и хорошо подходит для защиты админ-разделов. Подберите лимит под свой трафик, чтобы не задеть обычных посетителей.
# /etc/nginx/nginx.conf, inside http { }
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
# inside the server { } or location { } you want to protect
limit_req zone=perip burst=20 nodelay;
# protected area with basic auth (optional)
location /admin/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
nginx -t && systemctl reload nginx
Удобно вынести jail-ы Nginx в отдельный файл в jail.d. Перед включением проверьте командой fail2ban-regex, что фильтр действительно находит строки в вашем логе. В панелях вроде aaPanel логи лежат в другом месте — поправьте logpath.
cat > /etc/fail2ban/jail.d/nginx.local <<'EOF'
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
[nginx-limit-req]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
findtime = 1m
maxretry = 10
bantime = 2h
EOF
# Check that the filter matches lines in your log
fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-limit-req.conf
fail2ban-client reload
fail2ban-client status nginx-limit-req
Разблокировать можно в одном jail или сразу во всех. addignoreip действует только до перезапуска Fail2ban; для постоянного белого списка добавьте IP в ignoreip в jail.local и выполните reload. Если вы заблокировали себя, подключитесь из другой сети (например, через мобильный интернет), воспользуйтесь консолью в личном кабинете (если она доступна) или создайте тикет.
fail2ban-client status sshd # list banned IPs
fail2ban-client set sshd unbanip 198.51.100.20 # unban from one jail
fail2ban-client unban 198.51.100.20 # unban from all jails
fail2ban-client unban --all # clear every ban
fail2ban-client set sshd addignoreip 198.51.100.20 # whitelist until restart
# Permanent whitelist: add the IP to "ignoreip" in jail.local, then
fail2ban-client reload
tail -f /var/log/fail2ban.log # watch bans live
Типично для Debian 12 и новее, где auth.log больше не пишется. Укажите backend = systemd в секции sshd и установите python3-systemd. Точную ошибку покажет fail2ban-client -t.
Обычно banaction не соответствует используемому файрволу или port отличается от реального порта SSH. Проверьте командами из шага 3, что правила действительно созданы.
Нет. Fail2ban лишь замедляет перебор. Настоящее решение — отключить вход по паролю и использовать SSH-ключи; вместе они дают лучшую защиту.
Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, выполненные команды и полный текст ошибки, чтобы мы быстрее нашли причину.