Дата публикации:Wed, 17 Jul 2024 12:26:21 +0300
Опубликован выпуск пакетного фильтра 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.
Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=61564