Iptables мережна безпека та фільтрація пакетів - Centos - Laquo; Unix, Linux – Laquo; нотатки

Основне завдання файрвола (міжмережевого екрану) – фільтрація та обробка пакетів, що проходять через мережу. При аналізі вхідного пакета файрвол приймає рішення про долю цього пакета: викинути пакет (DROP), прийняти пакет (ACCEPT) або зробити з ним щось.

У Linux файрвол є модулем ядра, званим netfilter і є набором хуков (hooks) до роботи з мережевим стеком. Інтерфейсом для модифікації правил, якими файрвол обробляє пакети, служить утиліта iptables для IPv4 і утиліта ip6tables для IPv6.

Всю роботу з фільтрації трафіку виконує ядро ​​системи. Iptables не є демоном і не створює нових процесів у системі. Увімкнення або вимкнення iptables це лише відправка сигналу в ядро. Велика швидкість фільтрації досягається рахунок аналізу лише заголовків пакетів.

До основних можливостей iptables належать:

  1. Процес роботи iptables
  2. Таблиця mangle
  3. Таблиця nat
  4. Таблиця filter
  5. Утиліта iptables
  6. Приклади команд iptables
  7. Захист від DDoS за допомогою iptables
  8. Балансування навантаження за допомогою iptables
  9. Надбудови, GUI до iptables
  10. Додаткове чтиво

Процес роботи iptables

Розглянемо основний процес роботи iptables (джерело картинки rigacci.org). Вхідний пакет спочатку потрапляє на мережевий пристрій, після чого він перехоплюється драйвером і передається в ядро. Після цього пакет пропускається через ряд таблиць і потім передається локальному додатку чи перенаправляється в іншу систему, якщо це транзитний пакет.

В iptables використовується три види таблиць:

Основне призначення таблиці mangle - внесення змін до заголовкапакет. У цій таблиці можуть виконуватися такі дії:

  • встановлення біта Type Of Service;
  • встановлення поля Time To Live;
  • встановлення мітки на пакет, яка може бути перевірена за іншими правилами;

Ланцюжки в таблиці mangle:

  • PREROUTING - використовується для внесення змін до пакетів на вході в iptables, перед прийняттям рішення про маршрутизацію;
  • POSTROUTING — використовується для внесення змін до пакетів на виході з iptables після прийняття рішення про маршрутизацію;
  • INPUT — використовується для внесення змін до пакетів, перед тим як вони будуть передані до локальної програми;
  • OUTPUT - використовується для внесення змін до пакетів, що надходять від програми всередині iptables;
  • FORWARD - використовується для внесення змін до транзитних пакетів;

Ланцюжки у цій таблиці:

Таблиця використовується для фільтрації пакетів. У цій таблиці є три ланцюжки:

  1. INPUT – ланцюжок для вхідних пакетів;
  2. FORWARD – ланцюжок для пакетів, що пересилаються (транзитних);
  3. OUTPUT – ланцюжок для вихідних пакетів;

Пакет, що проходить через ці ланцюжки може піддаватися діям: ACCEPT, DROP, REJECT, LOG.

Підсумуємо, пакет, що прибув, проходить по ланцюжку правил. Кожне правило містить умову та мету (дія). Якщо пакет задовольняє умові, то він передається на ціль, інакше до пакета застосовується таке правило в ланцюжку. Якщо пакет не задовольнив жодній з умов у ланцюжку, то до нього застосовується стандартна дія.

Відновлення правил із файлу

Кожне правило в iptables - це окремий рядок, сформований за певними правилами і містить критерії та дії. У загальному вигляді правило має такийформат:

  • t table - задає ім'я таблиці, для якої буде створено правило;
  • command – команда, яка визначає дію iptables – додати правило, видалити правило тощо;
  • match - задає критерії перевірки, за якими визначається, чи потрапляє пакет під дію правила чи ні;
  • target/jump - яка дія має бути виконана при виконанні критерію;

  • -A - додавання правила в ланцюжок, правило буде додано до кінця ланцюжка;
  • -D – видалення правила з ланцюжка;
  • -R – замінити одне правило іншим;
  • -I - вставити нове правило в ланцюжок;
  • -L - виведення списку правил у заданому ланцюжку;
  • -F - скидання всіх правил у заданому ланцюжку;
  • -Z - обнулення всіх лічильників у заданому ланцюжку;
  • -N - створення нового ланцюжка із заданим ім'ям;
  • -X – видалення ланцюжка;
  • -P - задає політику за умовчанням для ланцюжка;
  • -E - перейменування користувальницького ланцюжка;

Приклади команд iptables

Пакети можна фільтрувати за такими параметрами:

Для фільтрації джерелом використовується опція -s . Наприклад, заборонимо всі вхідні пакети з вузла 192.168.1.95:

Також можна вказати цілу під мережу:

Також можна використовувати заперечення (знак !). Наприклад, всі пакети з хостів, відмінних від 192.168.1.96, будуть знищуватися:

Дозволяємо ходіння трафіку по localhost:

Логуємо спроби спуфінгу з префіксом "IP_SPOOF A:" і дропаємо з'єднання

Для цього потрібно використовувати опцію -d. Наприклад, заборонимо всі вихідні пакети на хост 192.168.1.95:

Заборонити доступ до ресурсу

Опція -p вказує на протокол. Можна використовувати all, icmp, tcp, udp або номер протоколу (з /etc/protocols).

Дозволяємовхідні луна-запити

Дозволяємо всі вихідні пакети з порту 80:

Заблокувати всі запити порту 80:

Для вказівки порту необхідно вказати протокол (tcp чи udp). Можна використовувати заперечення.

Відкрити діапазон портів

Дозволити підключення через HTTP

Дозволити підключення по SSH

Дозволяється отримувати дані від DHCP-сервера

Дозволяємо rsync з певної мережі

Дозволяється IMAP/IMAP2 трафік

Дозволити вихідні HTTP, FTP, DNS, SSH, SMTP

Дозволяємо mysql для локальних користувачів

Дозволити CUPS (сервер друку, порт 631) для користувачів усередині локальної мережі

Дозволити синхронізацію часу NTP для користувачів у локальній мережі

Дозволити вихідний Google Talk

Для прикладу направимо трафік з порту 442 на 22, це означає, що вхідні ssh-з'єднання можуть бути прийнятими з порту 422 і 22.

Також треба дозволити вхідні з'єднання з порту 422

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

Дії над пакетами

Для вказівки дії (мети) із пакетом служить опція -j . Основні дії:

Різниця міжDROPтаREJECT(джерело)

DROP– просто закриває з'єднання і не надсилає нічого у відповідь відправнику. Як результат маємо "мертве" з'єднання, яке потім вбивається по таймууту, але при скануванні закритих портів вони будуть помічатись як filtered, що потенційно каже, що щось таки слухає порт.

REJECT– скидає з'єднання та відправляє у відповідь повідомлення, вказане в опції –reject-with. За замовчуванням відправляється host is unreachable. Проте при скануванні (якщо встановлено –reject-with icmp-port-unreachable) портсвітитись не буде.

Так що ж все-таки використовувати? На мій погляд, краще за DROP, тому що при великих атаках, ви просто перекриєте собі кисень, відповідаючи всім «host is unreachable». Ця відповідь буде споживати більше ресурсів, ніж мертве з'єднання (за бажанням час таймууту можна скоротити).

В якості дії можна вказати і ім'я ланцюжка користувача. Наприклад перекинемо всі пакети з локальної мережі в ланцюжок, де проводитиметься додаткова перевірка:

Приклад базового набору правил

У більшості випадків кінцевому користувачеві (робоча станція) достатньо виконати таку послідовність команд:

У iptables є можливість підключати модулі, для цього використовується опція -m.

Модуль limit призначений для обмеження навантаження, наприклад:

Дозволяємо підтримувати відкритими вже встановлені з'єднання

Список поточних правил

Очищення всіх правил

Очищення правил у ланцюжку

Видалення п'ятого правила в ланцюжку INPUT:

Захист від DDoS за допомогою iptables

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

Збір інформації про мережеві з'єднання

Перегляд відкритих з'єднань

Кількість підключень до 80 порту

TCP-дамп підключень (на який домен найчастіше йдуть запити)

SYN-флуд можна перевірити через підрахунок числа напіввідкритих TCP-з'єднань

Захист від різних видів флуду.

ICMP-флуд. Дуже примітивний метод забивання смуги пропускання та створення навантажень на мережевий стек через монотонне надсилання запитів ICMP ECHO (пінг). Легко можна знайти за допомогою аналізу потоку трафіку в обидві сторони: під час атаки типу ICMP-флуд вони практично ідентичні. Майже безболісний спосіб абсолютного захисту ґрунтується на відключенні відповідей на запити ICMP ECHO:

Або за допомогою iptabels:

Оборонні заходи зазвичай включають:

Збільшення черги "напіввідкритих" TCP-з'єднань:

Зменшення часу утримання "напіввідкритих" з'єднань:

Увімкнення механізму TCP syncookies:

Обмеження максимального числа "напіввідкритих" з'єднань з одного ІР до конкретного порту:

UDP-флуд. Типовий метод захаращення смуги пропускання. Заснований на нескінченному посиланні UDP-пакетів на порти різних UDP-сервісів. Легко усувається за рахунок відрізання таких сервісів від зовнішнього світу та встановлення ліміту на кількість з'єднань в одиницю часу до DNS-сервера на стороні шлюзу:

HTTP-флуд. Один із найпоширеніших на сьогоднішній день способів флуду. Заснований на нескінченній посилці HTTP-повідомлень GET на 80-й порт з метою завантажити web-сервер настільки, щоб він виявився не в змозі обробляти всі інші запити. Часто метою флуду стає не корінь web-сервера, а один із скриптів, що виконують ресурсомісткі завдання або працює з базою даних. У будь-якому випадку, індикатором атаки, що почалася, буде служити аномально швидке зростання логів web-сервера.

Або відразу по підмережах:

Для обмеження кількості одночасних підключень до сервера для клієнта IP використовується модуль connlimit. Обмежимо кількість паралельних підключень по SSH до трьох для одного клієнта

Обмежимо кількістьпаралельних підключень по HTTP до трьох, для одного клієнта

  • --connlimit-above 10 - умова для перевірки одночасних підключеньне більше 10;
  • --connlimit-mask 24 - угруповання хостів по довжині префікса (для IPv4 це число має бути 0 та 32;

Також обмежити кількість підключень за одиницю часу можна за допомогою модуля limit.

  • -m limit – підключаємо модуль limit;
  • –limit 25/minute - поріг у 25 підключень за хвилину;
  • -limit-burst 100 - умова включення порога: після досягнення 100 підключень;

Корисні поради

Додай до /etc/sysctl.conf наступні рядки:

Цікавий матеріал на тему - Доступні методи боротьби з DDoS-атаками для власників vds/dedicated серверів з Linux.

Балансування навантаження за допомогою iptables

  • Балансування вхідних з'єднань на iptables

Надбудови, GUI до iptables

  • Vuurmuur
  • Конфігурування iptables за допомогою ferm
  • Advanced Firewall Configurations with ipset

Перевірити налаштування iptables можна за допомогою nmap.