"Oskar Andreasson. Iptables Tutorial 1.1.19 " - читать интересную книгу автора

В данной главе все внимание будет уделено механизму определения
состояний пакетов (state machine). По прочтении ее у вас должно сложиться
достаточно четкое представление о работе механизма, а способствовать этому
должен значительный объем поясняющих примеров.

4.1. Введение

Механизм определения состояния (state machine) является отдельной
частью iptables и в действительности не должен бы так называться, поскольку
фактически является механизмом трассировки соединений. Однако значительному
количеству людей он известен именно как "механизм определения состояния"
(state machine). В данной главе эти названия будут использоваться как
синонимы. Трассировщик соединений создан для того, чтобы netfilter мог
постоянно иметь информацию о состоянии каждого конкретного соединения.
Наличие трассировщика позволяет создавать более надежные наборы правил по
сравнению с брандмауэрами, которые не имеют поддержки такого механизма.
В пределах iptables, соединение может иметь одно из 4-х базовых
состояний: NEW, ESTABLISHED, RELATED и INVALID. Позднее мы остановимся на
каждом из них более подробно. Для управления прохождением пакетов,
основываясь на их состоянии, используется критерий -state.
Трассировка соединений производится специальным кодом в пространстве
ядра - трассировщиком (conntrack). Код трассировщика может быть
скомпилирован как подгружаемый модуль ядра, так и статически связан с ядром.
В большинстве случаев нам потребна более специфичная информация о
соединении, чем та, которую поставляет трассировщик по-умолчанию. Поэтому
трассировщик включает в себя обработчики различных протоколов, например TCP,
UDP или ICMP. Собранная ими информация затем используется для идентификации
и определения текущего состояния соединения. Например - соединение по
протоколу UDP однозначно идентифицируется по IP-адресам и портам источника и
приемника.
В предыдущих версиях ядра имелась возможность включения/выключения
поддержки дефрагментации пакетов. Однако, после того как трассировка
соединений была включена в состав iptables/netfilter, надобность в этом
отпала. Причина в том, что трассировщик не в состоянии выполнять возложенные
на него функции без поддержки дефрагментации и поэтому она включена
постоянно. Ее нельзя отключить иначе как отключив трассировку соединений.
Дефрагментация выполняется всегда, если трассировщик включен.
Трассировка соединений производится в цепочке PREROUTING, исключая
случаи, когда пакеты создаются локальными процессами на брандмауэре, в этом
случае трассировка производится в цепочке OUTPUT. Это означает, что iptables
производит все вычисления, связанные с определением состояния, в пределах
этих цепочек. Когда локальный процесс на брандмауэре отправляет первый пакет
из потока, то в цепочке OUTPUT ему присваивается состояние NEW, а когда
возвращается пакет ответа, то состояние соединения в цепочке PREROUTING
изменяется на ESTABLISHED, и так далее. Если же соединение устанавливается
извне, то состояние NEW присваивается первому пакету из потока в цепочке
PREROUTING. Таким образом, определение состояния пакетов производится в
пределах цепочек PREROUTING и OUTPUT таблицы nat.

4.2. Таблица трассировщика