Налаштування Linux-файрволу за допомогою iptables в CentOS / RHEL 7

У цій статті ми покажемо, як керувати файерволом Linux за допомогою классіческгого iptables замість firewalld в CentOS / RHEL 7 для фільтрації вхідного і вихідного трафіку. У цій статті розглянуто налаштування iptables на CentOS 7 для фільтрації вхідного трафіку, на прикладі розгорнутого з нуля хмарного віртуального сервера myserver01, доступного з Інтернету.

зміст:

  • Відключення firewalld в CentOS 7
  • Синтаксис і правила iptables в CentOS / Red Hat
  • Створення правил фільтрації трафіку в iptables
  • Включити логи iptables
  • Збереження і відновлення правил фільтрації iptables

Відключення firewalld в CentOS 7

У CentOS 7 для управління файрволом за замовчуванням використовується системна служба firewalld. Вона надає свій інтерфейс, але в підсумку також працює через утиліту iptables. При цьому управління файроволом має здійснюватися або через firewalld, або безпосередньо через iptables.

firewalld не заміна, а обгортка навколо iptables, користуватися з цього можна тим, що більше подобається, або більше підходить в конкретних умовах. iptables більш універсальний, це базовий інструмент, але він трохи складніше в освоєнні. firewalld надає більш простий інтерфейс, але, наприклад, в CentOS 6 скористатися ним не вийде, та й для інших дистрибутивів необхідна наявність потрібних настановних пакетів. До того ж, якщо ви використовуєте програми, які виробляють свої настройки в брандмауера, вони повинні бути сумісні з firewalld (приклад таких додатків docker, fail2ban).

Перевіримо статус firewalld і відключимо його.

systemctl status firewalld

У висновку команди обведена червоним область зі словом enabled, означає включену автозагрузку, а область, обведена жовтим, зі словом active, означає, що служба запущена.

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

systemctl stop firewalld
systemctl disable firewalld

Повторно перевіряємо статус:

Тепер висновок команди показує disabled для автозагрукі (вимкнена), і inactive означає, що служба виключена.

Синтаксис і правила iptables в CentOS / Red Hat

Iptables - це утиліта, за допомогою якої налаштовуються правила для брандмауера в Linux.

Iptables групує правила файрвола в таблицях, основні це:

  • Таблиця filter - використовується для фільтрації трафіку, тобто дозволу і заборони з'єднань
  • Таблиця nat - використовується для перетворення адрес (NAT)
  • Таблиця mangle - інші модифікації заголовків ip пакетів.

Для початку перевіримо, що iptables встановлений в системі (повинен бути замовчуванням):

rpm -q iptables

Висновок команди показує, що поточна встановлена ​​версія iptables - 1.4.21.

Робота з iptables в командному рядку вимагає root привілеїв, тому далі будемо працювати під користувачем root.

Щоб вивести поточні правила, виконаємо команду:

iptables [-T таблиця] -L [ланцюжок] [параметри]

Примітка: якщо не вказати назву таблиці при виклику команди, за замовчуванням використовується таблиця filter.

Наприклад, результат команди iptables -L, коли в таблицях ще не створено правил:

Розглянемо висновок команди докладніше.

Таблиця filter містить три типи правил, так звані chain (ланцюжки):

  • INPUT - в цьому ланцюжку обробляються входять ip пакети, призначені для самого хоста;
  • OUTPUT - в цьому ланцюжку обробляються вихідні ip пакети від самого хоста;
  • FORWARD - цей ланцюжок потрібна для перенаправлення ip пакетів. Використовується, якщо ви хочете використовувати сервер, як маршрутизатор.

Навпаки кожного ланцюжка вказана політика за замовчуванням (policy), яка визначає, що потрібно робити, в разі, якщо з'єднання не потрапило ні в одне з правил. Політика за замовчуванням може приймати два значення і визначає сам підхід до організації файрволу:

  • ACCEPT - за замовчуванням всі з'єднання дозволені, правилами блокуються небажані з'єднання;
  • DROP - за замовчуванням всі з'єднання заборонені, правилами вирішуються потрібні з'єднання.

Створення правил фільтрації трафіку в iptables

Фільтр iptables по інтерфейсу

Почнемо створювати правила. Синтаксис команди для додавання нового правила в кінець зазначеної ланцюжка виглядає так:

iptables [-t таблиця] -A -j

Для початку, дозволимо трафік через локальний loopback інтерфейс (127.0.0.1), що необхідно для роботи деяких додатків:

iptables -A INPUT -i lo -j ACCEPT

Розберемо по порядку:

  1. Ми вказуємо ланцюжок INPUT, тобто правило буде застосовуватися для вхідних з'єднань.
  2. Далі, використовуємо ключ -i (-in-interface), щоб визначити вхідний інтерфейс, на який приходить ip пакет.
  3. Завершуємо команду ключем -j (-jump), визначальним дію, яка буде виконана для всіх ip пакетів, відповідають критерію з пункту 2. У даному випадку ACCEPT - дозволити з'єднання. Крім того, до основних дій з сполуками також відносяться:
    • DROP - заборонити з'єднання, джерело з'єднання не інформують, ip пакет просто відкидається;
    • REJECT - заборонити з'єднання, джерело з'єднання інформується повідомленням.

Фільтр iptables по порту, протоколу або IP адресою

Тепер додамо дозволяє правило для підключення до нашого Linux сервера по SSH на порт 22.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

У цьому правилі критеріями є порт і протокол. Протокол (tcp, udp, icmp, all) задається ключем -p (-protocol), порт призначення (тобто порт на який будуть приходити ip пакети до сервера) -dport.

Примітка: Якщо ви хочете використовувати в умовах порт призначення або порт джерело (-dport або -sport), То вказувати протокол обов'язково.

Припустимо вказувати діапазон портів через двокрапку, наприклад

--dport 6000: 6063

Якщо нам відомі ip адреси клієнтів, з яких ми буде підключатися до сервера, більш безпечним буде дозволити доступ тільки з цих ip адрес. В цьому випадку, в критерії потрібно додати ключ -s (-src, -source), що задає ip адресу або підмережу джерела з'єднання, наприклад, таким правилом:

iptables -A INPUT -p tcp -s 94.41.174.122 --dport 22 -j ACCEPT

доступ на 22 порт буде дозволений тільки з ip адреси 94.41.174.122.

Частково дозволимо icmp запити, 3-х типів:

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Ці правила дозволяють роботу утиліт ping, traceroute і дозволяють працювати механізму для визначення MTU між двома хостами.

Фільтр iptables станом з'єднання

Для коректної роботи потрібно створити правило, яке дозволяє вже встановлені з'єднання:

iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

Тут в критерії використовується ключ -m, для завантаження модуля state, який дає можливість визначити поточний стан ip пакета з можливих:

  • NEW - відноситься до вхідних ip пакетам, які беруть участь в установці з'єднання;
  • ESTABLISHED і RELATED - відноситься до вхідних ip пакетам, які беруть участь у вже встановлених з'єднаннях, або з'єднаннях, ініційованих з уже встановлених (пов'язані з'єднання);
  • INVALID - відноситься до вхідних ip пакетів, якщо до них не може бути застосовано жодне із зазначених вище станів.

Завдання політики iptables за замовчуванням

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

iptables -P INPUT DROP

Увага: Перш ніж використовувати цю команду, необхідно переконатися, що ваші поточні правила дозволяють вам підключитися до сервера, інакше ви просто заблокуєте собі доступ!
Подивимося на результатурующую таблицю правил iptables, додамо ключ -v, щоб показати більш детальний висновок:
iptables -L -v

Включити логи iptables

Iptables дозволяє записувати інформацію про проходять ip пакетах в системний журнал. Реалізується це за допомогою специфічного дії LOG над з'єднанням, після якого, ip пакет продовжує рух по ланцюжку недоторканим. Для прикладу, створимо правило, яке буде записувати в системний журнал всі події з'єднань на порт 445 (tcp):

iptables -A INPUT -p tcp --dport 445 -j LOG --log-prefix "IN SMB DROP:"

тут -log-prefix задає префікс для всіх повідомлень, логіруемих нашим правилом. Це зручно, якщо у вас кілька різних правил логування, або для подальшої програмної обробки. Якщо тепер спробувати підключитися зовні до нашого сервера на порт 445, наприклад через telnet, в файлі / Var / log / messages з'являться записи:

Розберемо висновок:

  • IN SMB DROP: Префікс, який ми задали опцією -log-prefix
  • IN = eth0 інтерфейс, на який прийнятий ip пакет, для вихідних з'єднань містить пусте значення
  • OUT = інтерфейс, з якого відправлений ip пакет, для вхідних з'єднань, містить пусте значення
  • MAC = з'єднані разом в наступному порядку: MAC-адресу призначення, MAC-адресу джерела, EtherType - 8:00 відповідає IPv4.
  • SRC = ip адресу джерела, від якого відправлений ip пакет
  • DST = ip адреса призначення, на який відправлено ip пакет
  • LEN = розмір ip пакета в байтах
  • SPT = порт джерела, від якого відправлений ip пакет
  • DPT = порт призначення, на який відправлено ip пакет

Збереження і відновлення правил фільтрації iptables

У висновку, налаштуємо автозагрузку правил, після перезавантаження сервера. Для цього повинен бути встановлений пакет iptables-services і активований сервіс. Встановимо пакет через yum:

yum install iptables-services
systemctl enable iptables

Перевіримо статус служби iptables:

systemctl status iptables

Параметр автозавантаження встановлений в enabled (Включена), параметр active вказує, що служба запущена.

При завантаженні сервіс буде читати вміст файлу / Etc / sysconfig / iptables, і відновлювати збережені правила. Щоб зберегти в нього наші правила, скористаємося командою:

iptables-save> / etc / sysconfig / iptables

Можна відновити правила з файлу командою:

iptables-restore < /etc/sysconfig/iptables

Тепер можна перезавантажити сервер, і переконатися, що правила брандмауера відновилися при завантаженні.

У наступній статті ми покажемо, як використовувати iptables для створення NAT правил перенаправлення трафіку для шлюзу-доступу на базі CentOS з / у внутрішню мережу організації.