В пакет 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.
Источник: http://www.opennet.ru/opennews/art.shtml?num=61564