Поиск по сайту:

Глубокое погружение в архитектуру 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 используется для изменения IP-заголовков пакета различными способами. Например, вы можете настроить значение TTL (время жизни) пакета, увеличив или уменьшив количество допустимых сетевых переходов, которые может поддерживать пакет. Аналогичным образом можно изменить и другие заголовки IP.

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

Необработанная таблица

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

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

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

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

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

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

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

Следует отметить несколько вещей. В приведенном ниже представлении таблица nat разделена на операции DNAT (которые изменяют адрес назначения пакета) и операции SNAT ( те, которые изменяют исходный адрес), чтобы более четко отображать их порядок. Мы также включили строки, представляющие точки, где принимаются решения о маршрутизации и где включено отслеживание соединений, чтобы дать более целостное представление о происходящих процессах:

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. Правила могут быть созданы для сопоставления по типу протокола, адресу назначения или источника, порту назначения или источника, сети назначения или источника, входному или выходному интерфейсу, заголовкам или состоянию соединения среди других критериев. Их можно комбинировать для создания сложных наборов правил для различения разного трафика.

Цели

«Цель» относится к действиям, которые запускаются, когда пакет соответствует критериям соответствия правила. Цели обычно делятся на две категории:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

  • Как настроить брандмауэр с помощью Iptables
  • Iptables Essentials: общие правила и команды брандмауэра
  • Как настроить брандмауэр с помощью UFW в Ubuntu 22.04
  • Как настроить брандмауэр с помощью firewalld в Rocky Linux 8
  • Как настроить брандмауэр Iptables для защиты трафика между вашими серверами