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.