UFW на Ubuntu: базовый файрвол для VPS и ловушка с Docker

UFW на Ubuntu: базовый файрвол для VPS и ловушка с Docker

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.

Источники и ссылки


Комментарии загружаются…