Как включить ufw на VPS, не отрезав себе SSH: разрешение портов в правильном порядке, проверка правил, доступ по IP, удаление правил, частые ошибки.

ufw (Uncomplicated Firewall) - надстройка над встроенным сетевым экраном Linux, которая позволяет управлять правилами короткими понятными командами. На свежем VPS фаервол обычно выключен: наружу открыты все порты, где что-то слушает. В инструкции - как включить ufw так, чтобы снаружи были доступны только нужные порты, и при этом не отрезать себе доступ по SSH.

Коротко. Порядок такой: сначала ufw allow OpenSSH, потом остальные нужные порты, и только потом ufw enable. Если включить фаервол, не разрешив SSH, вы потеряете доступ к серверу. Проверка правил - ufw status verbose. По умолчанию ufw блокирует все входящие соединения и разрешает все исходящие.

Что делает ufw

Без фаервола любая служба, которая слушает сетевой порт, доступна из интернета. Часто это лишнее: база данных, панель, отладочный веб-сервер должны быть видны только вам или только локально. ufw закрывает всё входящее по умолчанию и открывает точечно - порт за портом, при желании только для конкретных адресов.

Исходящие соединения ufw не трогает: сервер может ходить в интернет за обновлениями и на внешние API.

Что потребуется

  • Ubuntu или Debian с доступом root (или пользователь с sudo). В командах ниже sudo опущен - добавьте, если работаете не под root. На Ubuntu ufw уже установлен; на Debian при необходимости - apt install ufw.
  • Список портов, которые должны быть открыты. Как минимум - SSH (22). Плюс те, что реально нужны снаружи: 80 и 443 для сайта, другие - по задаче.
  • Доступ к серверу на случай ошибки. Если случайно закроете SSH, понадобится веб-консоль или режим восстановления от провайдера.

Шаг 1. Проверьте текущее состояние

ufw status

На свежем сервере выведет Status: inactive - фаервол выключен, правил нет.

Шаг 2. Разрешите SSH - обязательно до включения

Это самый важный шаг. Если включить ufw без правила для SSH, текущее соединение оборвётся и зайти снова не получится.

ufw allow OpenSSH

OpenSSH - готовый профиль приложения, он открывает порт 22/tcp. Если SSH у вас на нестандартном порту, указывайте номер: ufw allow 2222/tcp.

Шаг 3. Разрешите остальные нужные порты

ufw allow 80/tcp
ufw allow 443/tcp

Формат: ufw allow <порт>/<протокол>. Протокол (tcp или udp) лучше указывать явно - иначе откроется и tcp, и udp. Диапазон портов: ufw allow 60000:61000/udp. Список профилей приложений, которые знает ufw: ufw app list.

Шаг 4. Включите фаервол

ufw enable

ufw переспросит, не разорвёт ли это текущее SSH-соединение. Если шаг 2 сделан - можно смело отвечать y. Фаервол включится сразу и будет подниматься при загрузке сервера.

Шаг 5. Проверьте правила

ufw status verbose

Покажет статус, политику по умолчанию (deny (incoming), allow (outgoing)) и список открытых портов - для IPv4 и IPv6.

Правила с номерами (номера нужны для удаления):

ufw status numbered

Открыть порт только для одного адреса

Базы данных, панели, вспомогательные сервисы не стоит открывать всему интернету. Разрешите доступ только со своего IP:

ufw allow from 203.0.113.10 to any port 5432 proto tcp

Теперь порт 5432 доступен только с адреса 203.0.113.10, для остальных он закрыт. Так же можно разрешить доступ целой подсети: from 203.0.113.0/24.

Удаление правил

По номеру из ufw status numbered (номера меняются после каждого удаления, сверяйтесь заново):

ufw delete 4

Или тем же описанием, которым правило добавляли:

ufw delete allow 80/tcp

Полезные команды

  • ufw disable - выключить фаервол (правила сохранятся, применятся при следующем enable).
  • ufw reset - удалить все правила и вернуться к состоянию по умолчанию.
  • ufw default deny incoming / ufw default allow outgoing - политика по умолчанию (обычно уже такая).
  • ufw logging on - включить запись заблокированных пакетов в /var/log/ufw.log.
  • ufw allow proto tcp from any to any port 80,443 - несколько портов одним правилом.

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

  • Потерян доступ по SSH после ufw enable. Не было правила для SSH. Зайдите через веб-консоль или режим восстановления провайдера, выполните ufw allow OpenSSH (или ufw disable), проверьте и включите заново.
  • Правило добавили, а порт всё равно закрыт. Проверьте ufw status - возможно, забыли enable, или служба слушает только 127.0.0.1 (тогда дело не в фаерволе, а в настройке самой службы).
  • Открыли 80, а не 80/tcp. Без протокола ufw открывает и tcp, и udp - лишнее. Указывайте протокол.
  • Правила для IPv4 есть, для IPv6 нет. ufw по умолчанию создаёт правила для обоих стеков; если IPv6-строк нет, проверьте IPV6=yes в /etc/default/ufw.
  • Docker «пробивает» ufw. Docker пишет свои правила в iptables мимо ufw, и опубликованные контейнерные порты открыты, даже если ufw их не разрешал. Публикуйте порты как 127.0.0.1:8080:80 или используйте отдельную настройку для связки Docker + ufw.

Что дальше