Заощадьте 15% на всіх хостингових послугах

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код: Skills Почати
Рубрики
Linux Безпека

Як налаштувати брандмауер за допомогою Firewalld на Linux (Повний посібник)

Захист вашого Linux сервера від несанціонованого доступу та шкідливого трафіку — це не опціонально, це фундаментальна відповідальність будь-якого системного адміністратора. Незалежно від того, чи ви запускаєте особистий проект, бізнес-додаток або виробничий веб-сервер, правильно налаштований брандмауер — це ваша перша та найбільш критична лінія захисту. Firewalld — один з найпотужніших та найгнучкіших інструментів управління брандмауером, доступних на Linux, що пропонує динамічне управління правилами, контроль трафіку на основі зон та багату підтримку правил — все без необхідності повного перезапуску служби при застосуванні змін.

Цей комплексний посібник проведе вас через все, що вам потрібно знати: встановлення Firewalld, розуміння зон, управління сервісами та портами, написання розширених правил та моніторинг вашого брандмауера в реальному часі. Якщо ви розміщуєте на VPS або Dedicated Server від AlexHost, цей посібник допоможе вам захистити ваше середовище та підтримувати сильну, адаптивну позицію безпеки.

Що таке Firewalld і чому його варто використовувати?

Firewalld — це демон динамічного управління брандмауером, доступний у більшості основних дистрибутивів Linux, включаючи CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux, а також все частіше на Debian та Ubuntu. На відміну від старішого підходу iptables — де кожна зміна правила вимагала очищення та перезавантаження всього набору правил — Firewalld застосовує зміни динамічно під час виконання без переривання активних з’єднань.

Ключові переваги Firewalld

  • Архітектура на основі зон — призначення різних рівнів довіри різним мережевим інтерфейсам або діапазонам IP
  • Динамічні оновлення правил — застосування змін без перезавантаження брандмауера або розривання існуючих з’єднань
  • Абстракція служб — управління трафіком за назвою служби (наприклад, http, ssh) замість номерів портів
  • Багаті правила — написання складних умовних правил, спрямованих на конкретні IP-адреси, протоколи та дії
  • Інтеграція D-Bus — дозволяє іншим додаткам і службам взаємодіяти з брандмауером програмно
  • Підтримка IPv4 та IPv6 — управління обома сімействами протоколів з одного інтерфейсу

Передумови

Перед тим як продовжити, переконайтеся, що у вас є:

  • Linux сервер, що працює на CentOS 7/8/9, RHEL, Fedora, Rocky Linux, AlmaLinux, Debian або Ubuntu
  • Root або sudo доступ до сервера
  • Базове розуміння команд терміналу Linux
  • Активна SSH сесія (тримайте її відкритою протягом усього часу — ви будете змінювати правила брандмауера)

> Критичне попередження: Завжди переконайтеся, що SSH (порт 22 за замовчуванням) явно дозволено у правилах брандмауера перед увімкненням Firewalld. Заблокування себе на віддаленому сервері — це поширена та уникнена помилка.

Крок 1: Встановлення Firewalld

Firewalld включений у стандартні репозиторії більшості основних дистрибутивів Linux. Використовуйте відповідний менеджер пакетів для вашої системи.

На CentOS / RHEL / Rocky Linux / AlmaLinux

sudo yum install firewalld -y

Або на новіших версіях з використанням DNF:

sudo dnf install firewalld -y

На Fedora

sudo dnf install firewalld -y

На Debian / Ubuntu

Хоча Firewalld найчастіше асоціюється з системами на основі RHEL, він повністю підтримується на дистрибутивах на основі Debian:

sudo apt update
sudo apt install firewalld -y

> Примітка для користувачів Ubuntu/Debian: Якщо ufw наразі активний у вашій системі, вимкніть його перед увімкненням Firewalld, щоб уникнути конфліктів:

> “`bash

> sudo ufw disable

> “`

Крок 2: Запуск та включення Firewalld

Після встановлення запустіть сервіс Firewalld та налаштуйте його для автоматичного запуску при завантаженні системи:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Перевірте, що сервіс працює правильно:

sudo systemctl status firewalld

Ви повинні побачити вихід, подібний до:

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since ...

Якщо статус показує active (running), Firewalld працює та готовий до налаштування.

Крок 3: Розуміння зон Firewalld

Модель на основі зон є основою архітектури Firewalld. Зона визначає рівень довіри для мережевого з’єднання або інтерфейсу. Кожна зона містить свій набір правил, які визначають, який трафік дозволено або заборонено.

Вбудовані зони Firewalld

ЗонаРівень довіриТиповий випадок використання
dropНайнижчийУсі вхідні з’єднання відкидаються без відповіді
blockДуже низькийВхідні з’єднання відхиляються з повідомленням ICMP
public

НизькийЗона за замовчуванням для недовірених публічних мереж
externalНизькийДля зовнішніх інтерфейсів з маскуванням NAT
dmzСереднійСервери, доступні ззовні, але ізольовані всередину
workСередньо-високийРобочі мережі з помірною довірою
homeВисокийДомашні мережі, де інші хости є надійними
internalВисокийВнутрішні мережі, подібні до домашніх
trustedНайвищийУсі з’єднання приймаються

Перевірте поточну зону за замовчуванням

sudo firewall-cmd --get-default-zone

Перелічіть усі доступні зони

sudo firewall-cmd --get-zones

Переглядайте активні зони та їх інтерфейси

sudo firewall-cmd --get-active-zones

Приклад виводу:

public
  interfaces: eth0

Крок 4: Зміна зони за замовчуванням

Приклад 1 — Встановлення зони за замовчуванням на public (Рекомендується для VPS/Dedicated Servers)

Для більшості серверів, доступних в Інтернеті, public є відповідною зоною за замовчуванням. Вона застосовує консервативний рівень довіри та дозволяє лише явно дозволений трафік:

sudo firewall-cmd --set-default-zone=public

Перевірте зміну:

sudo firewall-cmd --get-default-zone

Очікуваний результат:

public

Приклад 2 — Встановлення зони за замовчуванням на home

Якщо ваш сервер працює в надійній приватній мережі (наприклад, домашня лабораторія або внутрішнє середовище розробки), зона home дозволяє більш дозволяючу комунікацію між надійними хостами:

sudo firewall-cmd --set-default-zone=home

Перевірте:

sudo firewall-cmd --get-default-zone

Очікуваний результат:

home

Приклад 3 — Встановлення зони за замовчуванням на work

Для серверів у корпоративній або робочій мережі, де доцільна помірна довіра:

sudo firewall-cmd --set-default-zone=work

Перевірте:

sudo firewall-cmd --get-default-zone

Очікуваний результат:

work

Крок 5: Управління сервісами за допомогою Firewalld

Firewalld включає бібліотеку попередньо визначених означень сервісів, які зіставляють назви сервісів з відповідними портами та протоколами. Це значно полегшує управління правилами за намірами, а не за номерами портів.

Список усіх попередньо визначених сервісів

sudo firewall-cmd --get-services

Дозволити сервіс у зоні

Щоб дозволити трафік HTTP (порт 80/TCP) у зоні public постійно:

sudo firewall-cmd --zone=public --add-service=http --permanent

Щоб дозволити трафік HTTPS (порт 443/TCP):

sudo firewall-cmd --zone=public --add-service=https --permanent

Щоб дозволити SSH (порт 22/TCP) — завжди переконайтеся, що це дозволено перед внесенням інших змін:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

Застосувати зміни шляхом перезавантаження Firewalld

Прапор --permanent записує правило в постійну конфігурацію, але не застосовує його негайно до запущеного брандмауера. Завжди перезавантажуйте після внесення постійних змін:

sudo firewall-cmd --reload

Перевірити сервіси в зоні

sudo firewall-cmd --zone=public --list-services

Приклад результату:

dhcpv6-client http https ssh

Видалити сервіс із зони

Щоб видалити HTTPS із зони public:

sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reload

Крок 6: Прямне керування портами

У випадках, коли служба не має попередньо визначеного визначення Firewalld, ви можете відкривати або закривати конкретні порти безпосередньо.

Відкриття конкретного порту

Щоб відкрити порт 8080 через TCP у зоні public:

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

Щоб відкрити UDP порт (наприклад, порт 53 для DNS):

sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reload

Щоб відкрити діапазон портів (наприклад, 6000–6100 TCP):

sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reload

Закриття конкретного порту

Щоб закрити порт 8080:

sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

Список усіх відкритих портів у зоні

sudo firewall-cmd --zone=public --list-ports

Step 7: Advanced Configuration with Rich Rules

Rich rules дають вам детальний, умовний контроль над трафіком — набагато більше, ніж дозволяють прості правила сервісу або портів. Вони підтримують фільтрацію за IP-адресою джерела, IP-адресою призначення, протоколом, портом та дією (accept, reject, drop, log).

Синтаксис Rich Rule

rule [family="<ipv4|ipv6>"]
     [source address="<IP/CIDR>"]
     [destination address="<IP/CIDR>"]
     [service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
     [log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
     [accept|reject|drop]

Приклад 1 — Дозволити SSH тільки з конкретної IP-адреси

Це одна з найважливіших конфігурацій безпеки для будь-якого віддаленого сервера. Якщо ви керуєте своїм сервером з фіксованої IP-адреси, обмежте доступ SSH виключно цією IP-адресою:

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reload

Приклад 2 — Заблокувати весь трафік з конкретної IP-адреси

Щоб повністю заблокувати IP-адресу, яка генерує шкідливий трафік:

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reload

Приклад 3 — Дозволити HTTP з конкретної підмережі

Щоб дозволити трафік HTTP тільки з надійної внутрішньої підмережі (наприклад, 192.168.1.0/24):

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reload

Приклад 4 — Обмежити швидкість SSH-з’єднань для запобігання brute force

Логуйте та обмежуйте спроби SSH-з’єднання, щоб зменшити вразливість до brute-force атак:

sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reload

Приклад 5 — Дозволити конкретний порт з конкретної IP-адреси

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reload

Список всіх Rich Rules у зоні

sudo firewall-cmd --zone=public --list-rich-rules

Видалити Rich Rule

sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reload

Крок 8: Моніторинг та аудит вашого брандмауера

Регулярний перегляд конфігурації брандмауера є важливим для підтримання надійної позиції безпеки. Firewalld надає кілька команд для перевірки поточного стану ваших правил.

Переглянути повну конфігурацію для зони за замовчуванням

sudo firewall-cmd --list-all

Приклад виходу:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 8080/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
    rule family="ipv4" source address="203.0.113.50" service name="ssh" accept

Переглянути конфігурацію для всіх зон

sudo firewall-cmd --list-all-zones

Переглянути конфігурацію для конкретної зони

sudo firewall-cmd --zone=dmz --list-all

Перевірити, чи дозволена конкретна служба

sudo firewall-cmd --zone=public --query-service=http

Перевірити, чи відкритий конкретний порт

sudo firewall-cmd --zone=public --query-port=8080/tcp

Крок 9: Runtime vs. Permanent Rules — розуміння різниці

Firewalld працює з двома окремими шарами конфігурації:

ШарПрапорПостійністьВипадок використання
Runtime*(без прапора)*Втрачається при перезавантаженні/перезавантаженніТимчасове тестування правил
Permanent--permanentЗберігається при перезавантаженні та перезавантаженніВиробничі конфігурації

Найкращий практичний робочий процес

  1. Спочатку протестуйте правило під час виконання (без --permanent), щоб переконатися, що воно працює як очікується
  2. Додайте правило постійно після підтвердження
  3. Перезавантажте Firewalld, щоб синхронізувати конфігурації runtime та permanent
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http

# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent

# Step 3: Reload to sync
sudo firewall-cmd --reload

Крім того, застосуйте постійне правило та негайно перезавантажте в одному робочому процесі:

sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reload

Крок 10: Призначення мережевих інтерфейсів зонам

Якщо ваш сервер має кілька мережевих інтерфейсів (звичайно на Виділених серверах з публічними та приватними NIC), ви можете призначити кожен інтерфейс до іншої зони з різними рівнями довіри.

Призначення інтерфейсу до зони

sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reload

Зміна зони інтерфейсу

sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reload

Видалення інтерфейсу з зони

sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reload

Крок 11: Включення IP Masquerading та Port Forwarding

Для серверів, які діють як шлюзи або запускають NAT (Network Address Translation), Firewalld підтримує masquerading та port forwarding нативно.

Включення Masquerading (NAT)

sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reload

Перенаправлення порту (наприклад, перенаправлення зовнішнього порту 80 на внутрішній порт 8080)

sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload

Перенаправлення трафіку на інший хост

sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reload

Практичні конфігурації безпеки для серверів AlexHost

Якщо ви запускаєте веб-сервер, сервер баз даних або сервер додатків на інфраструктурі AlexHost, ось рекомендовані базові конфігурації Firewalld:

Базова конфігурація веб-сервера

# Allow SSH (restrict to your IP in production)
sudo firewall-cmd --zone=public --add-service=ssh --permanent

# Allow HTTP and HTTPS
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent

# Reload to apply
sudo firewall-cmd --reload

# Verify
sudo firewall-cmd --list-all

> Корисна порада: Поєднайте конфігурацію брандмауера з дійсним SSL-сертифікатом, щоб забезпечити наскрізне шифрування всього веб-трафіку. AlexHost пропонує SSL-сертифікати для всіх хостинг-середовищ.

Базова конфігурація сервера баз даних (MySQL/MariaDB)

# Allow MySQL only from a specific application server IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent

# Block direct MySQL access from the public internet
sudo firewall-cmd --zone=public --remove-service=mysql --permanent 2>/dev/null

sudo firewall-cmd --reload

Базова конфігурація сервера cPanel/WHM

Якщо ви використовуєте VPS з cPanel, вам потрібно буде відкрити порти, необхідні для cPanel та WHM:

# Web traffic
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent

# cPanel/WHM ports
sudo firewall-cmd --zone=public --add-port=2082/tcp --permanent   # cPanel HTTP
sudo firewall-cmd --zone=public --add-port=2083/tcp --permanent   # cPanel HTTPS
sudo firewall-cmd --zone=public --add-port=2086/tcp --permanent   # WHM HTTP
sudo firewall-cmd --zone=public --add-port=2087/tcp --permanent   # WHM HTTPS
sudo firewall-cmd --zone=public --add-port=2095/tcp --permanent   # Webmail HTTP
sudo firewall-cmd --zone=public --add-port=2096/tcp --permanent   # Webmail HTTPS

# Mail ports
sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent

sudo firewall-cmd --reload

Усунення типових проблем Firewalld

Проблема 1: Firewalld не запускається

Перевірте конфлікти з іншими інструментами брандмауера:

sudo systemctl status iptables
sudo systemctl stop iptables
sudo systemctl disable iptables
sudo systemctl start firewalld

Проблема 2: Правила не зберігаються після перезавантаження

Переконайтеся, що ви використали прапор --permanent та перезавантажили:

sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reload

Команда --runtime-to-permanent зберігає всі поточні правила часу виконання в постійну конфігурацію.

Проблема 3: Блокування доступу SSH

Якщо ви випадково заблокували доступ SSH, вам потрібно отримати доступ до сервера через консоль (доступна через панель керування VPS AlexHost) та запустити:

sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reload

Проблема 4: Перевірка журналів Firewalld

sudo journalctl -u firewalld -f

Або перевірте системний журнал на наявність повідомлень, пов’язаних з брандмауером:

sudo grep -i firewall /var/log/messages

Шпаргалка Firewalld Quick Reference

ЗавданняКоманда
Перевірити статусsudo systemctl status firewalld
Запустити Firewalldsudo systemctl start firewalld
Зупинити Firewalldsudo systemctl stop firewalld
Включити при завантаженніsudo systemctl enable firewalld
Отримати зону за замовчуваннямsudo firewall-cmd --get-default-zone
Список усіх зонsudo firewall-cmd --get-zones
Список активних зонsudo firewall-cmd --get-active-zones
Встановити зону за замовчуваннямsudo firewall-cmd --set-default-zone=public
Додати сервісsudo firewall-cmd --zone=public --add-service=http --permanent
Видалити сервісsudo firewall-cmd --zone=public --remove-service=http --permanent
Відкрити портsudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
Закрити портsudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
Список сервісівsudo firewall-cmd --zone=public --list-services
Список портівsudo firewall-cmd --zone=public --list-ports
Список усіх правилsudo firewall-cmd --list-all
Додати розширене правилоsudo firewall-cmd --zone=public --add-rich-rule='...' --permanent
Зберегти правила часу виконанняsudo firewall-cmd --runtime-to-permanent
Перезавантажити Firewalldsudo firewall-cmd --reload
Режим паніки (заблокувати все)sudo firewall-cmd --panic-on
Вимкнути режим панікиsudo firewall-cmd --panic-off

Висновок

Firewalld — це виключно потужний і гнучкий інструмент управління брандмауером, який надає адміністраторам систем Linux точний, динамічний контроль над мережевим трафіком. Опанувавши зони, сервіси, правила портів та розширені правила, ви можете побудувати багатошарову, адаптивну архітектуру безпеки, яка захищає ваш сервер від несанкціонованого доступу, атак перебору та загроз на рівні мережі.

Ключові принципи, які слід запам’ятати:

  1. Завжди дозволяйте SSH перед увімкненням брандмауера, щоб уникнути блокування себе
  2. Використовуйте прапор --permanent для всіх правил у виробництві та завжди слідуйте --reload
  3. Обмежуйте чутливі сервіси (SSH, бази даних, панелі адміністратора) до конкретних довірених IP-адрес за допомогою розширених правил
  4. Регулярно переглядайте правила брандмауера — ваша позиція безпеки повинна розвиватися зі змінами вашої інфраструктури
  5. Спочатку протестуйте правила під час виконання, а потім зробіть їх постійними після перевірки

Незалежно від того, керуєте ви одним VPS чи флотом Dedicated Servers, AlexHost надає інфраструктуру, продуктивність та повний root-доступ, необхідні для впровадження конфігурацій безпеки рівня підприємства. Поєднайте налаштування Firewalld з SSL Certificates для зашифрованих комунікацій та дослідіть VPS Control Panels для спрощеного управління сервером — все доступно на надійній, високопродуктивній платформі AlexHost.