UFW (Uncomplicated Firewall) — надстройка над iptables/nftables для Ubuntu и Debian, которая убирает из настройки файрвола длинные цепочки правил и оставляет короткие команды вида ufw allow 22. На VDS это первый слой защиты: без него любой порт, на котором слушает сервис, доступен из интернета.
Настройка UFW на Ubuntu
Базовая политика: закрыть всё входящее, разрешить всё исходящее, затем точечно открыть нужные порты.
# Запретить всё входящее по умолчанию
ufw default deny incoming
ufw default allow outgoing
# Разрешить SSH — обязательно ДО enable, иначе потеряете доступ
ufw allow 22/tcp
# Разрешить HTTP и HTTPS
ufw allow 80/tcp
ufw allow 443/tcp
# Включить файрвол
ufw enable
# Проверить статус
ufw status verbose
Как читать вывод ufw status verbose
После включения команда показывает политику по умолчанию и список правил с направлением и источником:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
Строки с пометкой (v6) — те же правила для IPv6. Если сервер работает только по IPv4, а IPv6 на нём отключён, эти строки можно игнорировать: они ничего не открывают, если IPv6-стек не слушает.
Открытие дополнительных портов
Каждый сервис за фактическим портом нужно открывать отдельно — UFW не знает про приложения, только про порты и протоколы.
# MySQL — только с локального хоста, наружу не открывать
ufw allow from 127.0.0.1 to any port 3306
# Кастомный порт приложения (например, Node.js на 8080)
ufw allow 8080/tcp
# Диапазон портов, например для пассивного FTP
ufw allow 30000:31000/tcp
# Удалить ранее добавленное правило
ufw delete allow 8080/tcp
Ограничение доступа по IP и подсети
Если админка или база данных должны быть доступны только с рабочего IP, правило по адресу надёжнее, чем полагаться на пароль:
# Разрешить SSH только с одного адреса
ufw allow from 203.0.113.10 to any port 22 proto tcp
# Разрешить подсеть офиса на порт панели управления
ufw allow from 203.0.113.0/24 to any port 8443 proto tcp
# Явный запрет конкретного адреса (например, после атаки в логах)
ufw deny from 198.51.100.5
Здесь proto tcp ограничивает правило одним протоколом, to any port — портом назначения, а адрес перед to — источником пакета. Правила проверяются по порядку добавления, первое совпадение побеждает, поэтому более узкое правило по IP стоит добавлять раньше общего allow 22.
Сравнение способов ограничить сетевой доступ
| Способ | Что фильтрует | Сложность настройки | Когда применять |
|---|---|---|---|
| UFW | Порты, протоколы, IP-адреса | Низкая, командная обёртка | Один VDS, типовые сервисы |
| iptables напрямую | Полный набор правил ядра, NAT, mangle | Высокая, синтаксис цепочек | Нестандартная маршрутизация, legacy-скрипты |
| nftables | То же, что iptables, но один синтаксис для v4/v6 | Средняя | Свежие дистрибутивы, где iptables — это уже обёртка над nft |
| Security Group у провайдера | Порты и IP до того, как пакет дошёл до VDS | Низкая, через панель | Дополнительный слой поверх UFW, не замена |
На большинстве Ubuntu 22.04+ и Debian 11+ UFW уже работает поверх nftables, а не iptables-legacy — это не меняет команды, но объясняет, почему вывод iptables -L на таких системах может выглядеть иначе, чем ожидается. Подробнее в статье про переход с iptables на nftables.
Разбор типичных ошибок UFW
Ошибка ERROR: Could not delete non-existent rule — появляется, когда команда ufw delete не совпадает по формату с тем, как правило было добавлено. Если порт открывали как ufw allow 8080, а удаляют как ufw delete allow 8080/tcp, UFW не находит точного совпадения. Смотрите точную запись правила в ufw status numbered и удаляйте по номеру: ufw delete 3.
Потеря SSH-доступа сразу после ufw enable — самая частая авария. Если политика default deny incoming включена раньше, чем добавлено правило на порт SSH, соединение просто перестаёт отвечать: клиент получит ssh: connect to host ... port 22: Connection timed out. Восстановить доступ можно только через консоль VDS в панели управления, где ufw уже не мешает, — оттуда выполняется ufw allow 22/tcp.
Ошибка ERROR: problem running ufw-init при включении на части минимальных VDS-образов связана с отсутствующим модулем ip6tables в ядре контейнерной виртуализации. Решение — отключить обработку IPv6 в самом UFW, не трогая ядро: в файле /etc/default/ufw установить IPV6=no и выполнить ufw disable && ufw enable.
Когда UFW не подходит
- Docker и подобные системы контейнеризации прописывают собственные цепочки iptables напрямую и могут пробрасывать порты контейнеров в обход правил UFW — опубликованный
-p 8080:8080порт иногда остаётся доступным даже приufw deny 8080. - UFW не различает трафик по содержимому запроса (уровень L7): фильтрация по URL, User-Agent или SQL-инъекциям в него не входит — для этого нужен модуль уровня приложения или WAF.
- При множестве сложных правил с NAT, проброс портов между интерфейсами или policy routing проще писать сразу на nftables, чем городить это через синтаксис UFW.
- Для защиты веб-приложения от перебора и ботов UFW не заменяет отдельный сервис — этим занимается Fail2Ban, который блокирует IP по анализу логов, а не по статическому правилу.
Проверка результата
После настройки убедитесь, что открыто ровно то, что нужно, и ничего лишнего:
- Проверьте список правил с номерами:
ufw status numbered— каждое правило должно быть объяснимо, лишние удаляются командойufw delete НОМЕР. - Сверьте фактически слушающие порты:
ss -tulpn— порт может слушаться, но быть закрыт UFW, и наоборот, открыт в UFW, но сервис на нём не запущен. - Проверьте доступ снаружи, не разрывая текущую SSH-сессию: откройте вторую сессию или используйте
nc -zv your-server-ip 443с другой машины. - Просмотрите журнал блокировок:
tail -f /var/log/ufw.logпокажет пакеты, которые UFW реально отбросил, — полезно, если что-то «не работает», а причина в файрволе.
Если после проверки нужна более тонкая настройка самого SSH-доступа — например, смена порта и отключение входа по паролю, — это описано в статье про усиление защиты sshd_config.