303
484
7 Июн 2016
Основы работы с iptables.

Думаю многие администраторы Linux сталкивались хотя бы раз с такой утилитой как iptables, не важно что это было: ограничение доступа извне, порт-форвардинг или маскарад. Но найдя руководство для конкретной задачи были разочарованы, примеры просто не работали. В этой статье я попробую рассказать суть работы этой утилиты и основы для ее успешного применения.

Введение.
Все пакеты приходящие на сетевую карту проходят все 5(7) уровней модели OSI, iptables начинает обработку пакетов с 3-го(сетевого) уровня, после того как пакет по кабелю попал на сетевую карту, он передается в ядро ОС, а именно в netfilter, далее пакет проходит ряд таблиц и только после этого попадает в приложение(или не попадает, если пакет шел транзитом), которому он был адресован. Именно таблицами и правилами netfilter`а управляет утилита iptables.

Таблицы и цепочки.
В iptables существуют 3 таблицы:

filter - Используется для фильтрации входящего, транзитного и исходящего трафика, имеет 3 цепочки
INPUT - сюда попадает все входящие пакеты
FORWARD - сюда попадают пакеты предназначенные другой машине в сети
OUTPUT - все исходящие пакеты
Над пакетамми проходящими в таблице filter можно делать следующие действия:
DROP - блокировать пакет
ACCEPT - разрешить(пропустить далее) пакет.
Это таблица используется по умолчанию.

nat - Используется для трансляции сетевых адресов(NAT)
PREROUTING - используется для DNAT(трансляция адреса назначения)
POSTROUTING - тут происходит SNAT(Изменение Сетевого Адреса Отправителя)
OUTPUT - Все исходящие из этой цепочки пакеты
Действия, используемые в этой цепочке:
DNAT - как уже упоминалось, используется для трансляции адреса назначения, использую это действие, мы можем пробросить порт, либо целую машину в другую сеть.
SNAT - изменяет исходные адреса пакетов, используется для того, чтобы машины в локальной сети имели доступ в интернет(в случае если наш компьютер - роутер)
MASQUERADE - по сути тоже самое, что и SNAT, только считается что больше нагружает систему. Если у вас выделенный ip - динамический, то нужно использовать именно его, если не хотите каждый раз переписывать правила SNAT.

mangle - Таблица для изменения заголовков пакетов. Имеет цепочки: PREROUTING, FORWARD, OUTPUT, POSTROUTING. У всех цепочек роль одна - вносить изменения в заголовок пакета на различных стадиях движения этого пакета через цепочки iptables. Над этими пакетами можно проводить действия TOS, TTL, MARK.

С точки зрения iptables трафик бывает 3х типов:
Входящий
Транзитный
Исходящий
Движение пакета происходит в следующей последовательности
i3326_iptables.png

После прохождения nat(PREROUTING), основываясь на записях в mangle(PREROUTING) и nat(PREROUTING), ядро принимает решение какой будет трафик, входящим или транзитным. Если трафик оказался транзитным, то идем в цепочку mangle(FORWARD),
если входящим, то в mangle(INPUT).
1. Входящий трафик - данные, которые принимает приложение запущенное на компьютере
2. Исходящий трафик - трафик, который передает приложение через сеть
3. Транзитный трафик - трафик, который проходит через наш компьютер другим(в случае если наш компьютер работает как маршрутизатор)

Работа с iptables.
Теперь после того, как мы имеем представление как течет через нас трафик, мы можем что-нибудь с ним сделать.

Основные ключи iptables:
-t (--table
) <таблица> - правило указывает таблицу, в которую будут вноситься изменения, без указания этого ключа используется таблица filter
-A (--append) <цепочка> - добавление новой записи в конец цепочки
-D (--delete) <цепочка> - удаление правила
-I (--insert) <цепочка> <номер> - вставляет правило над цепочкой с указанным номером
-R (--replace) <цепочка> <номер> - заменяет определенные критерии цепочки с номером <номер>
-L (--list) <цепочка> - листинг правил цепочки
-F (--flush) <цепочка> - удаление всех правил из цепочки
-P (--policy) <цепочка> - задать действие по умолчанию, действие будет выполняться на все пакеты, которые не подошли по каким-либо параметрам в другие правила.

Ключи классификации и выделения пакетов
-p (--protocol)
- используется для указания конкретного протокола для обработки, список всех протоколов можно посмотреть в /etc/protocols/
-s(--src, --source) - адрес исходящих пакетов для фильтрации.
-d (--dst, --destination) - адрес назначения пакетов для фильтрации.
-i (--in-interface) - интерфейс с которого приходит пакет
-o (--out-interface) - интерфейс на который уходит пакет
--sport (--source-port) (может использоваться с ключами -p tcp и -p udp) - порт с которого был отправлен пакет
--dport (--destination-port) (может использоваться с ключами -p tcp и -p udp) - порт на который отправляется пакет
Так же есть ключ, который указывается, когда мы работаем с протоколом icmp (-p icmp):
--icmp-type <тип icmp пакета> - указывается над каким конкретно типом ICMP пакета проводить операцию. Типы ICMP описаны в RFC 792.