25+ найпоширеніших команд iptables із прикладами

Для користувачів операційної системи 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

Запуск/зупинка/перезапуск брандмауера

Для