До основного вмісту

UFW Firewall на VPS: налаштування брандмауера Ubuntu

Безпека · 19.04.2026 · 6 хв читання
Ілюстрація до статті «UFW Firewall на VPS: налаштування брандмауера Ubuntu»

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 за аналізом логів, а не за статичним правилом.

Перевірка результату

Після налаштування переконайтеся, що відкрито рівно те, що потрібно, і нічого зайвого:

  1. Перевірте список правил із номерами: ufw status numbered — кожне правило має бути пояснюваним, зайві видаляються командою ufw delete НОМЕР.
  2. Звірте фактично слухані порти: ss -tulpn — порт може слухатися, але бути закритим у UFW, і навпаки, відкритим у UFW, але сервіс на ньому не запущено.
  3. Перевірте доступ ззовні, не розриваючи поточну SSH-сесію: відкрийте другу сесію або скористайтеся nc -zv your-server-ip 443 з іншої машини.
  4. Перегляньте журнал блокувань: tail -f /var/log/ufw.log покаже пакети, які UFW реально відкинув, — корисно, якщо щось «не працює», а причина у файрволі.

Якщо після перевірки потрібне тонше налаштування самого SSH-доступу — наприклад, зміна порту і вимкнення входу за паролем, — це описано в статті про посилення захисту sshd_config.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці