Выпуск пакетного фильтра Nftables 1.1.0

Опубликован выпуск пакетного фильтра nftables 1.0.8, унифицирующего интерфейсы фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов (нацелен на замену iptables, ip6table, arptables и ebtables). Значительное изменение номера версии не связано с какими-то кардинальными изменениями, а лишь является следствием последовательного продолжения нумерации в десятичном исчислении (прошлый выпуск был 1.0.9). Одновременно опубликован выпуск сопутствующей библиотеки libnftnl 1.2.7, предоставляющей низкоуровневый API для взаимодействия с подсистемой nf_tables.

В пакет nftables входят компоненты пакетного фильтра, работающие в пространстве пользователя, в то время как на уровне ядра работу обеспечивает подсистема nf_tables, входящая в состав ядра Linux начиная с выпуска 3.13. На уровне ядра предоставляется лишь общий интерфейс, не зависящий от конкретного протокола и предоставляющий базовые функции извлечения данных из пакетов, выполнения операций с данными и управления потоком.

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

Основные изменения:

  • В map-выражениях добавлена поддержка переменных: define dst_map = { ::1234 : 5678 } table ip6 nat { map dst_map { typeof ip6 daddr : tcp dport; elements = $dst_map } chain prerouting { ip6 nexthdr tcp redirect to ip6 daddr map @dst_map } }
  • Добавлена поддержка VLAN: ip saddr 10.1.1.1 icmp type echo-request vlan id set 321 # payload ether type 8021ad vlan id 10 vlan type 8021q vlan id 100 vlan type ip accept
  • Для выражений “log” задействован новый строковый препроцессор с поддержкой переменных: define message=”test” log prefix “my $message”
  • При вычислении значения выражения “meta hour” реализована обработка отрицательного смещения в часовом поясе, заданном через переменную окружения TZ: TZ=UTC-4 nft add rule x y meta hour “22:00”
  • Обеспечено преобразование порядка следования байтов при использовании выражений ct и meta, а также при использовании операций слияния и указания диапазонов в set-наборах. map mapv6 { typeof ip6 dscp : meta mark; } meta mark set ip6 dscp map @map1 будет получен байткод: [ payload load 2b @ network header + 0 => reg 1 ] [ bitwise reg 1 = ( reg 1 & 0x0000c00f ) ^ 0x00000000 ] [ byteorder reg 1 = ntoh(reg 1, 2, 2) ] [ bitwise reg 1 = ( reg 1 > 0x00000006 ) ] [ lookup reg 1 set mapv6 dreg 1 ] [ meta set mark with reg 1 ]
  • Возобновлена поддержка команды “replace rule”. replace rule ip t1 c1 handle 3 ‘jhash ip protocol . ip saddr mod 170 vmap {
    0-94 : goto wan1, 95-169 : goto wan2, 170-269 }”
  • Возобновлена возможность добавления сетевых устройств в существующие flowtable: create flowtable inet filter f1 { hook ingress priority 0; counter } add flowtable inet filter f1 { devices = { dummy1 } ; }
  • Решены проблемы при использовании команды “create set”: define ip-block-4 = { 1.1.1.1 } create set netdev filter ip-block-4-test { type ipv4_addr flags interval auto-merge elements = $ip-block-4 }
  • Решены проблемы при использовании цифрового представления опций tcp: tcp option 254
  • Решены проблемы при использовании выражений meta и ct с map-наборами: meta mark set vlan id map { 1 : 0x00000001, 4095 : 0x00004095 }
  • В выражениях payload и concat запрещено указание данных размером больше 512 байтов.
  • При выполнении команды “nft describe” реализован учёт значений из файлов group, rt_mark и rt_realms, размещённых в каталогах /etc/iproute2/ и /use/share/iproute2/. # nft describe meta rtclassid meta expression, datatype realm (routing realm) (basetype integer), 32 bits pre-defined symbolic constants from /etc/iproute2/rt_realms (in decimal): cosmos 0 Reject statement with range meta mark set 0-100
  • Ускорена операция вывода списка таблиц. Реализована поддержка опции -t/–terse для ускорения команд “list table” и “list set”.
  • Обеспечено преобразование выражений meter в динамические set-наборы: add rule t c tcp dport 80 meter m size 128 { ip saddr timeout 2s limit rate
    10/second }
    будет преобразован в set m { type ipv4_addr size 128 flags dynamic,timeout } tcp dport 80 update @m { ip saddr timeout 2s limit rate 10/second burst 5
    packets }
  • В представлении в формате JSON добавлена поддержка объектов synproxy и map-наборов с объединёнными данными.
  • В set-наборах, заданных в формате JSON, реализована поддержка флага auto-merge.
  • При использовании представления в формате JSON разрешено указание нескольких устройств в блоке “chain”.
  • При использовании опций -f/–filename обеспечена обработка путей, относительно каталога текущего файла.
  • При использовании опций -I/–include перебор путей по умолчанию теперь осуществляется с конца списка.
  • Налажена работа опций -o/–optimize с выражениями, содержащими счётчики значений: # nft -c -o -f ruleset.nft Merging: ruleset.nft:5:17-45: ct state invalid counter drop ruleset.nft :6:17-59: ct state established,related counter
    accept into: ct state vmap { invalid counter : drop, established counter : accept,
    related counter : accept } Merging: ruleset.nft:7:17-43: tcp dport 80 counter accept ruleset.nft:8:17-44: tcp dport 123 counter accept into: tcp dport { 80, 123 } counter accept Merging: ruleset.nft:9:17-64: ip saddr 1.1.1.1 ip daddr 2.2.2.2
    counter accept ruleset.nft:10:17-62: ip saddr 1.1.1.2 ip daddr 3.3.3.3
    counter drop into: ip saddr . ip daddr vmap { 1.1.1.1 . 2.2.2.2 counter : accept,
    1.1.1.2 . 3.3.3.3 counter : drop }
  • Восстановлена совместимость с дампами элемента set, созданными в nftables до версии 0.9.8.
Release. Ссылка here.