Блог / Статьи

Полезная информация для вашего хостинга

Как защитить сервер Ubuntu 24.04: fail2ban, nftables и управление службами

Как защитить сервер Ubuntu 24.04: fail2ban, nftables и управление службами

В эпоху постоянных кибератак и автоматизированных сканеров уязвимостей защита сервера — не роскошь, а необходимость. Даже если вы уверены, что всё настроено «как надо», на деле уязвимые точки могут скрываться в самых неожиданных местах. В этой статье мы подробно разберём три ключевых уровня обороны сервера с Ubuntu 24.04: защита от взлома путём перебора паролей, фильтрация сетевого трафика на уровне ядра и минимизация поверхности атаки за счёт отключения ненужных служб.

Это не просто «чек-лист» — это стратегия, проверенная в реальных инфраструктурах. Если вы системный администратор, DevOps-инженер или просто владелец VPS, эта инструкция поможет вам не только укрепить безопасность, но и оптимизировать ресурсы сервера.

Почему даже SSH-ключи не делают вас неуязвимым: зачем нужен fail2ban

Многие считают: если вход по SSH защищён ключами, а пароли отключены, то угроза перебора паролей исчезает. Это опасное заблуждение. Даже если SSH недоступен по паролю, злоумышленники всё равно будут пытаться подключаться — засоряя логи, нагружая систему и иногда находя уязвимые сервисы, которые работают рядом: веб-панели (например, Webmin), почтовые серверы (Postfix, Dovecot), FTP-демоны (vsftpd) или даже ваше собственное API.

Fail2ban — это «сторожевой пёс» вашей системы. Он постоянно сканирует системные логи в поисках подозрительной активности: повторяющихся ошибок аутентификации, аномального поведения клиентов, необычных запросов. Как только количество попыток превышает заданный порог, fail2ban автоматически блокирует IP-адрес нарушителя на сетевом уровне — с помощью nftables (в Ubuntu 24.04) или iptables.

Установка и первоначальная настройка fail2ban на Ubuntu 24.04

Установка предельно проста:

sudo apt update
sudo apt install fail2ban -y

После установки сервис запускается автоматически и начинает мониторить логи, но по умолчанию он ничего не блокирует. Чтобы активировать защиту, нужно настроить так называемые jails («тюрьмы») — правила для конкретных сервисов.

Важно! Никогда не редактируйте основной файл /etc/fail2ban/jail.conf — он может быть перезаписан при обновлении пакета. Вместо этого создайте локальный конфигурационный файл:


sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Теперь редактируем jail.local:

sudo nano /etc/fail2ban/jail.local

Настройка защиты SSH

Найдите секцию [sshd] и убедитесь, что она выглядит так:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 600
findtime = 600
ignoreip = 127.0.0.1/8 ::1 YOUR_TRUSTED_IP

Разберём параметры:

  • enabled = true — активирует мониторинг SSH.
  • port = ssh — имя или номер порта. Если вы сменили SSH-порт, укажите его явно: port = 2222.
  • filter = sshd — указывает, какой шаблон (файл в /etc/fail2ban/filter.d/sshd.conf) использовать для поиска ошибок в логах.
  • logpath — путь к логу аутентификации. В Ubuntu 24.04 это /var/log/auth.log.
  • maxretry = 5 — после 5 неудачных попыток входа — бан.
  • findtime = 600 — окно времени (в секундах), в котором учитываются попытки. То есть 5 ошибок за 10 минут.
  • bantime = 600 — длительность блокировки (10 минут). Вы можете увеличить до 86400 (24 часа) или использовать -1 для вечного бана (осторожно!).
  • ignoreip — список IP-адресов, которые никогда не блокируются. Обязательно добавьте адрес своей сети или статический IP, чтобы не заблокировать себя!

После сохранения перезапустите службу:

sudo systemctl restart fail2ban

fail02

Проверка работы и мониторинг

Убедитесь, что всё работает:

sudo fail2ban-client status
sudo fail2ban-client status sshd

Вы увидите список активных jail’ов и, при наличии, заблокированные IP-адреса. Пример вывода:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     12
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     3
   `- Banned IP list:   203.0.113.45

Защита других сервисов

Fail2ban поддерживает десятки сервисов «из коробки». Чтобы защитить, например, веб-сервер Nginx от подбора паролей в админке, активируйте секцию [nginx-http-auth]:

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600

Аналогично можно настроить защиту для:

  • Postfix / Dovecot — почтовые серверы
  • Apache2 — веб-сервер
  • ProFTPD / vsftpd — FTP-серверы
  • MySQL — базы данных

Готовые фильтры находятся в /etc/fail2ban/filter.d/. Если вам нужно защитить кастомное приложение — напишите свой фильтр с регулярными выражениями под ваш лог-формат.

Гибкая и мощная альтернатива UFW: настройка nftables в Ubuntu 24.04

UFW (Uncomplicated Firewall) — отличный инструмент для базовой фильтрации. Но если вы хотите максимальный контроль над сетевым трафиком, вам нужен nftables. В Ubuntu 24.04 именно он стал стандартом замены устаревшему iptables.

Почему nftables лучше?

  • Единый фреймворк для IPv4 и IPv6.
  • Более читаемый и структурированный синтаксис.
  • Поддержка сложной логики: условия, цепочки, пользовательские таблицы.
  • Встроенные механизмы rate-limiting и защиты от DDoS.
  • Высокая производительность за счёт единой таблицы правил в ядре.

UFW работает поверх nftables, но скрывает его мощь. Если вы отключите UFW и настроите nftables вручную — вы получите полную власть над трафиком.

fail04

Создание базового правила nftables

Отредактируйте основной конфигурационный файл:

sudo nano /etc/nftables.conf

Пример безопасной конфигурации:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;

    # Разрешить loopback
    iif "lo" accept

    # Разрешить установленные и связанные соединения
    ct state established,related accept

    # Защита от спуфинга
    ip saddr { 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } drop
    ip6 saddr { ::1/128, fe80::/10 } drop

    # Разрешить ICMP (ping и другие диагностические пакеты)
    ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, time-exceeded } accept
    ip6 nexthdr icmpv6 icmpv6 type { echo-request, echo-reply, nd-neighbor-solicit, nd-neighbor-advert } accept

    # Разрешить SSH (замените 22 на ваш порт, если меняли)
    tcp dport 22 accept

    # Разрешить HTTP/HTTPS (если у вас веб-сервер)
    tcp dport { 80, 443 } accept

    # Всё остальное — блокировать
    reject with icmp type port-unreachable
  }

  chain forward {
    type filter hook forward priority 0; policy drop;
  }

  chain output {
    type filter hook output priority 0; policy accept;
  }
}

Эта конфигурация:

  • Блокирует весь входящий трафик по умолчанию.
  • Разрешает только необходимые сервисы (SSH, веб-сервер).
  • Защищает от IP-спуфинга (запрещает локальные адреса извне).
  • Разрешает ICMP для диагностики сетей.
  • Отклоняет, а не просто отбрасывает, соединения — это помогает избежать «зависаний» клиентов.

Активация nftables

Прежде чем применять правила, убедитесь, что UFW отключён, чтобы избежать конфликтов:

sudo ufw disable

Теперь включите и запустите nftables:

sudo systemctl enable nftables --now

Проверьте активные правила:

sudo nft list ruleset

Дополнительные возможности

С nftables вы можете:

  • Ограничить частоту подключений (rate-limiting):
    tcp dport 22 limit rate 3/minute accept
  • Блокировать целые страны (через GeoIP и скрипты обновления).
  • Логировать подозрительные попытки:
    ip saddr @blacklist log prefix "BLOCKED: " drop
  • Создавать временные правила для отладки без перезагрузки.

Минимизация поверхности атаки: как отключить ненужные службы в Ubuntu 24.04

Каждый запущенный процесс — это потенциальная дыра в безопасности. В стандартной установке Ubuntu 24.04 на сервере могут работать службы, которые вам абсолютно не нужны: от Bluetooth до службы печати. Они открывают порты, потребляют память и CPU, а иногда даже имеют известные уязвимости.

Правило простое: если служба не нужна — отключите её.

Шаг 1: выявите, что слушает сеть

Используйте команду:

sudo ss -tulpn

Флаги:

  • -t — TCP
  • -u — UDP
  • -l — только слушающие (listening) сокеты
  • -p — показать PID и имя процесса
  • -n — не разрешать имён (только порты и IP)

Пример вывода:

Netid State  Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp   LISTEN 0      10     0.0.0.0:631          0.0.0.0:*            users:(("cupsd",pid=1234,fd=7))
tcp   LISTEN 0      5      127.0.0.53:53        0.0.0.0:*            users:(("systemd-resolved",pid=890,fd=13))
tcp   LISTEN 0      128    0.0.0.0:22           0.0.0.0:*            users:(("sshd",pid=1122,fd=3))

Здесь видно:

  • cupsd — служба печати (порт 631). На сервере она почти всегда не нужна.
  • systemd-resolved — DNS-резолвер. Может быть нужен, но иногда его заменяют на dnsmasq или отключают вовсе.
  • sshd — SSH. Это необходимо.

Шаг 2: посмотрите все запущенные службы

systemctl list-units --type=service --state=running

Вы увидите полный список. Особенно подозрительны:

  • bluetooth.service
  • cups.service
  • avahi-daemon.service — сервис обнаружения устройств в локальной сети (mDNS)
  • ModemManager.service
  • whoopsie.service — отправка отчётов об ошибках в Canonical

Шаг 3: отключите ненужное

Для отключения с немедленной остановкой используйте:

sudo systemctl disable --now bluetooth.service
sudo systemctl disable --now cups.service
sudo systemctl disable --now avahi-daemon.service
sudo systemctl disable --now ModemManager.service
sudo systemctl disable --now whoopsie.service

Команда disable --now делает две вещи:

  • Останавливает службу сейчас (как systemctl stop).
  • Отключает автозапуск при загрузке (как systemctl disable).

Важно: не отключайте критические службы!

Ни в коем случае не трогайте:

  • sshd — иначе потеряете доступ
  • networking или systemd-networkd
  • systemd-resolved (если не знаете, как заменить DNS)
  • rsyslog или syslog-ng — логирование
  • cron или systemd-timers
  • dbus — шина системных сообщений

Если сомневаетесь — сначала остановите службу без отключения:

sudo systemctl stop suspicious-service.service

Понаблюдайте за системой. Если всё работает — отключайте навсегда.

fail05

Заключение: безопасность — это процесс, а не состояние

Настройка fail2ban, переход на nftables и отключение лишних служб — это фундамент надёжной защиты сервера на Ubuntu 24.04. Однако это лишь начало. В следующих частях нашего гида по безопасности вы узнаете:

  • Как настроить централизованное аудит-логирование с auditd.
  • Как реализовать мониторинг в реальном времени (Prometheus + Grafana + Fail2ban).
  • Как организовать автоматическое резервное копирование с шифрованием.
  • Как применять SELinux или AppArmor для изоляции процессов.

Помните: не существует «абсолютно безопасного» сервера. Но есть серверы, которые слишком дороги для атаки. Ваша задача — сделать свой сервер именно таким. И начинать нужно с базовых, но мощных шагов, описанных в этой статье.

Укрепляйте инфраструктуру, тестируйте настройки и не забывайте регулярно обновлять систему. Безопасность — это не разовая задача, а непрерывная дисциплина.