Перейти до вмісту

Модуль 3.4: iptables та netfilter

Hands-On Lab Available
Ubuntu advanced 45 min
Launch Lab ↗

Opens in Killercoda in a new tab

Основи мереж | Складність: [COMPLEX] | Час: 35–40 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після завершення цього модуля ви зможете:

  • Пояснити точки перехоплення netfilter та як правила iptables обробляються (таблиці, ланцюжки, цілі)
  • Відстежити, як Kubernetes Services використовують правила iptables для балансування навантаження (режим iptables kube-proxy)
  • Написати правила iptables для базової фільтрації пакетів, NAT та перенаправлення портів
  • Дебажити проблеми з мережевим з’єднанням, читаючи лічильники iptables та ланцюжки правил

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

iptables — це основний інструмент Linux для фільтрації та зміни пакетів. В Kubernetes він виконує колосальний обсяг роботи:

  • Kubernetes Services — ClusterIP та NodePort працюють через правила iptables.
  • Network Policies — фільтрація трафіку між подами.
  • NAT — завдяки йому контейнери мають доступ до Інтернету.
  • Балансування навантаження — стандартний режим роботи kube-proxy.

Якщо сервіси не працюють, поди не бачать один одного або трафік загадково зникає — знання iptables критично необхідне для вирішення проблем.


Netfilter — це підсистема ядра Linux, яка обробляє пакети. iptables — це програма, якою ви налаштовуєте netfilter.

Шлях пакета через ланцюжки (Chains)

Розділ «Шлях пакета через ланцюжки (Chains)»
Вхідний пакет
┌──────────────┐
│ PREROUTING │ (Зміна адреси призначення - DNAT)
└──────┬───────┘
┌────────────▼────────────┐
│ Рішення про шлях │
└────────────┬────────────┘
┌───────┴───────┐
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ INPUT │ │ FORWARD │
│ (для цього хоста) │ │ (для іншого хоста) │
└──────────┬──────────┘ └──────────┬──────────┘
│ │
▼ │
Процес на сервері │
│ │
▼ │
┌─────────────────────┐ │
│ OUTPUT │ │
│(від цього хоста) │ │
└──────────┬──────────┘ │
│ │
└────────────┬───────────┘
┌──────────────┐
│ POSTROUTING │ (Зміна адреси джерела - SNAT/Masquerade)
└──────┬───────┘
Вихідний пакет

iptables -t <таблиця> -A <ланцюжок> <критерій> -j <дія>

Приклад: дозволити вхідний SSH (порт 22) sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

  • ACCEPT — пропустити пакет.
  • DROP — тихо видалити пакет (відправник не отримає відповіді).
  • REJECT — видалити пакет і повідомити відправника помилкою.
  • LOG — записати інформацію про пакет у лог і передати наступному правилу.
  • DNAT/SNAT — зміна IP-адрес.

Kubernetes створює тисячі власних правил. Головна точка входу — ланцюжок KUBE-SERVICES.

Коли ви звертаєтеся до ClusterIP сервісу:

  1. Пакет потрапляє в KUBE-SERVICES.
  2. Знаходиться правило для конкретного сервісу.
  3. Правило перенаправляє пакет на випадковий живий под (використовуючи модуль statistic для випадкового вибору).
  4. Відбувається DNAT — адреса сервісу замінюється на реальну адресу пода.
Terminal window
# Подивитися правила Kubernetes (їх буде ДУЖЕ багато)
sudo iptables -t nat -L KUBE-SERVICES -n | head -n 20

  1. Яка таблиця в iptables відповідає за зміну адрес (NAT)?

    Відповідь Таблиця `nat`.
  2. Чим відрізняється дія DROP від REJECT?

    Відповідь DROP просто ігнорує пакет, і відправник чекає до тайм-ауту. REJECT відправляє назад повідомлення про те, що доступ заборонено, тому відправник дізнається про це миттєво.
  3. Який ланцюжок (chain) обробляє пакети, що просто проходять крізь сервер (наприклад, від контейнера до Інтернету)?

    Відповідь Ланцюжок `FORWARD`.
  4. Яка команда дозволяє зберегти всі поточні правила iptables у файл?

    Відповідь `sudo iptables-save`.

Завдання: Побачити правила фільтрації в дії.

  1. Подивіться поточні правила (за замовчуванням їх може не бути):
    Terminal window
    sudo iptables -L -n -v
  2. Тимчасово заблокуйте пінг до самого себе:
    Terminal window
    sudo iptables -A INPUT -p icmp -j DROP
    ping -c 2 127.0.0.1 # Має зависнути
  3. Видаліть це правило:
    Terminal window
    sudo iptables -D INPUT -p icmp -j DROP
    ping -c 2 127.0.0.1 # Має запрацювати
  4. Подивіться на лічильники пакетів (колонки pkts та bytes):
    Terminal window
    sudo iptables -L -n -v

Критерії успіху: Ви розумієте, як правила впливають на проходження трафіку.


  • netfilter — двигун у ядрі, iptables — пульт керування.
  • 5 ланцюжків покривають весь шлях пакета крізь систему.
  • Kubernetes майже повністю покладається на iptables для роботи мережі.
  • Порядок правил має значення — пакет перевіряється зверху вниз до першого збігу.

Трек «Мережі» завершено! Тепер ви розумієте, як дані подорожують від вашого браузера до контейнера всередині кластера Kubernetes.

Далі: Розділ 4: Безпека та зміцнення системи (Security/Hardening) — дізнайтеся, як захистити Linux від зламу.