Первый пригодный для пользователей релиз пакетного фильтра Nftables

Проект Netfilter представил первый ориентированный на конечных пользователей выпуск пакетного фильтра Nftables 0.099, а также релиз сопутствующей библиотеки libnftnl 1.0.0, предоставляющей низкоуровневый API для взаимодействия с подсистемой nf_tables. Напомним, что подсистема nf_tables включена в состав ядра Linux 3.13, а в рамках пакета Nftables поставляются компоненты, работающие в пространстве пользователя.

Выпуск Nftables 0.099 уже не позиционируется как альфа-версия и отмечен как пригодный для персонального использования, но пока не рекомендуется для промышленного применения. Сообщается, что до выпуска Nftables 0.1 не исключено незначительное изменение грамматики правил и внесение нарушающих совместимость изменений. Одновременно анонсирован пакет nftables-plus 0.099, который включает в себя дополнительные патчи для улучшения удобства использования.

В рамках проекта Nftables развивается новая реализация пакетного фильтра, унифицирующая интерфейсы фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов, и нацеленная на замену iptables, ip6table, arptables и ebtables. Для реализации поставленной задачи Nftables предоставляет на уровне ядра лишь общий интерфейс, не зависящий от конкретного протокола и предоставляющий базовые функции извлечения данных из пакетов, выполнения операций с данными и управления потоком. В работе используются уже существующие типовые универсальные компоненты инфраструктуры Netfilter, в том числе применяются существующие хуки, система отслеживания состояния соединений, компоненты организации очередей и подсистема ведения лога.

Непосредственно логика фильтрации и специфичные для протоколов обработчики компилируются в байткод в пространстве пользователя, после чего данный байткод загружается в ядро при помощи интерфейса Netlink и выполняется в специальной виртуальной машине, напоминающей BPF (Berkeley Packet Filters). Например, если в iptables при выполнении в правилах сопоставления номера входящего TCP-порта использовалась специальная предопределённая функция модуля ядра xt_tcpudp, то в nftables производится формирование инструкции «прочитать в регистр 2 байта из определённой позиции заголовка пакета и сравнить содержимое регистра с указанным значением».

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

Для формирования правил фильтрации предлагается использовать утилиту nft, которая проверяет корректность правил и транслирует их в байткод. Правила могут как добавляться инкрементально, так и загружаться целиком из файла на диске. Синтаксис правил не похож на iptables и отличается использованием иерархических блочных структур вместо линейной схемы. Язык классификации правил основан на реальной грамматике, при обработке которой используется сгенерированный в bison парсер. Поддерживается словарный маппинг (хеши), поиск по наборам правил (sets), диапазоны значений (можно определять подсети), средства для отслеживания соединений, NAT, ведение лога. Для обеспечения совместимости с правилами iptables/ip6tables предоставляется специальная прослойка.

Пример правил:

table filter {
        chain input {
                 table filter hook input priority 0;
                 ct state established accept
                 ct state related accept
                 meta iif lo accept
                 tcp dport ssh counter packets 0 bytes 0 accept
                 counter packets 5 bytes 5 log drop
        }

        chain output {
                 table filter hook output priority 0;
                 ct state established accept
                 ct state related accept
                 meta oif lo accept
                 ct state new counter packets 0 bytes 0 accept
        }
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.