Базовая защита VPS: ufw, fail2ban и автообновления в Ubuntu 24.04
Как закрыть лишние порты ufw, ограничить перебор паролей fail2ban и включить автоматические обновления безопасности. Команды, примеры и ошибки, после которых теряют доступ.
Содержание 15
- Коротко
- Зачем это нужно
- Шаг 1. Настраиваем ufw
- Шаг 2. Открываем только нужные порты
- Шаг 3. Ставим fail2ban
- Шаг 4. Автоматические обновления безопасности
- Примеры: типовая конфигурация для сайта
- Таблица: симптом, причина и решение
- Фаервол в кабинете EGN: вторая линия
- Частые ошибки
- Вопросы и ответы
- Нужен ли ufw, если в облаке есть свой фаервол?
- Как посмотреть, какие порты открыты наружу?
- Что делать, если fail2ban заблокировал IP, с которого я работаю?
- Итог
Коротко
Базовая защита 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. Он не заменяет понимание сетей, но для одного сервера его достаточно. Сначала задайте политику по умолчанию:
sudo ufw default deny incoming
sudo ufw default allow outgoingПервая команда запрещает всё входящее, что не описано правилом. Вторая разрешает исходящий трафик, который нужен для обновлений, почты и API. Политика deny incoming работает только для входящих соединений, исходящие правила при этом не меняются.
Затем разрешите SSH. Профиль OpenSSH в Ubuntu ставится вместе с пакетом openssh-server, и ufw понимает его по имени. Сразу используйте limit, а не allow:
sudo ufw limit OpenSSHПо справке ufw, правило limit пропускает соединение, но запрещает адрес, который пытается открыть шесть и более соединений за 30 секунд. Это не заменяет fail2ban, но замедляет простой перебор.
Не добавляйте рядом ещё и ufw allow OpenSSH. ufw проверяет правила сверху вниз и применяет первое совпавшее: если allow стоит выше limit, до limit дело не дойдёт, и ограничение частоты работать не будет. Если вы сменили порт SSH, например на 2222, используйте sudo ufw limit 2222/tcp и не оставляйте открытым 22: правило должно соответствовать реальной службе.
Теперь включите фаервол и проверьте статус:
sudo ufw enable
sudo ufw status verboseUfw предупредит, что команда может прервать текущие SSH-соединения. Если правило для SSH добавлено до включения, текущая сессия сохранится. Всё равно проверьте вход во втором окне терминала.
Шаг 2. Открываем только нужные порты
Правила под каждую службу добавляются отдельно. Типичный набор для сайта выглядит так:
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 читает журнал входов и временно блокирует адреса, с которых слишком много неудачных попыток. Установка стандартная:
sudo apt install fail2banНастройки по умолчанию лежат в /etc/fail2ban/jail.conf. В документации fail2ban прямо рекомендуют не править этот файл, а создавать jail.local, который переопределяет значения. Пример для SSH:
[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:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshdВывод покажет количество текущих блокировок и общее число попыток. Сразу после установки число нулевое, через несколько часов на публичном сервере обычно появляются первые адреса.
Если вы вошли по ключу и отключили пароль, fail2ban всё равно полезен: он защищает от попыток подобрать ключ и от шума в журнале. Но главная защита в этом случае — ключи и отсутствие входа по паролю, о котором рассказано в статье SSH-ключи вместо пароля.
Шаг 4. Автоматические обновления безопасности
Обновления закрывают уязвимости, которые становятся публичными. Вручную следить за ними неудобно, поэтому в Ubuntu есть пакет unattended-upgrades:
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgradesПо умолчанию Ubuntu ставит только обновления безопасности. Это разумно: обновления ядра, библиотек и приложений иногда меняют поведение, а автоматически откатывать их сложно. Конфигурация лежит в /etc/apt/apt.conf.d/50unattended-upgrades. Проверить, что всё работает, можно пробным запуском:
sudo unattended-upgrade --dry-run -vКоманда ничего не устанавливает, а показывает, что бы установила. Если список пустой, значит, обновлять пока нечего или система уже обновлена.
Автоперезагрузка — отдельное решениеАвтоматическая перезагрузка после обновления ядра по умолчанию выключена. Если вы её включаете, сервер может уйти в перезагрузку ночью посреди работы приложения. Включайте её только для сервисов, которые переживают простой.
Примеры: типовая конфигурация для сайта
Сайт на nginx, SSH по ключам, база данных внутри сервера. Набор команд:
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: установка и первый контейнер: там показано, как привязать порт к 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, чтобы видеть нагрузку и трафик.
Сервер под VPS за пару минут — egnetwork.ru
Читать далее
Вся рубрика →IPv6 на VPS: как пользоваться префиксом /64
Что значит /64, как проверить адрес на сервере, назначить дополнительные адреса, настроить ufw для IPv6 и не выпасть из сети. Примеры команд и типичные ошибки.
Мониторинг ресурсов VPS: htop, iotop и vnstat
Как за несколько минут понять, что тормозит VPS: процессор, память, диск или сеть. Команды htop, iotop, vnstat, free и df с примерами вывода и таблицей симптомов.
Трафик VPS: как посчитать объём и не получить сюрприз в конце месяца
Что считается трафиком, как перевести скорость канала в терабайты за месяц, как читать счётчик входящего и исходящего трафика в кабинете EGN и что делать, если лимит закончился.