qf хостовый firewall на eBPF
eBPF/TC датапат

Enforcement в ядре: eBPF-фильтр на TC-хуке вместо iptables

Политика компилируется в данные BPF-карт и применяется прямо в пути данных (датапат) на TC-хуке. Крепление подстраивается под ядро: TCX на ≥6.6 рядом с Cilium, классический TC на <6.6. Без зависимости от iptables.

что такое enforcement в qf

eBPF-фильтр на TC-хуке

Применение правил в qf — это eBPF-программа на TC-хуке ядра Linux, которая проверяет каждый пакет по скомпилированным правилам и выносит вердикт: пропустить или отбросить. Центр управления (control plane) компилирует политику по меткам-селекторам (label selectors) в данные BPF-карт и рассылает подписанные пакеты политики (бандлы); агент проверяет подпись Ed25519 до применения (verify-before-apply), записывает бандл в карты и применяет его в датапате, без зависимости от iptables и netfilter.

Датапат разбирает заголовки L3/L4, сверяет источник, назначение, протокол и порт с правилами в BPF-картах, сверяется с таблицей соединений (conntrack) и возвращает вердикт. Правила — это данные в картах, а не перекомпиляция программы: применение политики означает атомарную запись новых записей в карты уже загруженного фильтра.

Периметровый межсетевой экран (NGFW) проверяет трафик на входе снаружи (north-south), но доступ между серверами внутри сегмента (east-west) он не разбирает. Этот горизонтальный трафик разграничивает файрвол на каждом сервере (host-firewall). qf дополняет периметр, а не заменяет его.

путь пакета

Как пакет получает вердикт

Один проход eBPF-программы на TC-хуке — от разбора заголовков до вердикта.

  1. 01

    Разбор заголовков

    Парсер извлекает L3/L4: адреса, протокол (TCP/UDP/ICMP) и порты. Неразобранные протоколы (SCTP/GRE/ESP) по умолчанию проходят мимо фильтра, если явно не включён QF_DENY_UNKNOWN_PROTO.

  2. 02

    Матч по BPF-картам

    Источник, назначение и порт сверяются с object-группами: ipset по LPM-префиксам, portset по портам, hostset по хостам. Матч — это чтение из карт, а не проход по цепочке правил netfilter.

  3. 03

    Сверка с conntrack

    Таблица соединений отслеживает TCP/UDP/ICMP и состояния new / established / invalid, поэтому ответный трафик установленного соединения не требует зеркального правила.

  4. 04

    Вердикт в датапате

    Программа возвращает pass или drop прямо на TC-хуке, до того как пакет уйдёт в стек. Событие вердикта (Verdict) попадает в наблюдаемость и может пересылаться в SIEM.

Правила — это данные, а не код

Политика компилируется в записи BPF-карт загруженного фильтра. Применение новой политики — атомарная запись в карты, без перезагрузки программы и без разрыва датапата.

kernel-adaptive attach

Крепление подстраивается под ядро

Агент выбирает стратегию крепления по возможностям ядра при загрузке. Настраивать вручную не нужно.

ЯдроКреплениеПоведение
≥ 6.6TCXСовременный хук; сосуществует с Cilium и другими TCX-программами на том же интерфейсе.
< 6.6, без CiliumКлассический TC (clsact + cls_bpf)Штатное крепление для старых ядер без конфликта qdisc.
< 6.6, с CiliumОтказ запускаКонфликт qdisc: агент осознанно не стартует, а не молча ломает сеть.

Минимальная версия ядра — 5.15. Датапат работает на L3/L4 по IPv4 (TCP/UDP/ICMP). L7/DPI, DNS-фильтрация и identity-модель в датапат не входят; непарсимый L4 (SCTP/GRE/ESP) проходит мимо правил.

факт-числа

Пределы датапата

qf собирает eBPF-датапат в двух вариантах и выбирает нужный по возможностям ядра при загрузке.

≥ 5.15
минимальная версия ядра Linux
32 / 2048
правил: 5.15–5.16 / ≥5.17
≥ 6.6
ядро для TCX и сосуществования с Cilium
TCP/UDP/ICMP
протоколы conntrack

Дуальная BPF-сборка: до 32 правил ограниченным циклом на ядрах 5.15–5.16, до 2048 через bpf_loop на ≥5.17. Накладные расходы пути данных (ns/пакет) снимаются харнессом bench-bpf на целевом ядре, числом из прогона, а не расчётом. Агент — только Linux x86_64/arm64. Состояние `related` в conntrack не реализовано.

режим по умолчанию

По умолчанию — отказ в открытую (fail-open); переход к запрету по умолчанию управляемый

По умолчанию датапат работает в режиме отказа в открытую (fail-open, ALLOW): забытое правило не отрежет хост, а падение агента или потеря связи с центром управления не разрывают существующий трафик. Переход к запрету по умолчанию (default-deny) вводится поэтапно и наблюдаемо: журнал, затем наблюдение, затем запрет, а не «из коробки». IPv6 по умолчанию (QF_DROP_IPV6) отбрасывается целиком; при включении фильтруются протокол, порт и TCP-флаги, но фильтрация по IPv6-CIDR не поддержана.

вопросы

Частые вопросы

Заменяет ли qf iptables?

Да, для L3/L4-фильтрации на хосте. Датапат — eBPF-программа на TC-хуке ядра; она не зависит от iptables и netfilter. Управление централизовано: одна политика вместо ручных наборов правил на каждом хосте.

На каких ядрах работает применение правил?

Минимальная версия ядра — 5.15. До 32 правил на 5.15–5.16 и до 2048 на ≥5.17. TCX-крепление и сосуществование с Cilium — на ≥6.6; на <6.6 без Cilium используется классический TC. На <6.6 вместе с Cilium агент осознанно не стартует из-за конфликта qdisc.

Что происходит с датапатом, если центр управления недоступен?

Агент продолжает применять последний полученный бандл из локального кэша — центр управления не стоит в пути данных. Если связь не восстановлена за 60 с, срабатывает сторожевой таймер (dead-man watchdog): агент откатывается на предыдущий бандл. Это откат по потере связи, а не детекция «плохой» политики.

Что qf не фильтрует в датапате?

Датапат — L3/L4 по IPv4 (TCP/UDP/ICMP). Нет L7/DPI, DNS-фильтрации и identity-модели. Непарсимый L4 (SCTP/GRE/ESP) по умолчанию проходит мимо правил, пока не включён QF_DENY_UNKNOWN_PROTO, и под запрет по умолчанию не попадает. IPv6 по умолчанию отбрасывается целиком; при включении фильтруются протокол, порт и флаги, но фильтрация по IPv6-CIDR не поддержана.

Проверка датапата на вашем парке