6.1.7 Робота з файрволами Linux

Банер

Файрволи є невід’ємною частиною безпеки будь-якої операційної системи, включаючи Linux. Вони функціонують як бар’єр між Вашою системою та зовнішнім світом, контролюючи вхідний та вихідний мережевий трафік відповідно до заздалегідь визначених правил безпеки. У Linux існує кілька інструментів для управління файрволами, кожен з яких має свої особливості та сфери застосування.

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

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

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

Порівняльна характеристика файрволів Linux

IPTables

  • Переваги: універсальний і гнучкий, низькорівневий доступ, висока продуктивність
  • Недоліки: складний синтаксис, складне управління, відсутність вбудованих засобів збереження
  • Рекомендується для: досвідчених адміністраторів, ситуацій, що вимагають детального контролю

UFW

  • Переваги: простий синтаксис, легкий у використанні, інтегрований в Ubuntu/Debian
  • Недоліки: менш гнучкий, ніж IPTables, обмежені можливості для складних сценаріїв
  • Рекомендується для: початківців, простих конфігурацій, робочих станцій

FirewallD

  • Переваги: динамічне управління, зони безпеки, простий синтаксис для складних налаштувань
  • Недоліки: відносно нова система, менш документована, ніж IPTables
  • Рекомендується для: сучасних систем RHEL/CentOS/Fedora/AlmaLinux/RockyLinux, серверів з різними вимогами безпеки

IPTables

IPTables є традиційним та універсальним інструментом для налаштування файрволу в Linux, який безпосередньо взаємодіє з функціями фільтрації пакетів ядра Linux (Netfilter).

Основні концепції IPTables

IPTables організовує правила фільтрації в таблиці, ланцюжки та правила:

  • Таблиці: визначають тип обробки пакетів (filter, nat, mangle, raw, security)

    • filter: використовується для фільтрації пакетів (дозвіл або блокування трафіку)
    • nat: використовується для трансляції мережевих адрес
    • mangle: дозволяє змінювати заголовки пакетів
    • raw: використовується для налаштувань винятків із трекінгу з’єднань
    • security: використовується для правил мережевого контролю доступу (SELinux)
  • Ланцюжки: групи правил для певного типу трафіку

    • INPUT: контролює пакети, призначені для локальної системи
    • OUTPUT: контролює пакети, що створюються локальною системою
    • FORWARD: контролює пакети, що маршрутизуються через систему
    • PREROUTING: для пакетів до прийняття рішення про маршрутизацію
    • POSTROUTING: для пакетів після прийняття рішення про маршрутизацію
  • Правила: конкретні умови та дії для пакетів

    • Дії (targets): ACCEPT, DROP, REJECT, LOG, RETURN та інші
    • Умови: протокол, IP-адреса, порт, стан з’єднання тощо

Базові команди IPTables

Таблиця ключів для IPTables
Ключ Опис
-A (–append) Додає нове правило в кінець вказаного ланцюжка
-D (–delete) Видаляє правило з ланцюжка (за номером або точним співпадінням)
-I (–insert) Вставляє правило на вказану позицію в ланцюжку
-R (–replace) Замінює правило на вказаній позиції
-L (–list) Виводить всі правила в вказаному ланцюжку
-F (–flush) Видаляє всі правила з вказаного ланцюжка
-P (–policy) Встановлює політику за замовчуванням для ланцюжка
-N (–new-chain) Створює новий користувацький ланцюжок
-X (–delete-chain) Видаляє порожній користувацький ланцюжок
-t (–table) Вказує таблицю (filter, nat, mangle, raw, security)
-p (–protocol) Вказує протокол (tcp, udp, icmp, all)
-s (–source) Вказує адресу/підмережу джерела
-d (–destination) Вказує адресу/підмережу призначення
-i (–in-interface) Вказує вхідний мережевий інтерфейс
-o (–out-interface) Вказує вихідний мережевий інтерфейс
--dport Вказує порт призначення (використовується з -p)
--sport Вказує порт джерела (використовується з -p)
-j (–jump) Вказує дію (ACCEPT, DROP, REJECT, LOG, тощо)
-m (–match) Завантажує розширення співставлення (state, limit, conntrack, тощо)
--line-numbers Показує номери рядків при виведенні правил
--state Вказує стан з’єднання (NEW, ESTABLISHED, RELATED, INVALID)
--ctstate Вказує стан з’єднання для модуля conntrack
--limit Обмежує швидкість обробки пакетів
--limit-burst Вказує початкове значення лічильника для обмеження
--log-prefix Додає префікс до записів журналу
--icmp-type Вказує тип ICMP-повідомлення
--to-port Вказує цільовий порт для REDIRECT
--to-destination Вказує цільову адресу для DNAT

Перегляд поточних правил:

  1. sudo iptables -L -v -n

Відображення всіх правил: rules

Перегляд правил з номерами рядків:

  1. sudo iptables -L --line-numbers

Перегляд правил для конкретної таблиці:

  1. sudo iptables -t nat -L -v

Додавання правила: дозвіл вхідного SSH з’єднання:

  1. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Додавання правила з обмеженням IP-адреси:

  1. sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

Блокування всіх інших вхідних з’єднань:

  1. sudo iptables -A INPUT -j DROP

Додавання правила на початок ланцюжка:

  1. sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

Видалення правила за номером:

  1. sudo iptables -D INPUT 3

Видалення правила за змістом:

  1. sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT

Збереження правил (Debian/Ubuntu):

  1. sudo netfilter-persistent save

Збереження правил (CentOS/RHEL):

  1. sudo service iptables save

Приклад базової конфігурації

Очищення всіх правил:

  1. sudo iptables -F

Встановлення політики за замовчуванням:

  1. sudo iptables -P INPUT DROP
  2. sudo iptables -P FORWARD DROP
  3. sudo iptables -P OUTPUT ACCEPT

Дозвіл локальних з’єднань:

  1. sudo iptables -A INPUT -i lo -j ACCEPT

Дозвіл встановлених з’єднань:

  1. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Дозвіл SSH:

  1. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Дозвіл HTTP та HTTPS:

  1. sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Дозвіл ICMP (ping):

  1. sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Логування і блокування всіх інших з’єднань:

  1. sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "
  2. sudo iptables -A INPUT -j DROP

Розширені можливості IPTables

Лімітування кількості нових з’єднань:

  1. sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/minute --limit-burst 3 -j ACCEPT

Блокування певних IP-адрес:

  1. sudo iptables -A INPUT -s 10.0.0.5 -j DROP

Налаштування переадресації портів:

  1. sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Налаштування NAT для доступу внутрішньої мережі до зовнішньої:

  1. sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

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

UFW (Uncomplicated Firewall)

UFW є надбудовою над IPTables, розробленою для спрощення управління файрволом. Він найчастіше використовується в дистрибутивах на базі Ubuntu та Debian. UFW був створений з метою забезпечити легкий у використанні інтерфейс, який приховує складності IPTables, зберігаючи при цьому його потужність.

Принцип роботи UFW

UFW використовує принцип правил дозволу/заборони для сервісів та портів. Замість складних команд IPTables, UFW дозволяє використовувати прості команди з ключовими словами “allow”, “deny”, “reject” та інші. Це робить його ідеальним для починаючих адміністраторів або для систем з нескладними вимогами безпеки.

Правила UFW оброблюються в порядку їх додавання, з першого до останнього. Коли знайдено відповідне правило, обробка припиняється. Якщо жодне правило не відповідає пакету, застосовується політика за замовчуванням.

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

Таблиця ключів для UFW
Ключ Опис
enable Активує файрвол
disable Вимикає файрвол
status Показує поточний стан файрволу
status verbose Показує детальний стан файрволу
status numbered Показує правила з номерами
default Встановлює політику за замовчуванням (allow/deny)
allow Дозволяє з’єднання (порт, сервіс, адреса)
deny Блокує з’єднання без повідомлення
reject Блокує з’єднання з повідомленням
delete Видаляє правило (за номером або змістом)
insert Вставляє правило на вказану позицію
route Керує правилами пересилання пакетів
logging Керує режимом логування (on/off/low/medium/high/full)
app list Показує список доступних профілів додатків
app info Показує інформацію про профіль додатка
from Вказує джерело з’єднання (IP-адреса, мережа)
to Вказує призначення з’єднання
port Вказує порт або діапазон портів
proto Вказує протокол (tcp/udp)
on Вказує мережевий інтерфейс
comment Додає коментар до правила

Встановлення UFW:

  1. sudo apt install ufw

Активація UFW:

  1. sudo ufw enable

Вимкнення UFW:

  1. sudo ufw disable

Перевірка статусу:

  1. sudo ufw status verbose

Результат перевірки статусу: статус

Налаштування дефолтних політик:

  1. sudo ufw default deny incoming
  2. sudo ufw default allow outgoing

Дозвіл сервісу за назвою:

  1. sudo ufw allow ssh

Дозвіл порту за номером:

  1. sudo ufw allow 80/tcp

Дозвіл діапазону портів:

  1. sudo ufw allow 6000:6007/tcp

Блокування порту:

  1. sudo ufw deny 23/tcp

Відхилення запитів із повідомленням:

  1. sudo ufw reject 80/tcp

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

  1. sudo ufw delete allow 80/tcp

Дозвіл доступу для конкретного додатка з профілів:

  1. sudo ufw app list
  2. sudo ufw allow 'Nginx Full'

Використання числових порядкових номерів

Перегляд правил з номерами:

  1. sudo ufw status numbered

При введенні команди Ви побачите перелік правил та їх номера: Правила

Видалення правила за номером:

  1. sudo ufw delete 2

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

Дозвіл доступу з певної IP-адреси:

  1. sudo ufw allow from 192.168.1.100

Дозвіл доступу до певного порту з певної IP-адреси:

  1. sudo ufw allow from 192.168.1.100 to any port 22

Дозвіл доступу з певної підмережі:

  1. sudo ufw allow from 192.168.1.0/24

Дозвіл доступу з певної підмережі до певного порту:

  1. sudo ufw allow from 192.168.1.0/24 to any port 3306

Дозвіл доступу через певний інтерфейс:

  1. sudo ufw allow in on eth1 to any port 80

Налаштування переадресації портів (потребує додаткових налаштувань):

  1. sudo ufw route allow proto tcp from any to any port 80

Увімкнення логування:

  1. sudo ufw logging on
  2. sudo ufw logging medium

Нагадуємо: після активації UFW, переконайтеся, що Ви додали правило для дозволу SSH або іншого методу віддаленого доступу, інакше Ви можете втратити доступ до системи.

FirewallD

FirewallD — це сучасний фреймворк управління файрволом, який є стандартним для дистрибутивів на базі Red Hat (RHEL, CentOS, AlmaLinux, RockyLinux). Він використовує концепцію зон та сервісів для спрощення управління.

Основні концепції FirewallD:
  • Зони: попередньо визначені набори правил для різних рівнів довіри

    • public: для зон без довіри, публічних мереж
    • home: для домашніх мереж, більшість комп’ютерів у мережі заслуговують довіри
    • work: для робочих мереж, більшість комп’ютерів довірені
    • trusted: всі з’єднання прийнято
    • dmz: для комп’ютерів у демілітаризованій зоні
    • external: для використання в маршрутизаторах з NAT
    • internal: для внутрішньої сторони шлюзу
    • block: відхиляє всі вхідні з’єднання
    • drop: відкидає всі вхідні з’єднання без повідомлень
  • Сервіси: визначення для стандартних програм (http, ssh, ftp, тощо)

    • Кожен сервіс містить інформацію про порти, протоколи та модулі
    • Дозволяє використовувати зрозумілі назви замість номерів портів
  • Постійні та тимчасові правила:

    • Тимчасові: діють до перезавантаження або перезапуску служби
    • Постійні: зберігаються після перезавантаження (опція --permanent)

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

Базове управління FirewallD

Перш ніж почати налаштування правил брандмауера, важливо вміти перевіряти поточний стан системи та здійснювати базове управління FirewallD. Це дозволяє адміністратору розуміти наявну конфігурацію та ефективно вносити зміни.

Таблиця ключів для FirewallD
Ключ Опис
--state Показує стан служби FirewallD
--reload Перезавантажує конфігурацію
--complete-reload Повне перезавантаження, включаючи всі модулі
--runtime-to-permanent Зберігає поточні тимчасові правила як постійні
--permanent Позначає зміну як постійну (зберігається після перезавантаження)
--get-default-zone Показує зону за замовчуванням
--set-default-zone Встановлює зону за замовчуванням
--get-zones Виводить список всіх доступних зон
--get-active-zones Виводить активні зони з прив’язаними інтерфейсами
--zone Вказує зону для операції
--list-all Виводить всі параметри вказаної зони
--list-all-zones Виводить параметри всіх зон
--new-zone Створює нову зону
--get-services Виводить список всіх доступних сервісів
--get-icmptypes Виводить список всіх доступних типів ICMP
--add-service Додає сервіс до зони
--remove-service Видаляє сервіс із зони
--add-port Додає порт до зони
--remove-port Видаляє порт із зони
--add-protocol Додає протокол до зони
--remove-protocol Видаляє протокол із зони
--add-interface Прив’язує інтерфейс до зони
--remove-interface Видаляє інтерфейс із зони
--add-source Додає джерело (IP/мережу) до зони
--remove-source Видаляє джерело (IP/мережу) із зони
--add-masquerade Вмикає маскарадинг (NAT) для зони
--remove-masquerade Вимикає маскарадинг для зони
--add-forward-port Додає правило пересилання портів
--remove-forward-port Видаляє правило пересилання портів
--add-rich-rule Додає розширене правило до зони
--remove-rich-rule Видаляє розширене правило із зони
--query-masquerade Перевіряє стан маскарадингу для зони
--new-service Створює новий сервіс
--service Вказує сервіс для конфігурації
--set-description Встановлює опис для сервісу/зони
--add-port-to-service Додає порт до сервісу
--info-service Показує інформацію про сервіс
--timeout Встановлює тимчасове правило на вказаний період

Перевірити, чи запущено службу FirewallD:

  1. sudo firewall-cmd --state

Якщо служба запущена, Ви побачите надпис running: running

Перевірити версію FirewallD:

  1. sudo firewall-cmd --version

Отримати список усіх доступних зон у системі:

  1. sudo firewall-cmd --get-zones

Переглянути активні зони разом із прив’язаними інтерфейсами:

  1. sudo firewall-cmd --get-active-zones

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

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

Для повного аудиту системи можна переглянути всі зони разом із їхніми налаштуваннями:

  1. sudo firewall-cmd --list-all-zones

Перегляд всіх зон разом з налаштуванням: Всі зони

Управління сервісами та портами. FirewallD використовує концепцію “сервісів” для зручного управління доступом до стандартних програм. Перегляд доступних сервісів:

  1. sudo firewall-cmd --get-services

Перевірити, які сервіси дозволені в конкретній зоні:

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

Додати дозвіл для сервісу на постійній основі:

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

Для тимчасового тестування можна додати сервіс без параметра --permanent:

  1. sudo firewall-cmd --zone=public --add-service=https

Видалити дозвіл для сервісу:

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

Для нестандартних програм можна дозволити доступ за номером порту:

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

Видалити дозвіл для порту:

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

Після внесення змін необхідно застосувати їх:

  1. sudo firewall-cmd --reload

Розширені налаштування та управління зонами

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

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

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

Прив’язати мережевий інтерфейс до конкретної зони:

  1. sudo firewall-cmd --zone=trusted --add-interface=eth0 --permanent

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

  1. sudo firewall-cmd --zone=trusted --remove-interface=eth0 --permanent

Дізнатися, до якої зони належить інтерфейс:

  1. sudo firewall-cmd --get-zone-of-interface=eth0

Для специфічних потреб можна створити власну зону:

  1. sudo firewall-cmd --permanent --new-zone=myzone
  2. sudo firewall-cmd --reload

Налаштування сервісів та розширених правил. Отримати детальну інформацію про сервіс:

  1. sudo firewall-cmd --info-service=http

Створити власний сервіс для нестандартної програми:

  1. sudo firewall-cmd --permanent --new-service=myservice
  2. sudo firewall-cmd --permanent --service=myservice --set-description="My Custom Service"
  3. sudo firewall-cmd --permanent --service=myservice --add-port=12345/tcp
  4. sudo firewall-cmd --reload

Для більш складних сценаріїв мережевої взаємодії FirewallD підтримує маскарадинг (NAT) та пересилання портів:

  1. sudo firewall-cmd --zone=external --add-masquerade --permanent

Перевірити стан маскарадингу для зони:

  1. sudo firewall-cmd --zone=external --query-masquerade

Налаштувати переадресацію портів у рамках одного сервера:

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

Переадресувати трафік на інший хост:

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

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

Для реалізації складних політик мережевої безпеки FirewallD підтримує так звані “rich-правила”, які надають максимальну гнучкість при налаштуванні.

Додати правило для дозволу HTTP-доступу з конкретної IP-адреси:

  1. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" service name="http" accept' --permanent

Заблокувати доступ з певної IP-адреси:

  1. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" reject' --permanent

Обмежити кількість вхідних з’єднань для підвищення безпеки:

  1. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept limit value="5/m"' --permanent

Важливо: правила FirewallD, додані без параметра --permanent, будуть втрачені після перезавантаження системи або служби. Завжди використовуйте --permanent для постійних змін та виконуйте --reload для застосування змін.

Висновок

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

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

Незалежно від обраного інструменту, важливо дотримуватися найкращих практик безпеки та регулярно оновлювати конфігурацію файрволу відповідно до мінливих вимог безпеки та потреб Вашої інфраструктури.

Найкращі практики безпеки:
  1. Принцип найменших привілеїв: дозволяйте лише необхідний трафік і блокуйте все інше.
  2. Регулярні аудити: періодично перевіряйте правила файрволу на відповідність поточним вимогам безпеки.
  3. Документування змін: ведіть журнал усіх змін у конфігурації файрволу.
  4. Резервне копіювання: завжди створюйте резервні копії конфігурації перед внесенням змін.
  5. Тестування: перевіряйте зміни в тестовому середовищі перед застосуванням на продуктивних системах.

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