Правила задаются в одном месте (Control Plane, веб-UI или API), автоматически компилируются под каждый хост и доставляются агентам, которые применяют их в ядре на TC-хуке. Расходящиеся iptables/nftables-скрипты и разрозненные Ansible-роли заменяются единой конфигурацией.
Control Plane — Go-сервис + React-UI + PostgreSQL. API-first: всё, что делает UI, доступно по REST.
Лёгкий Go-бинарь (deb/rpm) на защищаемой машине. Держит mTLS-соединение с CP, применяет подписанные бандлы, передаёт телеметрию.
| Операционная задача | Как решает qf |
|---|---|
| Правила настраиваются вручную на каждой машине и со временем расходятся | Правила задаются в CP, агент применяет их автоматически. Новый хост с нужным лейблом получает правила без ручных шагов |
| «Что реально применено на этом хосте?» | Действующий ruleset хоста виден в API/UI; per-rule счётчики и события — в реальном времени |
| Онбординг сотен хостов | Один bulk-токен с шаблоном лейблов и целевой группой; каждый новый хост сам получает лейблы и попадает под нужные политики |
| Конфигурация расходится с версией в git | Policy-as-code через Terraform-провайдер: политики, правила и object-groups в репозитории, plan/apply, ревью в PR |
| Изменение применяется без проверки | Dry-run превью (кого затронет и итоговый ruleset) до включения энфорсмента |
| Деплой Control Plane | Helm-чарт, встроенный HA (2 реплики), стандартные k8s-примитивы |
| Деплой агентов по разнородному парку | Идемпотентная Ansible-роль (deb/rpm, github-release / apt-dnf-repo / локальный файл), проверка ядра и архитектуры |
| Сосуществование с CNI | На ядрах ≥6.6 агент подключается через TCX и сосуществует с Cilium, не изменяя его датапас |
| Массовая потеря доступа (lockout) | Канал управления защищён неизменяемым allow-правилом; никакая политика не отрежет агента от CP |
Правило задаётся метками; видно, какие хосты попадают под селектор и статус применения по каждому.
role in (web, api)env = prodallow tcp 443 → object-group: payment-gwКаждый хост показывает статус применения текущего поколения (generation) бандла в реальном времени.
Политики, правила и object-groups описываются декларативно и хранятся в git — plan, apply, ревью в PR, стейт. Правила ссылаются на object-groups по id, Terraform строит граф зависимостей. Fleet-wide политики (selector = {}) требуют явного confirm_match_all = true — предохранитель от применения на весь парк.
Bulk-токен — один энролмент-токен на много хостов. label_template проставляет лейблы, target_group_id добавляет хост в группу. Токен раздаётся парку: хосты проходят энролмент, сами получают лейблы и попадают под нужные политики. max_uses и TTL ограничивают токен; после энролмента он стирается из конфига.
Helm-чарт qf-cp, встроенный HA — 2 реплики. gRPC для агентов публикуется как NodePort (минуя L7-прокси), REST/UI — через Ingress. Всё в values.yaml, чарт публикуется OCI, обновление штатным helm upgrade.
Агент — обычный пакет deb/rpm. Штатный путь — идемпотентная Ansible-роль: проверяет ядро и архитектуру, ставит из github-релиза / apt-dnf-репо / файла, кладёт CA-анкер и минимальный agent.conf, запускает systemd-юнит.
На ядрах ≥6.6 агент подключает датапас через TCX — несколько eBPF-программ на одном интерфейсе через собственные links с явным порядком. qf ставит свои TCX-links и не изменяет clsact-qdisc и программы Cilium.
qf энфорсит host-политику, Cilium — свою CNI-политику подов. Не делят карты, не перезаписывают attach. Снятие qf-агента убирает только его TCX-links — Cilium остаётся работать (ноды не уходят в NotReady).
На ядрах <6.6 TCX недоступен. При обнаружении Cilium агент не стартует (fail-safe); без Cilium используется классический TC.