MHOSTMHOST

Файрвол ufw: порты

ufw (Uncomplicated Firewall) — упрощённый интерфейс к штатному файрволу ядра Linux (netfilter/iptables): вместо длинных цепочек iptables вы описываете правила простыми командами вроде ufw allow 80/tcp. В этой статье вы установите и включите ufw на VPS mHost, запретите все входящие соединения по умолчанию, откроете нужные порты — SSH, HTTP/HTTPS и свой собственный — и научитесь смотреть список правил и удалять из него лишнее.

Диаграмма: входящий трафик проходит через файрвол — порты 22, 80 и 443 пропускаются на сервер, остальное блокируется

Что понадобится

  • VPS mHost на Ubuntu 22.04/24.04 или Debian 11/12 — именно в этих системах ufw является файрволом по умолчанию.
  • На AlmaLinux/Rocky Linux по умолчанию используется другой инструмент — firewalld, с другими командами; эта статья его не рассматривает.
  • Доступ по SSH под root или пользователем с правами sudo.
  • Доступ к панели VMmanager 6 — как подстраховка на случай, если вы всё же закроете себе доступ по SSH: в панели есть консоль сервера прямо из браузера, без SSH. Если ещё не заходили — начните со статьи «Как войти в VMmanager 6».
Важно: самая частая ошибка при настройке ufw — включить файрвол, забыв заранее разрешить SSH. Итог — обрыв текущей SSH-сессии и потеря удалённого доступа к серверу. Обязательно выполните шаг 3 (разрешить SSH) до шага 4 (включить ufw) — порядок шагов в этой статье выбран специально.

Шаг 1. Установите ufw

На Ubuntu ufw обычно уже установлен «из коробки» (но выключен), на Debian его нужно поставить отдельно. Команда ниже безопасна в обоих случаях — на Ubuntu она просто подтвердит, что пакет уже на месте:

bash
sudo apt update
sudo apt install -y ufw

Проверьте, что команда доступна:

bash
sudo ufw version

Команда должна вывести номер версии ufw. Если вместо этого система отвечает command not found — проверьте, что установка пакета выше отработала без ошибок.

Шаг 2. Задайте политику по умолчанию: запретите входящие

Смысл файрвола с запретом «по умолчанию» — запрещено всё, что не разрешено явно отдельным правилом. Задайте это явно:

bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
  • deny incoming — любое новое входящее соединение блокируется, если для него нет отдельного разрешающего правила.
  • allow outgoing — соединения, инициированные самим сервером наружу (обновления пакетов, запросы к внешним API и т.п.), разрешены.

Это и есть заводские настройки ufw «из коробки», но задать их явно стоит: так политика зафиксирована осознанно, а не оставлена «как получилось». Обе команды ничего не включают и не влияют на текущие соединения — правила применяются только после шага 4.

Шаг 3. Разрешите SSH — обязательно до включения файрвола

Важно: это самый важный шаг статьи. Как только вы включите ufw с политикой «запретить входящие» (шаг 4), любое соединение без явного разрешающего правила будет немедленно заблокировано — включая ваше собственное SSH-подключение. Если не разрешить SSH заранее, вы потеряете удалённый доступ к серверу сразу после команды ufw enable.

Разрешите порт SSH (по умолчанию — 22/tcp):

bash
sudo ufw allow 22/tcp
Совет: если вы уже сменили порт SSH на нестандартный (см. статью про настройку и защиту SSH), укажите здесь именно его, а не 22. Для стандартного порта тот же результат даёт команда sudo ufw allow ssh (ufw сам найдёт порт 22 по имени сервиса из /etc/services), а на Ubuntu — ещё и sudo ufw allow OpenSSH (профиль приложения, который регистрирует пакет openssh-server; на Debian такого профиля может не быть).
Если всё же потеряли доступ: отключить или поправить правило можно через консоль сервера в VMmanager 6 — она открывается прямо в браузере и не зависит от SSH. Подробнее — в статье «Как войти в VMmanager 6».

Шаг 4. Включите ufw

bash
sudo ufw enable

ufw предупредит, что операция может разорвать текущие SSH-соединения:

Command may disrupt existing ssh connections. Proceed with operation (y|n)?

Раз в шаге 3 вы уже разрешили SSH — подтвердите вводом y. Настройка сохраняется: после перезагрузки сервера ufw включится автоматически в том же состоянии, отдельно настраивать автозапуск через systemd не нужно.

Проверьте статус и, не закрывая текущую SSH-сессию, откройте новое подключение в отдельном окне терминала — закрывайте старую сессию только убедившись, что вход по SSH по-прежнему работает:

bash
sudo ufw status
Готово: статус — Status: active, новое SSH-подключение открывается без проблем — файрвол включён и не заблокировал вас самих.

Шаг 5. Откройте HTTP, HTTPS и свой порт

Разрешите стандартные веб-порты:

bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Совет: несколько портов можно разрешить одной командой через запятую: sudo ufw allow 80,443/tcp.

Чтобы открыть произвольный порт своего приложения или сервиса, укажите его номер и протокол:

bash
sudo ufw allow 8080/tcp
  • Протокол указывайте явно — /tcp или /udp. Если не указать протокол вовсе, ufw откроет порт сразу для обоих, а обычно нужен только один.
  • Открывайте порт только тогда, когда на сервере реально что-то его слушает, — иначе это просто лишняя дыра в файрволе без пользы.
Совет: чтобы разрешить порт только с конкретного IP-адреса, а не для всего интернета, добавьте from: sudo ufw allow from 203.0.113.10 to any port 8080 proto tcp.
Важно: если на этот раздел вас отправила другая инструкция mHost (для конкретного сервиса — например, веб-сервера или приложения), возвращайтесь туда и открывайте именно тот порт, который указан там.

Шаг 6. Посмотрите список правил: status numbered

Обычный ufw status показывает правила без номеров. Чтобы получить номер каждого правила — например, перед удалением, — используйте:

bash
sudo ufw status numbered

Пример вывода после шагов выше (правила автоматически продублированы для IPv6 — это поведение по умолчанию, пока в /etc/default/ufw не отключено IPV6=yes):

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 8080/tcp                   ALLOW IN    Anywhere
[ 5] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 7] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
[ 8] 8080/tcp (v6)              ALLOW IN    Anywhere (v6)

Номер в квадратных скобках — это то, что понадобится в следующем шаге.

Шаг 7. Удалите правило

Например, порт 8080 больше не нужен. Посмотрите номер правила (шаг 6) и удалите его:

bash
sudo ufw status numbered
sudo ufw delete 4

ufw сначала покажет, какое именно правило будет удалено (Deleting: allow 8080/tcp), а затем спросит подтверждения:

Proceed with operation (y|n)?

Подтвердите y.

Важно: после удаления одного правила номера всех остальных сдвигаются. Если нужно удалить несколько правил подряд, удаляйте от большего номера к меньшему и перепроверяйте ufw status numbered перед каждым следующим удалением — иначе легко удалить не то правило.
Совет: для правила, у которого есть и IPv4-, и IPv6-версия (как 8080/tcp в примере выше — номера 4 и 8), проще удалить обе версии одной командой — по содержимому правила, а не по номеру: sudo ufw delete allow 8080/tcp.

Чтобы убедиться, что правило удалено, повторите sudo ufw status numbered.

Готово: правило удалено, список правил обновился — при желании повторите для любого другого правила из списка.

Что дальше

Для более глубокой защиты SSH — смена порта, вход только по ключу — см. статью «Настройка и защита SSH». Автоматическую блокировку IP-адресов за перебор паролей добавляет fail2ban — см. «Fail2ban: защита от перебора паролей». А если нужны возможности netfilter, которых нет в упрощённом синтаксисе ufw, — базовые команды iptables разобраны в статье «Основы iptables».