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

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

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

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

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

systemctl status firewalld

systemctl status firewalld в centos 7

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

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

systemctl stop firewalld
systemctl disable firewalld

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

firewalld відключити в centos

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

Правила синтаксису та iptables у CentOS / Red Hat

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

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

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

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

rpm -q iptables

rpm -q iptables - версія iptables в centos

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

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

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

iptables [-t таблица] -L [цепочка] [параметры]

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

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

iptables -L - таблиці правил брандмауера в centos redhat

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

Таблиця фільтр містить три типи правил, так звані 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 (—в інтерфейсі), Щоб визначити вхідний інтерфейс, на який приходить ip пакет.
  3. Завершуємо команду ключем -j (—скачок), Що визначає дію, яке буде виконано для всіх 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 (протокол), Порт призначення (тобто порт на який будуть приходити ip пакети до сервера) –dport.

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

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

--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

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

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

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

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

iptables -P INPUT DROP

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

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

iptables -L -v

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

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

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

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

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

  • IN SMB DROP: Префікс, який ми задали опцією —Префікс журналу
  • 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-послуги і активований сервіс. Встановимо пакет через yum:

yum install iptables-services
systemctl enable iptables

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

systemctl status iptables

systemctl увімкнути iptables -

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

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

iptables-save > /etc/sysconfig/iptables

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

iptables-restore < /etc/sysconfig/iptables

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *