middle
Что такое iptables и как работает фильтрация трафика?
iptables — утилита для управления встроенным в ядро Linux межсетевым экраном (Netfilter), позволяющая задавать правила фильтрации, NAT и модификации сетевых пакетов.
Аналогия: iptables — это охранник на проходной с таблицей правил: кого пускать, кого нет и куда направлять. Каждый пакет проходит проверку по списку правил сверху вниз, и первое совпавшее правило определяет судьбу пакета.
Таблицы (tables)
| Таблица | Назначение |
|---|---|
| filter | Фильтрация пакетов (разрешить/запретить). Используется по умолчанию |
| nat | Трансляция сетевых адресов (SNAT, DNAT, MASQUERADE) |
| mangle | Модификация заголовков пакетов (TTL, TOS, маркировка) |
| raw | Обработка пакетов до отслеживания соединений (conntrack) |
Цепочки (chains) таблицы filter
| Цепочка | Когда применяется |
|---|---|
| INPUT | Входящие пакеты, адресованные этому серверу |
| OUTPUT | Исходящие пакеты от этого сервера |
| FORWARD | Пакеты, проходящие через сервер транзитом (маршрутизация) |
Основные команды
Пример
# Просмотр всех правил
sudo iptables -L -n -v
# Просмотр правил с номерами строк
sudo iptables -L -n --line-numbers
# Просмотр правил таблицы nat
sudo iptables -t nat -L -n -v
Примеры правил фильтрации
Пример
# Разрешить входящие SSH-подключения
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Разрешить входящий трафик на порт 8080 (Java-приложение)
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# Разрешить подключения только из определённой подсети
sudo iptables -A INPUT -s 10.10.0.0/16 -p tcp --dport 5432 -j ACCEPT
# Запретить все остальные подключения к PostgreSQL
sudo iptables -A INPUT -p tcp --dport 5432 -j DROP
# Разрешить loopback-трафик
sudo iptables -A INPUT -i lo -j ACCEPT
# Разрешить уже установленные и связанные соединения
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Пример базовой конфигурации для сервера приложений
Полный набор правил iptables
# Сброс всех правил
sudo iptables -F
sudo iptables -X
# Политики по умолчанию: всё запретить
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# Разрешить loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Разрешить установленные соединения
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH только из управляющей подсети
sudo iptables -A INPUT -s 10.0.1.0/24 -p tcp --dport 22 -j ACCEPT
# HTTP/HTTPS от балансировщика нагрузки
sudo iptables -A INPUT -s 10.0.10.0/24 -p tcp --dport 8080 -j ACCEPT
# Мониторинг (Prometheus metrics)
sudo iptables -A INPUT -s 10.0.20.0/24 -p tcp --dport 9090 -j ACCEPT
# Логирование заблокированных пакетов
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
sudo iptables -A INPUT -j DROP
NAT — трансляция адресов
Пример
# Перенаправление порта 80 на внутренний сервер 192.168.1.10:8080 (DNAT)
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080
# Маскарадинг для выхода в интернет через NAT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Сохранение правил
Пример
# Установить пакет для сохранения
sudo apt install iptables-persistent
# Сохранить текущие правила
sudo netfilter-persistent save
# Файлы правил: /etc/iptables/rules.v4, /etc/iptables/rules.v6
На собеседовании: интервьюер ожидает понимание таблиц (filter, nat) и цепочек (INPUT, OUTPUT, FORWARD), а также умение составить базовый набор правил. Частая ошибка — не упомянуть порядок обработки правил (сверху вниз) и правило для ESTABLISHED-соединений.