15%

Збережіть 15% на всі хостинг-послуги

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

Використовуй код:

Skills
Почати
21.10.2024
3 +1

Вступ до Firewalld: Динамічне управління брандмауером на Linux

Firewalld — це демон керування міжмережевим екраном у просторі користувача для Linux, який надає динамічний інтерфейс на основі зон поверх бекендів фільтрації пакетів на рівні ядра iptables та nftables. На відміну від статичних інструментів міжмережевого екрана, які вимагають повного перезапуску служби для застосування змін правил, Firewalld змінює правила netfilter на льоту — зберігаючи активні TCP-сесії та усуваючи простої під час оновлення політик.

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

Чому Firewalld замінив статичні робочі процеси iptables

Традиційне керування iptables означає написання правил у shell-скрипти або плоскі конфігураційні файли, а потім очищення та перезавантаження всього набору правил щоразу, коли потрібна зміна. На завантаженому сервері цей цикл очищення та перезавантаження розриває активні з’єднання та створює короткий проміжок часу, коли фільтрація не активна.

Firewalld вирішує цю проблему за допомогою демона, активованого через D-Bus (firewalld), який зберігає авторитетний стан правил і поступово передає зміни до ядра. Результатом є атомарні оновлення правил без переривання з’єднань — критично важливо для будь-якого сервера, що виконує постійні робочі навантаження, такі як бази даних, VPN-тунелі або довготривалі API-з’єднання.

Коли ви розгортаєте середовище VPS Хостинг і вам потрібно його захистити без перезавантаження або переривання служб, Firewalld є природним операційним вибором у дистрибутивах сімейства RHEL та багатьох дистрибутивах сімейства Debian.

Основна архітектура: як Firewalld взаємодіє з ядром

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

User Space
┌─────────────────────────────────────────────┐
│ firewall-cmd / firewall-config / D-Bus API  │
└────────────────────┬────────────────────────┘
                     │ D-Bus
┌────────────────────▼────────────────────────┐
│              firewalld daemon               │
│  (zone engine, service definitions, rich    │
│   rule parser, direct rule passthrough)     │
└────────────────────┬────────────────────────┘
                     │ nftables / iptables backend
Kernel Space
┌────────────────────▼────────────────────────┐
│           netfilter (kernel module)         │
└─────────────────────────────────────────────┘

Починаючи з RHEL 8 та Fedora 32, Firewalld за замовчуванням використовує бекенд nftables. У старіших системах або явно налаштованих середовищах він використовує бекенд iptables. Ви можете перевірити або змінити активний бекенд у /etc/firewalld/firewalld.conf за допомогою директиви FirewallBackend.

Критична пастка: Ніколи не змішуйте прямі команди iptables або nft з Firewalld на одному інтерфейсі. Firewalld керує таблицями netfilter, які він створює; правила, вставлені вручну поза демоном, будуть мовчки перезаписані під час наступного перезавантаження.

Ключові концепції Firewalld

Зони

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

Firewalld постачається з такими попередньо визначеними зонами, впорядкованими від найбільш до найменш дозвільних:

ЗонаПолітика за замовчуваннямТиповий випадок використання
`trusted`Дозволити всеВнутрішні лабораторні мережі, loopback
`home`Відхилити, окремі служби дозволеніДомашня LAN з відомими пристроями
`internal`Відхилити, окремі служби дозволеніВнутрішній корпоративний мережевий сегмент
`work`Відхилити, окремі служби дозволеніОфісна мережа, помірний рівень довіри
`public`Відхилити, дозволені SSH/DHCPv6Інтерфейси, що виходять в Інтернет
`external`Відхилити, увімкнено маскарадингЗовнішній сегмент маршрутизатора/NAT-шлюзу
`dmz`Відхилити, дозволений SSHСервери демілітаризованої зони
`block`Відхилити з ICMP admin-prohibitedЯвне відхилення з відповіддю
`drop`Мовчки скидатиВорожі джерела, максимальна прихованість

Архітектурний нюанс: Зону можна прив’язати до мережевого інтерфейсу (наприклад, eth0) або до CIDR-адреси джерела (наприклад, 192.168.1.0/24). Прив’язка на основі джерела має пріоритет над прив’язкою на основі інтерфейсу, що дозволяє застосовувати різні політики до трафіку, що надходить на один фізичний інтерфейс з різних підмереж — шаблон, поширений у мультиорендних або контейнеризованих середовищах.

Служби

Служба у Firewalld — це XML-файл визначення, що зберігається в /usr/lib/firewalld/services/ (системні значення за замовчуванням) або /etc/firewalld/services/ (користувацькі перевизначення). Кожен файл оголошує порти, протоколи та необов’язкові допоміжні модулі, необхідні для іменованого застосунку.

Наприклад, визначення служби https відкриває TCP-порт 443 і не завантажує додаткових допоміжних модулів ядра. Служба ftp відкриває TCP-порт 21 і завантажує допоміжний модуль nf_conntrack_ftp для обробки динамічного узгодження портів каналу даних FTP.

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

Щоб отримати список усіх доступних визначень служб у вашій системі:

firewall-cmd --get-services

Щоб переглянути XML-визначення конкретної служби:

cat /usr/lib/firewalld/services/https.xml

Розширені правила

Розширені правила розширюють модель зон умовною логікою, яку проста абстракція служб/портів не може виразити. Вони підтримують зіставлення за адресами джерела та призначення, діапазонами портів, протоколами, часовими вікнами та станом з’єднання, і можуть ініціювати дії, включаючи accept, drop, reject, log та audit.

Синтаксис розширених правил слідує структурованій граматиці:

rule [family="ipv4|ipv6"]
  [source address="addr[/mask]" [invert="true"]]
  [destination address="addr[/mask]" [invert="true"]]
  [service name="service-name"] | [port port="port" protocol="tcp|udp"]
  [log [prefix="prefix"] [level="level"] [limit value="rate/duration"]]
  [audit]
  [accept|drop|reject [type="reject-type"]]

Практичний приклад — обмеження кількості спроб входу SSH до 3 на хвилину з будь-якого окремого джерела IPv4, а потім журналювання та скидання надлишку:

firewall-cmd --zone=public --add-rich-rule='
  rule family="ipv4"
  service name="ssh"
  log prefix="SSH_RATELIMIT " level="warning" limit value="3/m"
  accept' --permanent
firewall-cmd --zone=public --add-rich-rule='
  rule family="ipv4"
  service name="ssh"
  drop' --permanent

Граничний випадок: Порядок розширених правил має значення. Firewalld оцінює розширені правила в порядку їх додавання в межах зони. Якщо ви додасте широке правило drop перед конкретним правилом accept, правило accept ніколи не буде досягнуто. Завжди додавайте більш конкретні правила першими.

Конфігурація середовища виконання та постійна конфігурація

Це найважливіше з операційної точки зору розмежування у Firewalld і джерело найпоширеніших виробничих помилок.

ВимірСередовище виконанняПостійна
Місце зберіганняВ пам’яті (стан демона)XML-файли `/etc/firewalld/`
Коли застосовуєтьсяНегайноПісля `–reload` або перезавантаження
Зберігається після перезавантаженняНіТак
Безпечно для тестуванняТакПотребує перезавантаження для перевірки
РизикВтрачається при перезапускуЗберігається після перезавантажень

Найкращий робочий процес для виробничих змін:

  1. Застосуйте правило лише в середовищі виконання (без прапорця --permanent) і перевірте, що воно поводиться як очікується.
  2. Якщо правильно, застосуйте те саме правило з --permanent, щоб записати його на диск.
  3. Запустіть firewall-cmd --reload, щоб синхронізувати постійну конфігурацію зі станом середовища виконання та підтвердити відповідність.

Цей робочий процес запобігає класичному сценарію, коли адміністратор додає правило --permanent, перезавантажує і виявляє, що заблокував собі доступ до SSH — оскільки тест у середовищі виконання виявив би проблему до того, як вона стала постійною.

Встановлення та увімкнення Firewalld

Firewalld встановлено за замовчуванням на RHEL, CentOS Stream, Fedora, AlmaLinux та Rocky Linux. На Debian та Ubuntu його необхідно встановити явно.

RHEL / CentOS Stream / AlmaLinux / Rocky Linux:

sudo dnf install firewalld

Debian / Ubuntu:

sudo apt-get update && sudo apt-get install firewalld

Примітка для користувачів Ubuntu: Якщо ufw активний, вимкніть його перед увімкненням Firewalld, щоб уникнути конфліктуючих правил netfilter:

sudo ufw disable
sudo systemctl disable ufw

Запустіть і увімкніть демон:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Перевірте, що демон запущений і бекенд ядра активний:

sudo firewall-cmd --state
sudo firewall-cmd --info-zone=public

Основні команди Firewalld

Перевірка поточного стану

Перевірка стану демона:

sudo firewall-cmd --state

Список усіх активних зон з їхніми призначеними інтерфейсами та джерелами:

sudo firewall-cmd --get-active-zones

Відображення повного набору правил для конкретної зони:

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

Відображення повного набору правил для всіх зон одночасно:

sudo firewall-cmd --list-all-zones

Керування зоною за замовчуванням

Зона за замовчуванням застосовується до будь-якого інтерфейсу, явно не призначеного іншій зоні:

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

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

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

Пастка: У системах, що використовують NetworkManager, призначення інтерфейсу до зони, зроблені через firewall-cmd, можуть бути перевизначені профілем з’єднання NetworkManager при повторному підключенні. Встановіть зону постійно в з’єднанні NetworkManager:

nmcli connection modify "Wired connection 1" connection.zone internal

Додавання та видалення служб

Дозволити HTTP у публічній зоні в середовищі виконання:

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

Зробити це постійним:

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

Видалити службу:

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

Відкриття та закриття конкретних портів

Відкрити TCP-порт 8080 в середовищі виконання:

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

Відкрити діапазон UDP-портів постійно:

sudo firewall-cmd --zone=public --add-port=60000-61000/udp --permanent

Видалити порт:

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

Додавання IP-адрес до списку дозволених та заблокованих

Дозволити весь трафік з довіреної підмережі керування:

sudo firewall-cmd --zone=trusted --add-source=10.0.0.0/24 --permanent

Заблокувати весь трафік з конкретної IP-адреси (скидання на основі джерела):

sudo firewall-cmd --zone=drop --add-source=203.0.113.45/32 --permanent

Перенаправлення портів

Перенаправити зовнішній TCP-порт 2222 на внутрішній SSH-порт 22 (корисно для приховування стандартного SSH-порту без зміни sshd_config):

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

IP-маскарадинг (NAT)

Увімкнути маскарадинг у зовнішній зоні, щоб дозволити VPS, що діє як шлюз, виконувати NAT трафіку з приватної підмережі:

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

Перезавантаження та синхронізація конфігурації

Застосувати всі постійні зміни до запущеного стану без розриву з’єднань:

sudo firewall-cmd --reload

Виконати повний перезапуск (розриває всі з’єднання — використовуйте лише в надзвичайних ситуаціях):

sudo systemctl restart firewalld

Створення користувацьких зон та визначень служб

Користувацька зона

sudo firewall-cmd --new-zone=management --permanent
sudo firewall-cmd --zone=management --add-source=10.10.0.0/16 --permanent
sudo firewall-cmd --zone=management --add-service=ssh --permanent
sudo firewall-cmd --zone=management --add-service=cockpit --permanent
sudo firewall-cmd --reload

Визначення користувацької служби

Створіть файл служби для користувацького застосунку, що прослуховує TCP 9200 (наприклад, Elasticsearch):

sudo nano /etc/firewalld/services/elasticsearch.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Elasticsearch</short>
  <description>Elasticsearch HTTP API and transport port</description>
  <port protocol="tcp" port="9200"/>
  <port protocol="tcp" port="9300"/>
</service>
sudo firewall-cmd --reload
sudo firewall-cmd --zone=internal --add-service=elasticsearch --permanent
sudo firewall-cmd --reload

Firewalld проти альтернатив: вибір правильного інструменту

ФункціяFirewalldUFWiptables (прямий)nftables (прямий)
Динамічні оновлення правилТакНі (потребує перезавантаження)НіНі
Модель на основі зонТакНіНіНі
Інтеграція D-Bus / APIТакНіНіНі
Розширені правила / умовна логікаТакОбмеженоТакТак
За замовчуванням у сімействі RHELТакНіЗастарілийТак (бекенд)
За замовчуванням на UbuntuНіТакЗастарілийТак (бекенд)
Крива навчанняПомірнаНизькаВисокаВисока
Придатний для скриптуванняТакТакТакТак
Інструмент керування через GUIТак (firewall-config)НіНіНі

Для команд, що керують Виділеними серверами у масштабі, D-Bus API Firewalld дозволяє програмне керування правилами з інструментів керування конфігурацією, таких як Ansible (модуль ansible.posix.firewalld) або Puppet, що є значною операційною перевагою порівняно з підтримкою необроблених скриптів iptables.

Практичні шаблони посилення безпеки

Захист веб-сервера

Типова конфігурація для сервера, що працює з HTTPS, з SSH, обмеженим до IP-адреси керування:

# Set the default zone
sudo firewall-cmd --set-default-zone=public --permanent

# Allow HTTPS globally
sudo firewall-cmd --zone=public --add-service=https --permanent

# Allow HTTP only to redirect to HTTPS (optional)
sudo firewall-cmd --zone=public --add-service=http --permanent

# Restrict SSH to a specific management IP only
sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --zone=public --add-rich-rule='
  rule family="ipv4"
  service name="ssh"
  source address="198.51.100.10/32"
  accept' --permanent

sudo firewall-cmd --reload

Якщо ви запускаєте веб-сервер разом із розгортанням SSL Сертифікатів, забезпечення відкритості порту 443 у правильній зоні перед видачею сертифіката (особливо для викликів ACME HTTP-01 або TLS-ALPN-01) є обов’язковим кроком, який часто упускають.

Захист поштового сервера

Для серверів, що запускають стеки Поштового хостингу (Postfix, Dovecot), необхідний набір служб:

sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=smtps --permanent
sudo firewall-cmd --zone=public --add-service=imap --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent
sudo firewall-cmd --reload

Журналювання скинутих пакетів для криміналістики

sudo firewall-cmd --zone=public --add-rich-rule='
  rule family="ipv4"
  log prefix="DROPPED_PUBLIC " level="warning" limit value="10/m"
  drop' --permanent
sudo firewall-cmd --reload

Журнали з’являються в /var/log/messages або журналі systemd (journalctl -k -g DROPPED_PUBLIC). Обмежте частоту журналювання (як показано вище), щоб запобігти переповненню журналів у сценарії DDoS.

Firewalld на VPS під керуванням cPanel

Якщо ви використовуєте VPS з cPanel, майте на увазі, що cPanel встановлює та керує власним рівнем міжмережевого екрана (за замовчуванням CSF/LFD). Запуск Firewalld разом із CSF без явної координації призведе до конфліктуючих правил netfilter. Рекомендований підхід — вибрати один рівень керування міжмережевим екраном на сервер і вимкнути інший, або використовувати інтерфейс прямого передавання правил Firewalld для інтеграції з вимогами cPanel.

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

Проблема: Правило, додане з --permanent, не діє.

Причина: Постійні правила потребують перезавантаження для переходу в стан середовища виконання.

Виправлення:

sudo firewall-cmd --reload

Проблема: SSH-з’єднання розірвано після зміни міжмережевого екрана.

Причина: Служба SSH була видалена з активної зони, або розширене правило drop було додано перед правилом accept.

Виправлення: Отримайте доступ до сервера через позасмугову консоль (консоль VNC/KVM вашого хостинг-провайдера), потім відновіть службу SSH:

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

Проблема: firewall-cmd повертає FirewallD is not running.

Причина: Демон аварійно завершив роботу або ніколи не запускався.

Виправлення:

sudo systemctl start firewalld
sudo journalctl -u firewalld -n 50

Проблема: Правила виглядають правильно, але трафік все одно заблокований.

Причина: Конфліктуюче правило iptables або nft існує поза керованими таблицями Firewalld, або SELinux/AppArmor блокує з’єднання на рівні застосунку.

Виправлення: Перевірте наявність ручних правил та відмов SELinux:

sudo iptables -L -n -v
sudo ausearch -m avc -ts recent

Проблема: Інтерфейс не призначений до очікуваної зони після перезавантаження.

Причина: Профіль з’єднання NetworkManager перевизначає призначення інтерфейсу Firewalld.

Виправлення: Встановіть зону в профілі NetworkManager, як описано в розділі призначення інтерфейсів вище.

Матриця рішень та технічний контрольний список

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

  • Підтвердіть активний бекенд міжмережевого екрана (FirewallBackend у /etc/firewalld/firewalld.conf) відповідає підтримці nftables/iptables вашого ядра.
  • Переконайтеся, що жодні конфліктуючі інструменти міжмережевого екрана (UFW, CSF, прямі скрипти iptables) не активні на тих самих інтерфейсах.
  • Призначте кожен мережевий інтерфейс явно до зони — ніколи не покладайтеся виключно на зону за замовчуванням для серверів з кількома мережевими підключеннями.
  • Спочатку застосовуйте всі зміни в середовищі виконання, перевіряйте з’єднання, потім фіксуйте з --permanent та --reload.
  • Обмежте доступ SSH до конкретних IP-адрес джерела через розширені правила перед видаленням служби SSH з публічної зони.
  • Додайте розширені правила обмеження частоти для всіх публічно доступних служб автентифікації (SSH, SMTP, кінцеві точки входу HTTPS).
  • Увімкніть журналювання для зони drop з обмеженням частоти для збору розвідувальних даних про загрози без переповнення сховища.
  • Для серверів, що керуються через Панелі керування VPS, підтвердіть, що необхідні порти панелі керування внесені до списку дозволених перед застосуванням обмежувальної політики за замовчуванням.
  • Перевірте постійну конфігурацію, запустивши firewall-cmd --reload та негайно перевіривши, що всі критичні служби залишаються доступними.
  • Документуйте кожну користувацьку зону, розширене правило та визначення служби у системі контролю версій разом із вашою інфраструктурою як кодом.

Поширені запитання

У чому різниця між --reload та sudo systemctl restart firewalld?

--reload застосовує постійні зміни конфігурації до запущеного демона без розриву встановлених з’єднань. systemctl restart повністю перезапускає процес демона, що очищає всі правила netfilter і коротко переривав активні з’єднання. Завжди надавайте перевагу --reload на виробничих системах.

Чи можуть Firewalld та iptables співіснувати на одному сервері?

Не безпечно на одному інтерфейсі. Firewalld керує власними ланцюжками netfilter; прямі команди iptables, що змінюють ті самі ланцюжки, будуть перезаписані під час наступного перезавантаження Firewalld. Якщо вам потрібно вставити користувацькі правила, використовуйте натомість інтерфейс --direct Firewalld або розширені правила.

Як зробити правило середовища виконання постійним без повторного введення?

Немає вбудованої команди для переведення всіх правил середовища виконання в постійні за один крок. Правильний робочий процес — застосовувати кожне правило двічі: один раз без --permanent для тестування, потім з --permanent для збереження — після чого виконати --reload. Альтернативно, використовуйте firewall-cmd --runtime-to-permanent (доступно у Firewalld 0.9+) для збереження поточного стану середовища виконання на диск.

Чому моє призначення зони скидається після повторного підключення NetworkManager?

NetworkManager зберігає призначення зон у власних профілях з’єднань. Призначення firewall-cmd --change-interface є перевизначенням середовища виконання, яке NetworkManager може перезаписати. Збережіть призначення за допомогою nmcli connection modify <profile-name> connection.zone <zone>.

Чи підтримує Firewalld IPv6?

Так. Firewalld одночасно керує правилами netfilter як для IPv4, так і для IPv6. Розширені правила вимагають атрибута family="ipv6" для конкретного таргетування трафіку IPv6. Правила зон і служб за замовчуванням застосовуються до обох сімейств адрес, якщо визначення служби або розширене правило не обмежує область застосування.

15%

Збережіть 15% на всі хостинг-послуги

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

Використовуй код:

Skills
Почати