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 |
Перегляд поточних правил:
- sudo iptables -L -v -n
Відображення всіх правил:
Перегляд правил з номерами рядків:
- sudo iptables -L --line-numbers
Перегляд правил для конкретної таблиці:
- sudo iptables -t nat -L -v
Додавання правила: дозвіл вхідного SSH з’єднання:
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Додавання правила з обмеженням IP-адреси:
- sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
Блокування всіх інших вхідних з’єднань:
- sudo iptables -A INPUT -j DROP
Додавання правила на початок ланцюжка:
- sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
Видалення правила за номером:
- sudo iptables -D INPUT 3
Видалення правила за змістом:
- sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
Збереження правил (Debian/Ubuntu):
- sudo netfilter-persistent save
Збереження правил (CentOS/RHEL):
- sudo service iptables save
Приклад базової конфігурації
Очищення всіх правил:
- sudo iptables -F
Встановлення політики за замовчуванням:
- sudo iptables -P INPUT DROP
- sudo iptables -P FORWARD DROP
- sudo iptables -P OUTPUT ACCEPT
Дозвіл локальних з’єднань:
- sudo iptables -A INPUT -i lo -j ACCEPT
Дозвіл встановлених з’єднань:
- sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Дозвіл SSH:
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Дозвіл HTTP та HTTPS:
- sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Дозвіл ICMP (ping):
- sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Логування і блокування всіх інших з’єднань:
- sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "
- sudo iptables -A INPUT -j DROP
Розширені можливості IPTables
Лімітування кількості нових з’єднань:
- sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
Блокування певних IP-адрес:
- sudo iptables -A INPUT -s 10.0.0.5 -j DROP
Налаштування переадресації портів:
- sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Налаштування NAT для доступу внутрішньої мережі до зовнішньої:
- 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:
- sudo apt install ufw
Активація UFW:
- sudo ufw enable
Вимкнення UFW:
- sudo ufw disable
Перевірка статусу:
- sudo ufw status verbose
Результат перевірки статусу:
Налаштування дефолтних політик:
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
Дозвіл сервісу за назвою:
- sudo ufw allow ssh
Дозвіл порту за номером:
- sudo ufw allow 80/tcp
Дозвіл діапазону портів:
- sudo ufw allow 6000:6007/tcp
Блокування порту:
- sudo ufw deny 23/tcp
Відхилення запитів із повідомленням:
- sudo ufw reject 80/tcp
Видалення правила:
- sudo ufw delete allow 80/tcp
Дозвіл доступу для конкретного додатка з профілів:
- sudo ufw app list
- sudo ufw allow 'Nginx Full'
Використання числових порядкових номерів
Перегляд правил з номерами:
- sudo ufw status numbered
При введенні команди Ви побачите перелік правил та їх номера:
Видалення правила за номером:
- sudo ufw delete 2
Визначення додаткових параметрів
Дозвіл доступу з певної IP-адреси:
- sudo ufw allow from 192.168.1.100
Дозвіл доступу до певного порту з певної IP-адреси:
- sudo ufw allow from 192.168.1.100 to any port 22
Дозвіл доступу з певної підмережі:
- sudo ufw allow from 192.168.1.0/24
Дозвіл доступу з певної підмережі до певного порту:
- sudo ufw allow from 192.168.1.0/24 to any port 3306
Дозвіл доступу через певний інтерфейс:
- sudo ufw allow in on eth1 to any port 80
Налаштування переадресації портів (потребує додаткових налаштувань):
- sudo ufw route allow proto tcp from any to any port 80
Увімкнення логування:
- sudo ufw logging on
- 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:
- sudo firewall-cmd --state
Якщо служба запущена, Ви побачите надпис running
:
Перевірити версію FirewallD:
- sudo firewall-cmd --version
Отримати список усіх доступних зон у системі:
- sudo firewall-cmd --get-zones
Переглянути активні зони разом із прив’язаними інтерфейсами:
- sudo firewall-cmd --get-active-zones
Детально дослідити налаштування конкретної зони:
- sudo firewall-cmd --zone=public --list-all
Для повного аудиту системи можна переглянути всі зони разом із їхніми налаштуваннями:
- sudo firewall-cmd --list-all-zones
Перегляд всіх зон разом з налаштуванням:
Управління сервісами та портами. FirewallD використовує концепцію “сервісів” для зручного управління доступом до стандартних програм. Перегляд доступних сервісів:
- sudo firewall-cmd --get-services
Перевірити, які сервіси дозволені в конкретній зоні:
- sudo firewall-cmd --zone=public --list-services
Додати дозвіл для сервісу на постійній основі:
- sudo firewall-cmd --zone=public --add-service=http --permanent
Для тимчасового тестування можна додати сервіс без параметра --permanent
:
- sudo firewall-cmd --zone=public --add-service=https
Видалити дозвіл для сервісу:
- 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 --reload
Розширені налаштування та управління зонами
FirewallD надає гнучкі можливості для конфігурації мережевої безпеки, дозволяючи створювати складні правила для різних мережевих середовищ.
Налаштування зон та інтерфейсів. Встановити зону за замовчуванням для всіх нових підключень:
- sudo firewall-cmd --set-default-zone=home
Прив’язати мережевий інтерфейс до конкретної зони:
- sudo firewall-cmd --zone=trusted --add-interface=eth0 --permanent
Видалити інтерфейс із зони:
- sudo firewall-cmd --zone=trusted --remove-interface=eth0 --permanent
Дізнатися, до якої зони належить інтерфейс:
- sudo firewall-cmd --get-zone-of-interface=eth0
Для специфічних потреб можна створити власну зону:
- sudo firewall-cmd --permanent --new-zone=myzone
- sudo firewall-cmd --reload
Налаштування сервісів та розширених правил. Отримати детальну інформацію про сервіс:
- sudo firewall-cmd --info-service=http
Створити власний сервіс для нестандартної програми:
- sudo firewall-cmd --permanent --new-service=myservice
- sudo firewall-cmd --permanent --service=myservice --set-description="My Custom Service"
- sudo firewall-cmd --permanent --service=myservice --add-port=12345/tcp
- sudo firewall-cmd --reload
Для більш складних сценаріїв мережевої взаємодії FirewallD підтримує маскарадинг (NAT) та пересилання портів:
- sudo firewall-cmd --zone=external --add-masquerade --permanent
Перевірити стан маскарадингу для зони:
- sudo firewall-cmd --zone=external --query-masquerade
Налаштувати переадресацію портів у рамках одного сервера:
- sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
Переадресувати трафік на інший хост:
- sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.10 --permanent
Розширені правила та безпека
Для реалізації складних політик мережевої безпеки FirewallD підтримує так звані “rich-правила”, які надають максимальну гнучкість при налаштуванні.
Додати правило для дозволу HTTP-доступу з конкретної IP-адреси:
- sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" service name="http" accept' --permanent
Заблокувати доступ з певної IP-адреси:
- sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" reject' --permanent
Обмежити кількість вхідних з’єднань для підвищення безпеки:
- 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 забезпечує баланс між простотою та функціональністю з підтримкою динамічного управління.
Незалежно від обраного інструменту, важливо дотримуватися найкращих практик безпеки та регулярно оновлювати конфігурацію файрволу відповідно до мінливих вимог безпеки та потреб Вашої інфраструктури.
Найкращі практики безпеки:
- Принцип найменших привілеїв: дозволяйте лише необхідний трафік і блокуйте все інше.
- Регулярні аудити: періодично перевіряйте правила файрволу на відповідність поточним вимогам безпеки.
- Документування змін: ведіть журнал усіх змін у конфігурації файрволу.
- Резервне копіювання: завжди створюйте резервні копії конфігурації перед внесенням змін.
- Тестування: перевіряйте зміни в тестовому середовищі перед застосуванням на продуктивних системах.
Ніколи не покладайтеся виключно на файрвол для безпеки Вашої системи. Файрвол є лише одним із компонентів комплексної стратегії безпеки, яка повинна включати також своєчасні оновлення, правильне управління користувачами та дозволами, моніторинг системи та інші заходи безпеки.