Глубокое исследование архитектуры Iptables и Netfilter

Введение

Брандмауэры – важный инструмент, который можно настроить для защиты ваших серверов и инфраструктуры. В экосистеме Linux iptables – это широко используемый инструмент брандмауэра, который работает с фреймворком фильтрации пакетов netfilter ядра. Создание надежных политик брандмауэра может быть сложным из-за сложного синтаксиса и большого количества взаимосвязанных частей.

В этом руководстве мы погрузимся в архитектуру iptables с целью сделать ее более понятной для пользователей, которым необходимо создать свои собственные политики брандмауэра. Мы обсудим, как iptables взаимодействует с netfilter и как различные компоненты взаимодействуют между собой для обеспечения комплексной системы фильтрации.

Что такое IPTables и Netfilter?

В течение многих лет самым распространенным программным обеспечением брандмауэра в Linux был iptables. В некоторых дистрибутивах его заменил новый инструмент, называемый nftables, но синтаксис iptables все еще широко используется в качестве базовой основы. Брандмауэр iptables взаимодействует с точками фильтрации пакетов в сетевом стеке ядра Linux. Эти точки, известные как фреймворк netfilter,

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

Точки фреймворка Netfilter

Существует пять точек netfilter, на которые могут регистрироваться программы. По мере прохождения пакетов через стек они активируют ядровые модули, зарегистрированные на этих точках. Точки, которые активирует пакет, зависят от того, входящий ли это или исходящий пакет, его назначения и был ли пакет отброшен или отклонен на предыдущем этапе.

Следующие точки представляют собой эти четко определенные моменты в сетевом стеке:

  • NF_IP_PRE_ROUTING: Этот хук будет срабатывать при любом входящем трафике сразу после его поступления в стек сети. Этот хук обрабатывается до принятия каких-либо решений о маршрутизации относительно того, куда отправить пакет.
  • NF_IP_LOCAL_IN: Этот хук срабатывает после того, как входящий пакет был маршрутизирован, если пакет предназначен для локальной системы.
  • NF_IP_FORWARD: Этот хук срабатывает после того, как входящий пакет был маршрутизирован, если пакет должен быть перенаправлен на другой хост.
  • NF_IP_LOCAL_OUT: Этот хук срабатывает при любом локально созданном исходящем трафике сразу после его поступления в стек сети.
  • NF_IP_POST_ROUTING: Этот хук срабатывает при любом исходящем или перенаправленном трафике после выполнения маршрутизации и непосредственно перед отправкой на провод.

Ядру необходимо зарегистрировать в этих хуках модули, которые также должны предоставить номер приоритета, чтобы определить порядок их вызова при срабатывании хука. Это обеспечивает возможность подключения нескольких модулей (или нескольких экземпляров одного и того же модуля) к каждому из хуков с детерминированным порядком. Каждый модуль будет вызван поочередно и вернет решение фреймворку netfilter после обработки, указывающее, что следует делать с пакетом.

Таблицы и цепочки IPTables

iptables брандмауэр использует таблицы для организации своих правил. Эти таблицы классифицируют правила в соответствии с типом принимаемых ими решений. Например, если правило относится к трансляции сетевого адреса, оно будет помещено в таблицу nat. Если правило используется для принятия решения о том, разрешить ли пакет продолжить свой путь к месту назначения, оно, вероятно, будет добавлено в таблицу filter.

В каждой таблице iptables правила дополнительно организованы в отдельные “цепи”. В то время как таблицы определяются общей целью правил, которые они содержат, встроенные цепи представляют собой крючки netfilter, которые их активируют. Цепи определяют когда будут оценены правила.

Названия встроенных цепей отражают названия крючков netfilter, с которыми они связаны:

  • PREROUTING: Активируется крючком NF_IP_PRE_ROUTING.
  • INPUT: Активируется крючком NF_IP_LOCAL_IN.
  • FORWARD: Активируется крючком NF_IP_FORWARD.
  • OUTPUT: Активируется крючком NF_IP_LOCAL_OUT.
  • POSTROUTING: Активируется крючком NF_IP_POST_ROUTING.

Цепи позволяют администратору контролировать, где в пути доставки пакета будет оценено правило. Поскольку у каждой таблицы есть несколько цепей, влияние таблицы может проявляться в нескольких точках обработки. Поскольку определенные типы решений имеют смысл только в определенных точках сетевого стека, не у каждой таблицы будет зарегистрирована цепь с каждым крючком ядра.

Есть всего пять крючков ядра netfilter, поэтому цепи из нескольких таблиц регистрируются на каждом из этих крючков. Например, у трех таблиц есть цепи PREROUTING. Когда эти цепи регистрируются на соответствующем крючке NF_IP_PRE_ROUTING, они указывают приоритет, который определяет порядок вызова каждой цепи PREROUTING для каждой таблицы. Каждое из правил в цепи с наивысшим приоритетом PREROUTING оценивается последовательно, прежде чем перейти к следующей цепи PREROUTING. Мы рассмотрим конкретный порядок каждой цепи через мгновение.

Какие таблицы доступны?

Давайте на мгновение отойдем назад и посмотрим на различные таблицы, которые предоставляет iptables. Они представляют собой отдельные наборы правил, организованные по области интересов, для оценки пакетов.

Таблица фильтрации

Таблица фильтрации является одной из самых широко используемых таблиц в iptables. Таблица filter используется для принятия решений о том, следует ли пакету продолжать свой путь к предназначенному месту или отклонить его запрос. В терминологии брандмауэра это известно как “фильтрация” пакетов. Эта таблица предоставляет основную функциональность, о которой говорят, обсуждая брандмауэры.

Таблица NAT

Таблица nat используется для реализации правил сетевого адресного перевода. Пакеты, поступающие в стек сети, подвергаются воздействию правил в этой таблице, которые определяют, нужно ли и как изменить исходный или конечный адрес пакета, чтобы повлиять на маршрутизацию пакета и любого ответного трафика. Это часто используется для направления пакетов в сети, когда прямой доступ невозможен.

Таблица Mangle

Таблица mangle используется для изменения заголовков IP-пакета различными способами. Например, можно изменить значение TTL (время жизни) пакета, увеличивая или уменьшая количество допустимых сетевых переходов, которые пакет может выдержать. Другие заголовки IP могут быть изменены аналогичным образом.

Эта таблица также может помечать пакет внутренним ядерным “маркером” для дальнейшей обработки в других таблицах и другими сетевыми инструментами. Этот маркер не затрагивает сам пакет, но добавляет маркер к представлению ядра пакета.

Сырая таблица

Система: Брандмауэр iptables является состояний, что означает, что пакеты оцениваются с учетом их отношения к предыдущим пакетам. Возможности отслеживания соединений, построенные на основе фреймворка netfilter, позволяют iptables рассматривать пакеты как часть текущего соединения или сеанса, а не как поток отдельных несвязанных пакетов. Логика отслеживания соединений обычно применяется очень скоро после того, как пакет поступает на сетевой интерфейс.

Таблица raw имеет очень узко определенную функцию. Ее единственная цель – предоставить механизм для маркировки пакетов с целью отказа от отслеживания соединений.

Таблица безопасности

Таблица security используется для установки внутренних меток безопасности SELinux на пакеты, которые будут влиять на то, как SELinux или другие системы, способные интерпретировать контексты безопасности SELinux, обрабатывают пакеты. Эти метки могут быть применены на уровне отдельных пакетов или соединений.

Отношения между цепями и таблицами

Если три таблицы имеют цепи PREROUTING, в каком порядке они оцениваются?

Следующая таблица указывает цепочки, доступные в каждой таблице iptables, когда они читаются слева направо. Например, мы видим, что таблица raw имеет как цепочку PREROUTING, так и OUTPUT. Когда они читаются сверху вниз, также отображается порядок вызова каждой цепочки при срабатывании соответствующего netfilter хука.

A few things should be noted. In the representation below, the nat table has been split between DNAT operations (those that alter the destination address of a packet) and SNAT operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)

При срабатывании пакета на netfilter хук, соответствующие цепочки будут обработаны в том порядке, в котором они перечислены в таблице сверху вниз. Хуки (столбцы), на которые сработает пакет, зависят от того, является ли он входящим или исходящим, принятых решений маршрутизации и проходит ли пакет критерии фильтрации.

Некоторые события могут привести к пропуску цепочки таблицы во время обработки. Например, только первый пакет в соединении будет оценен по правилам NAT. Любые решения nat, принятые для первого пакета, будут применены ко всем последующим пакетам в соединении без дополнительной оценки. Ответы на соединения с NAT автоматически будут иметь применены обратные правила NAT для правильной маршрутизации.

Порядок обхода цепочек

Предполагая, что сервер знает, как маршрутизировать пакет, и что правила брандмауэра разрешают его передачу, следующие потоки представляют собой пути, которые будут пройдены в различных ситуациях:

  • Входящие пакеты, предназначенные для локальной системы: PREROUTING -> INPUT
  • Входящие пакеты, предназначенные для другого хоста: PREROUTING -> FORWARD -> POSTROUTING
  • Локально созданные пакеты: OUTPUT -> POSTROUTING

Если мы объединим вышеуказанную информацию с порядком, изложенным в предыдущей таблице, мы увидим, что входящий пакет, предназначенный для локальной системы, сначала будет проверен по цепочкам PREROUTING таблиц raw, mangle и nat. Затем он пройдет через цепочки INPUT таблиц mangle, filter, security и nat, прежде чем окончательно быть доставленным к локальному сокету.

Правила IPTables

Правила размещаются в конкретной цепочке конкретной таблицы. При вызове каждой цепочки пакет будет проверен на соответствие каждому правилу в цепочке по порядку. Каждое правило имеет компонент сопоставления и компонент действия.

Сопоставление

Соответствующий участок правила определяет критерии, которым должен соответствовать пакет, чтобы выполнялось соответствующее действие (или “цель”).

Система сопоставления очень гибка и может значительно расширяться с использованием дополнительных расширений iptables. Правила могут быть созданы для сопоставления по типу протокола, адресу назначения или источника, порту назначения или источника, сети назначения или источника, интерфейсу ввода или вывода, заголовкам или состоянию соединения, среди прочих критериев. Эти критерии могут быть объединены для создания сложных наборов правил для различения между разными видами трафика.

Цели

A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:

  • Завершающие цели: Завершающие цели выполняют действие, которое завершает оценку в пределах цепи и возвращает управление к сетевому крюку netfilter. В зависимости от предоставленного значения возврата крюк может сбросить пакет или разрешить пакету продолжить на следующий этап обработки.
  • Незавершающие цели: Незавершающие цели выполняют действие и продолжают оценку в пределах цепи. Хотя каждая цепь в конечном итоге должна вернуть окончательное решение о завершении, любое количество незавершающих целей может быть выполнено заранее.

Доступность каждой цели в правилах будет зависеть от контекста. Например, таблица и тип цепи могут определять доступные цели. Активированные расширения в правиле и сопоставительные условия также могут влиять на доступность целей.

Переход к Пользовательским Цепочкам

Существует также особый класс не завершающихся целей: цели перехода. Цели перехода – это действия, которые приводят к перемещению вычислений в другую цепочку для дополнительной обработки. Мы рассмотрели встроенные цепочки, которые связаны с хуками netfilter, вызывающими их. Однако iptables также позволяет администраторам создавать свои собственные цепочки для организационных целей.

Правила могут быть размещены в пользовательских цепочках таким же образом, как они размещаются во встроенных цепочках. Разница заключается в том, что пользовательские цепочки могут быть достигнуты только “переходом” к ним из правила (они сами не зарегистрированы с хуком netfilter).

Пользовательские цепочки действуют как расширения цепочки, которая их вызвала. Например, в пользовательской цепочке оценка вернется к вызывающей цепочке, если достигнут конец списка правил или если цель RETURN активирована совпадающим правилом. Оценка также может перейти к дополнительным пользовательским цепочкам.

Эта конструкция позволяет более эффективно организовывать и обеспечивает необходимую структуру для более надежного ответвления.

IPTables и Отслеживание Соединений

Мы представили систему отслеживания соединений, реализованную поверх фреймворка netfilter, когда обсуждали таблицу raw и критерии сопоставления состояния соединения. Система отслеживания соединений позволяет iptables принимать решения относительно пакетов в контексте текущего соединения. Система отслеживания соединений предоставляет iptables функционал, необходимый для выполнения “состояний”.

Отслеживание соединений применяется очень быстро после входа пакетов в сетевой стек. Цепи таблицы raw и некоторые проверки корректности – единственная логика, выполняемая над пакетами перед их ассоциацией с соединением.

Система проверяет каждый пакет на соответствие набору существующих соединений. Если это необходимо, она обновит состояние соединения в своем хранилище и добавит новые соединения в систему. Пакеты, помеченные целью NOTRACK в одной из цепей raw, обходят процедуры отслеживания соединений.

Доступные состояния

Соединения, отслеживаемые системой отслеживания соединений, будут находиться в одном из следующих состояний:

  • NEW: Когда приходит пакет, который не связан с существующим соединением, но не является недопустимым в качестве первого пакета, будет добавлено новое соединение с этим маркером в систему. Это происходит как для протоколов, осведомленных о соединении, так и для безсоединительных протоколов, таких как UDP.
  • УСТАНОВЛЕНО: Соединение изменяется с НОВОЕ на УСТАНОВЛЕНО, когда оно получает действительный ответ в противоположном направлении. Для соединений TCP это означает SYN/ACK, а для трафика UDP и ICMP – ответ, при котором исходный пакет переключается местами между источником и назначением.
  • СВЯЗАННЫЕ: Пакеты, которые не являются частью существующего соединения, но связаны с уже существующим соединением в системе, помечаются как СВЯЗАННЫЕ. Это может быть связано с вспомогательным соединением, как в случае передачи данных по FTP, или это могут быть ответы ICMP на попытки соединения другими протоколами.
  • НЕДОПУСТИМЫЕ: Пакеты могут быть помечены как НЕДОПУСТИМЫЕ, если они не связаны с существующим соединением и не подходят для открытия нового соединения, если их нельзя идентифицировать или если они не могут быть направлены, среди прочих причин.
  • НЕОТСЛЕЖИВАЕМЫЕ: Пакеты могут быть помечены как НЕОТСЛЕЖИВАЕМЫЕ, если они были выбраны в цепи таблицы raw для обхода отслеживания.
  • SNAT: Это виртуальное состояние, устанавливаемое, когда адрес источника изменен операциями NAT. Это используется системой отслеживания соединений, чтобы знать, что нужно изменить исходные адреса в ответных пакетах.
  • DNAT: Это виртуальное состояние, устанавливаемое, когда адрес назначения изменен операциями NAT. Это используется системой отслеживания соединений, чтобы знать, что нужно изменить адрес назначения обратно при маршрутизации ответных пакетов.

Состояния, отслеживаемые в системе отслеживания соединений, позволяют администраторам создавать правила, нацеленные на конкретные моменты в жизни соединения. Это обеспечивает функциональность, необходимую для более тщательных и безопасных правил.

Заключение

Фреймворк фильтрации пакетов netfilter и брандмауэр iptables являются основой для большинства решений по брандмауэрам на серверах Linux. Хуки ядра netfilter достаточно близки к сетевому стеку, чтобы обеспечить мощный контроль над пакетами при их обработке системой. Брандмауэр iptables использует эти возможности для предоставления гибкого, расширяемого метода обмена требованиями политики с ядром. Изучив, как эти компоненты взаимодействуют, вы сможете более эффективно использовать их для управления и обеспечения безопасности вашей серверной среды.

Если вы хотите узнать больше о том, как выбирать эффективные политики iptables, ознакомьтесь с этим руководством.

Эти руководства могут помочь вам начать внедрение ваших правил брандмауэра iptables:

Source:
https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture