Архитектура Iptables и Netfilter

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

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

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

IPTables – это основное программное обеспечение брандмауэра, наиболее часто используемое в Linux. Брандмауэр 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

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

Таблица NAT

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

Таблица mangle

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

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

Таблица raw

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

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

Таблица security

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

Какие цепочки реализуют таблицы?

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

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

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

Таблицы↓/Цепочки→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(решения о маршрутизации)
raw
(отслеживание подключений)
mangle
nat (DNAT)
(решения о маршрутизации)
filter
security
nat (SNAT)

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

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

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

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

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

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

Правила IPTables

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

Критерий

Критерий – это выражение, которому должен соответствовать пакет для выполнения связанного действия (или цели).

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

Действие

Действие, или цель – это описание действия, которое запускается, если пакет соответствует критериям. Действия обычно делятся на две категории:

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

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

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

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

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

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

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

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

Отслеживание соединений применяется сразу после того, как пакеты входят в сетевой стек.

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

state

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

  • NEW: если поступающий пакет не связан с существующим соединением, но может рассматриваться в качестве первого пакета, в систему будет добавлено новое соединение с этой меткой. Это происходит как для протоколов TCP, так и для UDP.
  • ESTABLISHED: когда соединение получает ответ, состояние изменяется с NEW на ESTABLISHED. Для TCP-соединений это означает SYN/ACK, а для трафика UDP и ICMP это ответ, в котором меняются местами целевой и исходный адрес пакета.
  • RELATED: Пакеты, которые не являются частью существующего соединения, но связаны с соединением, уже находящимся в системе, помечены как RELATED. Это может быть вспомогательное соединение, как в случае с соединениями передачи данных по FTP, или ответ ICMP на попытки подключения другими протоколами.
  • INVALID: пакеты могут быть помечены как INVALID, если они не связаны с существующим соединением и не подходят для создания нового соединения, если их нельзя идентифицировать или маршрутизировать по другим причинам.
  • UNTRACKED: Пакеты могут быть помечены как UNTRACKED, если они были направлены в цепочку таблицы raw, чтобы обойти отслеживание.
  • SNAT: виртуальное состояние, которое устанавливается, когда исходный адрес был изменен операциями NAT. Это используется системой отслеживания соединений для того чтобы понимать, как изменить исходные адреса в ответные пакеты.
  • DNAT: виртуальное состояние, которое устанавливается, когда адрес назначения был изменен с помощью операций NAT. Оно используется системой отслеживания соединений для изменения адреса получателя при маршрутизации ответных пакетов.

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

Заключение

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

Читайте также:

Tags: ,