UFW (Uncomplicated Firewall) это штатный инструмент настройки файрвола в Ubuntu: по документации Ubuntu Server, сразу после установки системы он выключен. В Ubuntu 26.04 в репозитории версия 0.36.2. UFW превращает простые команды вида «открыть 443» в правила netfilter, так что для типичного VPS с сайтом и SSH не нужно руками собирать цепочки iptables. Ниже безопасный порядок включения, типовые правила, логи и главная ловушка с Docker.
Установка и статус
На серверных образах Ubuntu UFW обычно уже есть. Если нет, на Debian например:
sudo apt update sudo apt install ufw sudo ufw status
Status: inactive значит, что правила не применяются. Включать файрвол до того, как разрешён SSH, нельзя: потеряете доступ к серверу.
Политика по умолчанию
Разумный старт для публичного сервера: всё входящее запретить, исходящее разрешить, а дальше открывать только нужное.
sudo ufw default deny incoming sudo ufw default allow outgoing
Сначала SSH, потом enable
Стандартный порт или свой, если вы его меняли:
sudo ufw allow OpenSSH # или, если SSH на другом порту sudo ufw allow 2222/tcp
Вместо простого allow можно поставить ограничение частоты. По man ufw правило limit отказывает адресу, который открыл 6 и больше соединений за 30 секунд. Для ручного входа по SSH это незаметно, а простому брутфорсу мешает.
sudo ufw limit OpenSSH
Теперь можно включать:
sudo ufw enable sudo ufw status verbose
UFW предупредит, что SSH-сессии могут оборваться. Если правило для вашего порта уже есть, текущая сессия обычно выживает. На проде держите под рукой консоль в панели провайдера (VNC или serial) на случай ошибки. Перед включением на чужом или важном сервере можно сначала посмотреть итоговые правила через sudo ufw --dry-run enable.
Типовые правила
Веб-сервер, HTTP и HTTPS:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp # или профиль приложения, если он есть sudo ufw app list sudo ufw allow 'Nginx Full'
Служебный порт только с доверенного адреса, подсеть VPN, блок конкретного адреса или сети:
sudo ufw allow from 192.0.2.100 to any port 8080 proto tcp sudo ufw allow from 10.8.0.0/24 to any port 5432 proto tcp sudo ufw deny from 203.0.113.0/24 sudo ufw allow 1000:2000/tcp
Правилам удобно давать комментарии (comment 'админка' в конце команды), через полгода это спасает. Правила проверяются по порядку, первое совпадение выигрывает. Номера видно в sudo ufw status numbered, лишнее удаляется через sudo ufw delete N, а запрет для адреса, который должен сработать раньше разрешений, вставляют наверх через sudo ufw insert 1 deny from ....
Логи
sudo ufw logging on sudo ufw logging medium
Записи идут в /var/log/ufw.log или в журнал systemd (journalctl -k | grep UFW). Уровни low, medium, high и full; на загруженном сервере high и full быстро раздувают логи, так что держите ротацию под контролем.
Docker обходит UFW
Главная ловушка. Как пишет документация Docker, Docker и UFW несовместимы: трафик к опубликованным портам контейнеров уходит через таблицу nat раньше, чем доходит до цепочек INPUT и OUTPUT, которыми управляет UFW. На практике это значит, что docker run -p 5432:5432 откроет базу всему интернету, даже если в UFW порт закрыт.
Самое простое решение: публиковать служебные порты только на localhost, а наружу отдавать через Nginx.
docker run -p 127.0.0.1:5432:5432 postgres # в compose ports: - "127.0.0.1:5432:5432"
Практические замечания
- Порядок: политика по умолчанию, разрешить SSH, потом
enable. - Открывайте минимум: 80 и 443 для сайта, SSH, остальное только для нужных адресов.
limitне заменяет ключи SSH и Fail2Ban, но отсекает простой перебор.- После установки Docker проверьте снаружи, какие порты реально открыты:
nmap -Pn ваш_IPс другой машины. - Если нужна тонкая политика, NAT или проброс портов, проще работать с netfilter напрямую, об этом заметка про iptables.
В итоге UFW на Ubuntu это быстрый и предсказуемый базовый файрвол: запретить входящие, разрешить SSH, 80 и 443, включить и проверить status verbose. Главное помнить про Docker: его опубликованные порты UFW не закрывает, поэтому служебные сервисы в контейнерах лучше вешать на 127.0.0.1.