# Базовая защита VPS: ufw, fail2ban и автообновления в Ubuntu 24.04

> Как закрыть лишние порты ufw, ограничить перебор паролей fail2ban и включить автоматические обновления безопасности. Команды, примеры и ошибки, после которых теряют доступ.

- Рубрика: Гайды по играм
- Игра: VPS
- Опубликовано: 2026-11-13T16:00:00+03:00
- Обновлено: 2026-11-13T16:00:00+03:00
- Адрес: https://blog.egnetwork.ru/vps-bazovaya-zashchita
- Автор: Команда EGN

## Коротко

Базовая защита VPS состоит из трёх частей. Файрвол `ufw` закрывает все входящие порты, кроме нужных. `fail2ban` блокирует IP-адреса, которые подбирают пароль к SSH. Автоматические обновления безопасности закрывают известные уязвимости без участия человека. Минимальный набор команд: `ufw default deny incoming`, `ufw limit OpenSSH`, `ufw enable`, затем `apt install fail2ban unattended-upgrades`. Правило `limit` одновременно разрешает SSH и ограничивает частоту подключений, отдельное `allow` для SSH не нужно.

Порядок команд важен: сначала разрешите SSH, потом включайте фаервол. Иначе вы закроете доступ к собственному серверу. На VPS EGN есть и второй фаервол, внешний: вкладка «Фаервол» в карточке услуги. Про него ниже, в отдельном разделе.

## Зачем это нужно

Сразу после создания VPS в интернете начинается перебор. Боты пробуют логины root и простые пароли по всему диапазону адресов. Это не значит, что кто-то целенаправленно выбрал именно ваш сервер: сканирование идёт всем подряд. Защита нужна не от одного злоумышленника, а от автоматизированного шума.

Есть и вторая причина: каждый открытый порт — это программа, которая отвечает на запросы из сети. Чем меньше таких программ, тем меньше поверхность атаки. Если на сервере поднята только одна служба, например сайт, то закрыть всё остальное — разумный минимум.

## Шаг 1. Настраиваем ufw

`ufw` — это интерфейс к правилам фаервола Linux. Он не заменяет понимание сетей, но для одного сервера его достаточно. Сначала задайте политику по умолчанию:

```bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
```

Первая команда запрещает всё входящее, что не описано правилом. Вторая разрешает исходящий трафик, который нужен для обновлений, почты и API. Политика `deny incoming` работает только для входящих соединений, исходящие правила при этом не меняются.

Затем разрешите SSH. Профиль `OpenSSH` в Ubuntu ставится вместе с пакетом `openssh-server`, и ufw понимает его по имени. Сразу используйте `limit`, а не `allow`:

```bash
sudo ufw limit OpenSSH
```

По справке ufw, правило `limit` пропускает соединение, но запрещает адрес, который пытается открыть шесть и более соединений за 30 секунд. Это не заменяет fail2ban, но замедляет простой перебор.

Не добавляйте рядом ещё и `ufw allow OpenSSH`. ufw проверяет правила сверху вниз и применяет первое совпавшее: если `allow` стоит выше `limit`, до `limit` дело не дойдёт, и ограничение частоты работать не будет. Если вы сменили порт SSH, например на 2222, используйте `sudo ufw limit 2222/tcp` и не оставляйте открытым 22: правило должно соответствовать реальной службе.

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

```bash
sudo ufw enable
sudo ufw status verbose
```

Ufw предупредит, что команда может прервать текущие SSH-соединения. Если правило для SSH добавлено до включения, текущая сессия сохранится. Всё равно проверьте вход во втором окне терминала.

![Настройка ufw: политика и правила](https://blog.egnetwork.ru/media/602)

![Вывод ufw status verbose](https://blog.egnetwork.ru/media/603)

## Шаг 2. Открываем только нужные порты

Правила под каждую службу добавляются отдельно. Типичный набор для сайта выглядит так:

```bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
```

Для игрового сервера или бота список будет другим. Важно понимать, что каждое правило — это решение. Порт базы данных, например 3306 или 5432, открывать в интернет почти никогда не нужно: подключаться к базе можно через SSH-туннель или с localhost приложения.

Номера правил удобно смотреть командой `sudo ufw status numbered`, а удалять по номеру `sudo ufw delete 3`. Номера меняются после каждого удаления, поэтому после удаления смотрите список заново.

## Шаг 3. Ставим fail2ban

`fail2ban` читает журнал входов и временно блокирует адреса, с которых слишком много неудачных попыток. Установка стандартная:

```bash
sudo apt install fail2ban
```

Настройки по умолчанию лежат в `/etc/fail2ban/jail.conf`. В документации fail2ban прямо рекомендуют не править этот файл, а создавать `jail.local`, который переопределяет значения. Пример для SSH:

```ini
[sshd]
enabled = true
backend = systemd
maxretry = 5
bantime = 1h
```

Строка `backend = systemd` говорит fail2ban читать события из журнала systemd. На современных Ubuntu и Debian вход SSH пишется в journald, и так jail работает независимо от того, есть ли файл `/var/log/auth.log`.

В файле `jail.conf` значения по умолчанию такие: `bantime = 10m`, `findtime = 10m`, `maxretry = 5`. В нашем примере адрес блокируется на час после пяти неудачных попыток. Для большинства серверов этого достаточно. Если боты возвращаются, увеличьте `bantime` до суток, но помните, что блокировка может задеть и вас самих, если вы ошиблись паролем несколько раз подряд.

Перезапустите службу и проверьте jail:

```bash
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
```

Вывод покажет количество текущих блокировок и общее число попыток. Сразу после установки число нулевое, через несколько часов на публичном сервере обычно появляются первые адреса.

![Настройка fail2ban для sshd](https://blog.egnetwork.ru/media/604)

Если вы вошли по ключу и отключили пароль, fail2ban всё равно полезен: он защищает от попыток подобрать ключ и от шума в журнале. Но главная защита в этом случае — ключи и отсутствие входа по паролю, о котором рассказано в статье [SSH-ключи вместо пароля](https://blog.egnetwork.ru/vps-ssh-klyuchi).

## Шаг 4. Автоматические обновления безопасности

Обновления закрывают уязвимости, которые становятся публичными. Вручную следить за ними неудобно, поэтому в Ubuntu есть пакет `unattended-upgrades`:

```bash
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
```

По умолчанию Ubuntu ставит только обновления безопасности. Это разумно: обновления ядра, библиотек и приложений иногда меняют поведение, а автоматически откатывать их сложно. Конфигурация лежит в `/etc/apt/apt.conf.d/50unattended-upgrades`. Проверить, что всё работает, можно пробным запуском:

```bash
sudo unattended-upgrade --dry-run -v
```

Команда ничего не устанавливает, а показывает, что бы установила. Если список пустой, значит, обновлять пока нечего или система уже обновлена.

> [!WARNING] Автоперезагрузка — отдельное решение
> Автоматическая перезагрузка после обновления ядра по умолчанию выключена. Если вы её включаете, сервер может уйти в перезагрузку ночью посреди работы приложения. Включайте её только для сервисов, которые переживают простой.

## Примеры: типовая конфигурация для сайта

Сайт на nginx, SSH по ключам, база данных внутри сервера. Набор команд:

```bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo apt install fail2ban unattended-upgrades
```

База данных слушает только `127.0.0.1`, поэтому наружу она не открыта. Проверить это можно командой `ss -tlnp`, где адрес `127.0.0.1:3306` означает, что порт виден только изнутри сервера.

## Таблица: симптом, причина и решение

| Симптом | Причина | Решение |
|---|---|---|
| После `ufw enable` нет доступа по SSH | Не было правила для SSH | Откройте вкладку «Консоль» в карточке услуги, войдите как root и выполните `sudo ufw limit OpenSSH` |
| Сайт открывается по IP, но не по домену | Не открыт 443 или 80 | Проверьте `sudo ufw status` и добавьте правила |
| Docker-контейнер доступен из интернета, хотя порт закрыт в ufw | Docker публикует порты через собственные правила iptables | Не публикуйте порты лишнего контейнера, или привяжите их к `127.0.0.1` в `-p 127.0.0.1:8080:80` |
| fail2ban не блокирует, хотя попыток много | Служба не читает журнал SSH | Проверьте `sudo fail2ban-client status sshd` и `sudo systemctl status fail2ban` |
| Себя заблокировали в fail2ban | Несколько ошибок пароля подряд | Снимите блокировку: `sudo fail2ban-client set sshd unbanip ВАШ_IP` |
| Обновления не ставятся | Нет интернета до репозиториев или блокировка dpkg | Выполните `sudo apt update` и посмотрите ошибку |

Строка про Docker — самая важная. Docker добавляет собственные правила в iptables, которые обходят правила ufw для опубликованных портов. Это поведение задокументировано, и его часто упускают при первой настройке. Если вы поднимаете контейнеры, читайте статью [Docker на VPS: установка и первый контейнер](https://blog.egnetwork.ru/vps-docker-pervyj-kontejner): там показано, как привязать порт к localhost.

## Фаервол в кабинете EGN: вторая линия

В карточке VPS есть вкладка «Фаервол». У неё два режима. «Всё открыто» пропускает входящие подключения на любые порты, и ограничивать доступ нужно внутри системы, то есть ufw. «Свои правила» разрешает только то, что есть в списке (протокол TCP, UDP, ICMP или любой, порты вида `22` или `8000-8100`, источник в формате CIDR, например `203.0.113.0/24`), а остальное отсекается до того, как пакет дойдёт до сервера. Исходящий трафик всегда разрешён. Если в списке нет порта 22, форма предупредит, что SSH закроется, а консоль в панели продолжит работать.

Для безопасности это удобный вариант: заведите правила для 22, 80 и 443, и порты, опубликованные Docker по недосмотру, снаружи всё равно не откроются. Для SSH можно указать в источнике свой адрес или подсеть, если у вас статический IP. Но не забывайте, что при смене домашнего адреса вы сами себя отрежете, и тогда поможет «Консоль».

Отдельно про почту: порты 25, 465 и 587 для исходящей почты закрыты по умолчанию, чтобы адреса облака не попадали в спам-листы. Открыть их можно через обращение в поддержку, после проверки. Ограничение действует на уровне облака, поэтому ufw здесь ни при чём.

## Частые ошибки

**Закрыть всё и забыть про SSH.** Самая частая ошибка новичков. Перед `ufw enable` убедитесь, что правило для SSH стоит в списке (`sudo ufw show added`) и что вход работает. Если ошиблись, выручит VNC-консоль в карточке услуги.

**Открыть порт базы данных «для удобства».** Публичный порт MySQL или PostgreSQL сканируют и атакуют постоянно. Используйте SSH-туннель или подключение с localhost.

**Надеяться на один fail2ban.** Он замедляет перебор, но не заменяет ключи и закрытые порты. Комбинация всех мер работает лучше одной.

**Не проверять правила после изменений.** После каждого изменения выполняйте `sudo ufw status verbose` и смотрите, нет ли лишних портов.

## Вопросы и ответы

### Нужен ли ufw, если в облаке есть свой фаервол?

Желательно оба. Фаервол в кабинете EGN отсекает пакеты до сервера, а ufw работает внутри системы и знает о процессах и пользователях. Вторая линия обороны не лишняя, особенно если вы по ошибке открыли порт в одном из них.

### Как посмотреть, какие порты открыты наружу?

Командой `sudo ss -tlnp` на сервере. Она покажет слушающие порты и программы. Для проверки снаружи используйте сканирование с другой машины, но только на своём сервере.

### Что делать, если fail2ban заблокировал IP, с которого я работаю?

Снимите блокировку командой `sudo fail2ban-client set sshd unbanip ВАШ_IP`. Чтобы не повторять ситуацию, держите рядом ключ и не подбирайте пароль.

## Итог

Базовая защита VPS укладывается в один час работы: политика `deny incoming`, правило `ufw limit OpenSSH`, fail2ban для sshd и автоматические обновления безопасности. Главное правило — не закрывать себе доступ: проверяйте вход во втором окне до и после каждого изменения. Дальше полезно перейти к [мониторингу ресурсов VPS](https://blog.egnetwork.ru/vps-monitoring-resursov), чтобы видеть нагрузку и трафик.

Сервер под VPS за пару минут — [egnetwork.ru](https://egnetwork.ru/)

---

Материал EGN (blog.egnetwork.ru), обновлено 13 ноября 2026; при цитировании указывайте ссылку.
