Для користувачів операційної системи Linux існує безліч інструментів для забезпечення безпеки. Одним з них є iptables – командний брандмауер, який відзначається своєю гнучкістю та надійністю.
Однак, через те, що це інструмент командного рядка, потрібні деякі зусилля для його освоєння.
Цей матеріал стане у пригоді системним адміністраторам та тим, хто вивчає Linux, адже ми розглянемо основні команди iptables з прикладами.
Що таке iptables?
Iptables – це вбудований програмний брандмауер для Linux. Він дозволяє користувачам Linux задавати правила, які прямо або опосередковано впливають на мережевий трафік.
Завдяки iptables, можна створювати правила для блокування або дозволу трафіку через порти, IP-адреси, мережеві інтерфейси тощо.
Встановлені правила застосовуються до всього трафіку. Наприклад, для кожного нового підключення iptables перевіряє наявність відповідних правил. Якщо такі правила знайдено, вони застосовуються до з’єднання. Якщо ж відповідних правил немає, використовується правило, встановлене за замовчуванням.
Для роботи з iptables використовується команда:
$ iptables -L -n -v
Де параметри означають:
- -L – вивести список усіх правил.
- -n – виводити числові значення для швидшої роботи.
- -v – виводити детальну інформацію.
Якщо запустити команду iptables без параметрів, ви отримаєте повідомлення про відсутність команди:
iptables v1.8.7 (nf_tables): no command specified Try `iptables -h' or 'iptables --help' for more information.
Якщо ви зіткнулися з помилкою “команда «iptables» не знайдена”, необхідно її встановити.
Для установки iptables в Linux виконайте команду:
$ sudo apt-get install iptables
Якщо iptables вже встановлено, ви отримаєте повідомлення, подібне до цього:
#output Reading package lists... Done Building dependency tree... Done Reading state information... Done iptables is already the newest version (1.8.7-1ubuntu5). iptables set to manually installed. 0 upgraded, 0 newly installed, 0 to remove, and 35 not upgraded.
Що таке брандмауер?
Брандмауери є базовим рівнем захисту для систем, мереж та персональних комп’ютерів. Вони можуть бути апаратними або програмними та працюють на основі заданих правил.
Більшість брандмауерів дозволяють налаштування, тобто створення або зміну правил. Наприклад, пакети з інтернету використовують порти для доступу до системи, тому фільтрація на основі портів може допомогти відсіяти небажаний трафік. Крім того, можна дозволяти або блокувати сервіси за IP-адресою джерела або мережевим інтерфейсом.
Користувачі Linux мають доступ до вбудованого брандмауера iptables. Також можна використовувати інші брандмауери для додаткового захисту системи.
Навіщо потрібні iptables для налаштування брандмауера?
Чому саме iptables? Існують альтернативні утиліти, такі як ufw і firewalld, а також окремі брандмауери з більшим набором функцій.
Чому ж iptables залишається популярним? Ось кілька причин:
- Велика гнучкість. Правила можна встановлювати на рівні окремих пакетів.
- Відносна простота використання, якщо розібратися в принципах роботи.
- Зручне блокування небажаного трафіку.
- Можливість перенаправлення пакетів на інші IP-адреси.
- Захист систем від DoS-атак.
І це далеко не всі можливості!
Розуміння архітектури iptables та її зв’язку з Netfilter
Щоб добре розуміти роботу iptables, потрібно розібратися з його архітектурою. Це дозволить нам зрозуміти різні компоненти iptables та навчитися створювати правила брандмауера.
Говорячи про iptables, слід згадати Netfilter. Netfilter можна вважати “старшим братом” iptables. Він є основою для iptables та надає розширені можливості керування брандмауером. Iptables є одним з інструментів Netfilter для досягнення цих можливостей.
Iptables – це командний інтерфейс для “перехоплень” на рівні ядра Netfilter. Ці перехоплення взаємодіють з мережевим стеком Linux, впливаючи на пакети на найглибшому рівні.
Отже, розглянемо архітектуру iptables:
Таблиці
Архітектура iptables починається з таблиць. Вони відповідають за організацію правил. Кожна таблиця класифікується за типом рішень, які вона приймає. Таблиця спрощує обробку пакетів, визначаючи спосіб їхньої обробки.
Iptables надає наступні таблиці:
- Таблиця фільтрів (filter): визначає, чи має пакет досягти місця призначення. Тобто, вона вирішує, чи пропускати пакет, чи ні.
- Таблиця NAT: визначає правила трансляції адрес. Тут маршрутизація пакетів визначається на основі мереж NAT. Наприклад, якщо пакет не може отримати доступ до NAT, він пропустить цю мережу і шукатиме іншу.
- Таблиця mangle: керує спеціальною обробкою пакетів. Наприклад, можна налаштувати зміну інформації заголовка пакету (наприклад, значення TTL).
- Таблиця raw: надає можливість працювати з аспектом “стану” брандмауера iptables. З її допомогою можна маршрутизувати пакети на основі їхнього “стану” до того, як ядро Linux почне відстежувати їхній стан. Вона в основному використовується для позначення пакетів, незалежно від того, відстежує їх система з’єднань чи ні. Якщо пакет не відстежується, для нього встановлюється ціль NOTRACK.
Ланцюжки
Всередині таблиць знаходяться “ланцюжки”.
Ці ланцюжки виконують детальну перевірку пакетів на різних етапах їхнього шляху. Наприклад, можна перевіряти пакети, коли вони досягають порту або мережевого інтерфейсу. Рішення можна прийняти до того, як пакет потрапить до системного процесу.
Як і таблиці, існує кілька типів ланцюжків. Серед них:
- Ланцюжок PREROUTING: обробляє пакети, які тільки-но надійшли на мережевий інтерфейс.
- Ланцюжок INPUT: правила цього ланцюжка керують поведінкою вхідних з’єднань. Після обробки вони передаються локальному процесу.
- Ланцюжок OUTPUT: працює з пакетами, які створюються процесами.
- Ланцюжок FORWARD: керує пакетами, які не призначені для локальної системи. Це носій для інших призначених систем, наприклад, маршрутизатора.
- Ланцюжок POSTROUTING: обробляє пакети, які збираються вийти через мережевий інтерфейс.
Не всі ланцюжки доступні в кожній таблиці. Наприклад, ланцюжок FORWARD доступний лише в таблицях mangle, filter та security. Ланцюжок POSTROUTING доступний в mangle та nat (SNAT). Лише ланцюжок OUTPUT є доступним в усіх таблицях.
Цільова
Коли пакет надходить, він проходить через ланцюжки для визначення відповідного правила. Якщо опис правила збігається з параметрами пакета, то виконується пов’язана дія, а потім пакет прямує до мети, де вирішується його подальша доля.
У багатьох випадках пакет може не відповідати жодному опису або набору правил. У такому випадку застосовується політика за замовчуванням, тобто ціль.
Цілями можуть бути ACCEPT, DROP та REJECT. Це кінцеві цілі, які визначають долю пакета.
- ACCEPT: прийняти пакет.
- DROP: відкинути пакет, при цьому відправник не отримує повідомлення про те, що система існує.
- REJECT: відхилити пакет.
Існують також незавершені цілі, які в основному використовуються для зберігання інформації про пакет.
Найпоширеніші команди iptables з прикладами
Перед тим як почати використовувати команди iptables, переконайтеся, що:
- Ви маєте права адміністратора. Якщо команда не виконується через відсутність прав, повторіть її, додавши команду sudo перед нею.
- Цей матеріал не є посібником з налаштування iptables в Ubuntu.
- Ми будемо використовувати команду iptables, яка працює з IPv4. Якщо вам потрібна робота з IPv6, використовуйте ip6tables.
Перевірка стану iptables
Для перевірки поточного стану iptables виконайте команду:
$ iptables -L -n -v
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Цей вивід містить багато інформації, але також свідчить про неактивний брандмауер. Всі ланцюжки налаштовані на ПРИЙНЯТИ та не мають жодних правил.
Для активації брандмауера потрібно почати додавати правила.
Додавання правил до ланцюжка
Коли ви додаєте правило, воно завжди додається до ланцюжка. Для цього використовується параметр -A (Add). Його синтаксис такий:
$ sudo iptables - A
Однак, при виконанні цієї команди ви отримаєте повідомлення про помилку, оскільки потрібно вказати ланцюжок:
iptables v1.8.7 (nf_tables): option "-A" requires an argument Try `iptables -h' or 'iptables --help' for more information.
Для додавання правил можна використовувати наступні аргументи:
- – i: означає інтерфейс. Тут вказується інтерфейс, до якого застосовується правило. Наприклад, ppp0, eth0 і т.д.
- – p: означає протокол. Тут вказується мережевий протокол для фільтрації пакетів. Наприклад, ICMP, TCP, UDP і т.д. Для застосування правила до всіх протоколів, вкажіть “all”.
- – s: аргумент джерела, де вказується джерело трафіку (IP-адреса або ім’я хоста).
- – dport: порт призначення, тобто номер порту, до якого призначено пакет.
- – j: аргумент TARGET, де вказується назва цілі (ACCEPT, DROP або RETURN).
Важливо дотримуватися наступного порядку в команді:
$ sudo iptables -A <chain-name> -i <interface-name> - p <protocool-name> - s <source> --dport <port no.> -j <target>
Збереження змін до iptables
Після додавання правила ви можете зберегти його за допомогою команди iptables -save:
$ sudo iptables -save
Результат буде схожим на наступний:
[email protected]:~$ sudo iptables-save # Generated by iptables-save v1.8.7 on Sun May 14 13:37:34 2023 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 392 -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -o lo -j ACCEPT COMMIT # Completed on Sun May 14 13:37:34 2023
Збереження правил вручну
За замовчуванням iptables не зберігає правила. Після перезавантаження комп’ютера всі правила будуть видалені. Щоб уникнути повторного налаштування iptables, використовуйте наступні команди.
Для правил IPv4 введіть:
$ sudo iptables-save > /etc/iptables/rules.v4
Для правил IPv6 введіть:
$ sudo iptables-save > /etc/iptables/rules.v6
Автоматичне збереження правил
Щоб правила зберігалися після перезапуску, і це відбувалося автоматично, встановіть пакет iptables-persistent.
Для цього виконайте команду:
$ sudo apt-get install iptables-persistent
З’явиться наступне вікно. Натисніть Enter на <Так>.
Оскільки ми працюємо з IPv4, будуть відображатися тільки правила IPv4. Якщо ви використовуєте IPv6, відобразиться відповідне вікно.
Пакет завантажує тільки ваші збережені правила iptables. Тому, після кожної зміни, потрібно зберігати iptables командою iptables -save.
Перезавантаження правил після перезавантаження
Після збереження правил їх потрібно відновити наступною командою:
$ sudo iptables-restore < /etc/iptables/rules.v4
та
$ sudo iptables-restore < /etc/iptables/rules.v6
Увімкнення трафіку на локальному хості / увімкнення петлі
Для увімкнення трафіку на localhost виконайте команду:
$ sudo iptables -A INPUT -i lo -j ACCEPT
Тут lo – це інтерфейс петлі для всіх локальних з’єднань.
Аналогічно, дозволимо пакетам виходити через інтерфейс петлі:
$ sudo iptables -A OUTPUT -o lo -j ACCEPT
Щоб перевірити зміни в правилах, запустіть iptables -L -n -V:
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Увімкнення трафіку на окремих портах
Ви можете увімкнути трафік (ACCEPT або REJECT) на певних портах.
Наприклад, порти SSL, HTTP та SSH важливі для правильної роботи програм. Додайте правила ACCEPT для цих портів, щоб переконатися, що вони працюють належним чином.
Для SSL виконайте команду:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Для HTTP виконайте команду:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Для дозволу всього трафіку HTTP на інтерфейсі eth0:
$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Для SSH виконайте команду:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Для прийняття всього вхідного трафіку SSH на інтерфейсі eth0 виконайте:
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Інший приклад: увімкнення трафіку на певному порту для вашої програми. Наприклад, порт 233.
Для відкриття підключення до цього порту, запустіть:
$ sudo iptables -A INPUT -p tcp --dport 233 -j ACCEPT
Аналогічно, ви можете заблокувати з’єднання на певному порту за допомогою параметра REJECT.
Давайте заблокуємо всі з’єднання на порту 392:
$ sudo iptables -A INPUT -p tcp --dport 392 -j REJECT
Для перевірки, виконайте команду iptables -L -n -v:
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:233 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
Видалити існуючі правила
Для видалення існуючих правил виконайте команду:
$ iptables -F
або
$ iptables --flush
Якщо ви не зберегли свої правила, вони будуть втрачені назавжди і не можуть бути відновлені командою iptables -restore.
Видалити правила з номерами рядків
Для видалення певного правила потрібно спочатку отримати список правил з номерами:
$ sudo iptables -L --line-numbers
#output Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 2 ACCEPT tcp -- anywhere anywhere tcp dpt:http 3 ACCEPT tcp -- anywhere anywhere tcp dpt:https 4 ACCEPT tcp -- anywhere anywhere tcp dpt:233 5 REJECT tcp -- anywhere anywhere tcp dpt:392 reject-with icmp-port-unreachable
Для видалення правила №4 з ланцюжка INPUT виконайте команду:
$ sudo iptables -D INPUT 4
Після чого знову виконайте iptables -n -v -L:
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
Відображати лише правила ланцюга ВХІД або ВИВІД
Для виведення лише правил ланцюжка INPUT виконайте команду:
$ sudo iptables -L INPUT -n -v --line-numbers
#ouput Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 4 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
Аналогічно, для виведення правил ланцюжка OUTPUT, виконайте:
$ sudo iptables -L OUTPUT -n -v --line-numbers
#output Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
Запуск/зупинка/перезапуск брандмауера
Для