ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Linux-сервер

Fail2ban: установка и настройка защиты SSH и сайтов на Nginx (Debian, Ubuntu, Rocky Linux)

6 шагов 15 мин чтения 2 просмотров 0
Содержание

Как только у сервера появляется публичный IP, боты в течение нескольких минут начинают подбирать пароль SSH, а сайты сканируют в поисках админок и заваливают запросами. Fail2ban анализирует логи и автоматически блокирует через файрвол IP, который слишком часто ошибается или шлёт слишком много запросов. В статье: установка Fail2ban на Debian/Ubuntu и Rocky Linux/AlmaLinux, файл jail.local, jail sshd против перебора паролей SSH, защита сайтов jail-ами nginx-limit-req и nginx-http-auth, связка с ufw/firewalld, разбан и белый список.

Перед началом добавьте свой публичный IP в белый список (ignoreip в шаге 2) и держите открытой одну SSH-сессию, чтобы не заблокировать себя во время проверки.

Шаг 1: Установка Fail2ban

На 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

Шаг 2: jail.local и защита SSH от перебора паролей

Не редактируйте 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

Шаг 3: banaction для ufw или firewalld

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

Шаг 4: Ограничение частоты и авторизация в Nginx

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

Шаг 5: Включение jail-ов nginx-limit-req и nginx-http-auth

Удобно вынести 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
Если сайт работает через CDN, в логах Nginx будут адреса узлов CDN, и их блокировка отрежет множество реальных посетителей. Сначала восстановите настоящий IP через real_ip (см. статью про обратный прокси Nginx) или ограничивайте частоту на стороне CDN.

Шаг 6: Разбан IP и белый список

Разблокировать можно в одном 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

Частые вопросы

Fail2ban не запускается и пишет, что нет файла лога?

Типично для Debian 12 и новее, где auth.log больше не пишется. Укажите backend = systemd в секции sshd и установите python3-systemd. Точную ошибку покажет fail2ban-client -t.

В статусе есть баны, но IP всё равно подключается?

Обычно banaction не соответствует используемому файрволу или port отличается от реального порта SSH. Проверьте командами из шага 3, что правила действительно созданы.

Может ли Fail2ban заменить вход по ключу?

Нет. Fail2ban лишь замедляет перебор. Настоящее решение — отключить вход по паролю и использовать SSH-ключи; вместе они дают лучшую защиту.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, выполненные команды и полный текст ошибки, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства