Открыть сервис

Netfilter

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

История

Разработка Netfilter была начата в 1998 году программистом Расти Расселом (Rusty Russell) в рамках проекта по созданию более гибкой и модульной замены для существовавшей тогда системы фильтрации пакетов ipchains (в ядре 2.2) и ipfwadm (в ядре 2.0). Основной целью было создание универсального фреймворка, который бы позволил сторонним разработчикам легко добавлять новые функции обработки пакетов без необходимости модификации самого ядра.

Первая стабильная реализация Netfilter была включена в состав ядра Linux версии 2.4, выпущенного в 2001 году. Вместе с ней появился и инструмент командной строки iptables, который стал основным интерфейсом для управления правилами фильтрации. В 2014 году была начата работа над преемником iptables — утилитой nftables, которая использует тот же механизм Netfilter, но предлагает более современный и унифицированный синтаксис, а также улучшенную производительность. Начиная с ядра 3.13, nftables был включён в основную ветку ядра, и в настоящее время (с ядра 5.x и 6.x) рекомендуется к использованию вместо iptables.

Архитектура и принцип работы

Архитектура Netfilter основана на концепции хуков (hooks) — точек в стеке сетевой обработки пакетов, в которых может быть вызвана зарегистрированная функция-обработчик. В ядре Linux для IPv4 определено пять основных точек хуков:

  1. NF_INET_PRE_ROUTING — входящий пакет сразу после приёма с сетевого интерфейса, до принятия решения о маршрутизации.
  2. NF_INET_LOCAL_IN — пакет, адресованный локальному процессу (самому хосту), после прохождения маршрутизации.
  3. NF_INET_FORWARD — пакет, проходящий транзитом через хост (не адресованный локально), после принятия решения о маршрутизации.
  4. NF_INET_LOCAL_OUT — пакет, отправляемый локальным процессом, до выхода на сетевой интерфейс.
  5. NF_INET_POST_ROUTING — исходящий пакет перед отправкой на сетевой интерфейс, после всех решений о маршрутизации.

Для IPv6 определены аналогичные хуки с префиксом NF_INET6_.

Обработка пакетов

Когда пакет проходит через определённую точку хука, ядро проверяет, зарегистрированы ли в этой точке какие-либо функции. Если да, то управление передаётся первой зарегистрированной функции. Функция может выполнить одно из следующих действий:

  • NF_ACCEPT — продолжить нормальную обработку пакета.
  • NF_DROP — отбросить пакет (не передавать дальше).
  • NF_QUEUE — поставить пакет в очередь для обработки в пространстве пользователя (user-space).
  • NF_STOLEN — «украсть» пакет (ядро больше не обрабатывает его; функция сама решает его судьбу).
  • NF_REPEAT — повторить вызов хука для этого пакета.

Связь с iptables и nftables

Утилиты iptables и nftables являются интерфейсами для управления правилами, которые затем компилируются в наборы правил, загружаемые в ядро. Внутри ядра эти правила обрабатываются модулями ip_tables (для iptables) или nf_tables (для nftables), которые, в свою очередь, регистрируют свои функции-обработчики на хуках Netfilter. Таким образом, при прохождении пакета через хук, он проверяется на соответствие цепочкам правил (например, INPUT, OUTPUT, FORWARD для iptables).

Классификация и компоненты

Netfilter можно рассматривать как совокупность нескольких взаимосвязанных подсистем:

1. Фильтрация пакетов (Packet Filtering)

Основная функция, реализуемая через таблицы filter в iptables или семейства ip, ip6 в nftables. Позволяет разрешать или запрещать прохождение пакетов на основе их заголовков (IP-адреса, порты, протоколы, состояние соединения).

2. Трансляция сетевых адресов (NAT)

Реализуется через таблицу nat в iptables или семейства nat в nftables. Включает:

  • SNAT (Source NAT) — замена исходного адреса/порта пакета (обычно для обеспечения доступа в интернет с локальных адресов).
  • DNAT (Destination NAT) — замена адреса назначения пакета (используется для перенаправления входящих соединений на другой хост или порт, например, для проброса портов).
  • Masquerading — специальный случай SNAT, автоматически использующий IP-адрес исходящего интерфейса.

3. Отслеживание состояния соединений (Connection Tracking)

Механизм, позволяющий ядру отслеживать состояние сетевых соединений (например, NEW, ESTABLISHED, RELATED, INVALID). Эта информация используется для принятия решений о фильтрации (например, разрешать только пакеты, относящиеся к уже установленным соединениям). Реализуется модулем nf_conntrack.

4. Маркировка пакетов и соединений (Packet/Connection Marking)

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

5. Логирование и уведомления

Модуль nf_log позволяет логировать информацию о пакетах, соответствующих определённым правилам. Также существует механизм nf_queue, который позволяет передавать пакеты в пространство пользователя для анализа или обработки сторонними программами (например, snort или suricata).

Применение

Netfilter является основой для построения систем сетевой безопасности и управления трафиком в Linux. Основные области применения:

  • Межсетевые экраны (брандмауэры): Создание правил фильтрации трафика для защиты серверов, рабочих станций и целых сетей. Примеры: iptables, nftables, ufw (Uncomplicated Firewall), firewalld.
  • Маршрутизаторы и шлюзы: Настройка NAT, проброс портов, балансировка нагрузки, разделение интернет-канала.
  • Виртуальные частные сети (VPN): Обеспечение работы VPN-серверов (например, OpenVPN, WireGuard) путём настройки маршрутизации и фильтрации.
  • Системы обнаружения и предотвращения вторжений (IDS/IPS): Перехват трафика из ядра в пространство пользователя для анализа на предмет вредоносной активности (например, Snort, Suricata).
  • Контейнеризация: Используется в Docker и Kubernetes для изоляции сетевых пространств имён (network namespaces) и настройки сетевых политик.

Сравнение с другими решениями

Netfilter является стандартом де-факто для Linux, но существуют и альтернативные подходы:

  • BPF (Berkeley Packet Filter) и eBPF (extended BPF): Более современная и гибкая технология, позволяющая выполнять произвольный пользовательский код в ядре. eBPF может использоваться для фильтрации пакетов (например, через XDPeXpress Data Path) и часто обеспечивает более высокую производительность, чем Netfilter, за счёт раннего перехвата трафика. Однако eBPF сложнее в разработке и отладке.
  • ipfirewall (ipfw): Система фильтрации пакетов, используемая в FreeBSD и других операционных системах семейства BSD. Имеет схожие возможности, но другую архитектуру и синтаксис правил.
  • pf (Packet Filter): Ещё одна система из семейства BSD, известная своей простотой и производительностью. Используется в OpenBSD и macOS.

Критика

Несмотря на широкую распространённость, Netfilter подвергался критике по нескольким направлениям:

  • Сложность конфигурации: Синтаксис iptables считается громоздким и неинтуитивным, особенно для сложных правил. Это привело к созданию множества надстроек (например, ufw, firewalld).
  • Производительность: При большом количестве правил (тысячи и десятки тысяч) производительность Netfilter может снижаться из-за линейного перебора правил в цепочках. Однако с появлением nftables и использованием хэш-таблиц эта проблема была частично решена.
  • Масштабируемость: В высоконагруженных системах (например, на маршрутизаторах с пропускной способностью 10 Гбит/с и выше) Netfilter может стать узким местом. В таких случаях предпочтение отдаётся аппаратным решениям или eBPF/XDP.

Интересные факты

  • Название «Netfilter» происходит от идеи «фильтрации» пакетов на уровне сети.
  • Расти Расселл, создатель Netfilter, также является автором первых версий iptables и популярной книги «Linux Firewalls».
  • В ядре Linux 2.4 Netfilter заменил собой сразу две предыдущие системы: ipchains (для IPv4) и ip6fw (для IPv6).
  • Модуль nf_conntrack может потреблять значительное количество оперативной памяти при большом количестве одновременных соединений, что является известной проблемой для высоконагруженных серверов.

Источники

  • Документация ядра Linux: Documentation/networking/netfilter.txt
  • Rusty Russell, «Linux 2.4 Netfilter» (1999)
  • Официальный сайт проекта Netfilter: netfilter.org
  • Man-страницы: iptables(8), nft(8), ip6tables(8)
  • Книга: «Linux Firewalls: Attack Detection and Response with iptables, psad, and fwsnort» by Michael Rash (2007)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →