> Непосредственно логика фильтрации и специфичные для протоколов обработчики компилируются
> в байткод в пространстве пользователя, после чего данный байткод загружается в
> ядро при помощи интерфейса Netlink и выполняется в специальной виртуальной машине,
> напоминающей BPF (Berkeley Packet Filters). Например, если в iptables при
> выполнении в правилах сопоставления номера входящего TCP-порта использовалась специальная
> предопределённая функция модуля ядра xt_tcpudp, то в nftables производится формирование
> инструкции "прочитать в регистр 2 байта из определённой позиции заголовка пакета
> и сравнить содержимое регистра с указанным значением". пейсать и фантацировать это не одно и то-же.
BPF зачастую реализуется в виде виртуальной машины (виртуальной -- потому-что опкоды интерпретируются), а зачастую например как на многих архитектурах в Linux или x86 во FreeBSD они компилируются в нативный код (jit).
nftables не использует никакую компиляцию в байткод -- nftables в пространстве ядра представляет собой FSM, юзерспейсная часть nftables в зависимости от правил фильтрации подготавливает для ядра модель для данной FSM.
>Подобный подход позволяет значительно
> сократить размер кода фильтрации, работающего на уровне ядра и вынести все
> функции разбора правил и логики работы с протоколами в пространство пользователя.
с этим согласен -- но как уже обсуждалось, зачастую такая унификация ведёт к тому что, то разнообразие действий которое предоставляет стандартный netfilter описать через стандартный nftables не возможно.