След година разработка релиз на пакетния филтър , развиваващ се като заместител на iptables, ip6table, arptables и ebtables чрез унификация на интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове. Пакетът nftables включва компоненти на пакетния филтър, работещи в потребителското пространство, докато на ниво ядро работата осигурява подсистемата nf_tables, която е част от ядрото на Linux от версия 3.13 насам.
На ниво ядро се предоставя само общ интерфейс, независим от конкретния протокол и предлагащ основни функции за извличане на данни от пакети, изпълнение на операции с данни и управление на потока.
Непосредствено логиката на филтриране и специфичните за протокол обработчици се компилират в байткод в потребителското пространство, след което този байткод се зарежда в ядрото чрез интерфейса Netlink и се изпълнява в специална виртуална машина, наподобяваща BPF (Berkeley Packet Filters). Този подход позволява значително да се намали размерът на кода за филтриране, работещ на ниво ядро, и да се изнесат всички функции за анализ на правила и логиката на работа с протоколите в потребителското пространство.
Основни нововъведения:
- Поддръжка на IPsec, позволяваща съпоставяне на адресите на тунелите, свързани с пакета, идентификатора на запитването IPsec и етикета SPI (Security Parameter Index). Например,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Също е възможна проверка на преминаването на маршрута през тунел IPsec. Например, за блокиране на трафик, който не преминава през IPSec:
… filter output rt ipsec missing drop
- Поддръжка на протокола IGMP (Internet Group Management Protocol). Например, за отхвърляне на входящи IGMP запитвания за членство в група може да се използва правило
nft add rule netdev foo bar igmp type membership-query counter drop
- Възможност за използване на променливи за определяне на вериги за пренасочване (jump / goto). Например:
define dest = ber
add rule ip foo bar jump $dest - Поддръжка на маски за идентифициране на операционни системи (OS Fingerprint) на базата на стойностите на TTL в заглавката. Например, за маркиране на пакети в зависимост от операционната система на изпращача може да се използва командата:
… meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
… osf ttl skip version «Linux:4.20» - Възможност за съпоставяне на ARP адреса на изпращача и IPv4 адреса на целевата система. Например, за увеличаване на броя на ARP пакетите, изпратени от адрес 192.168.2.1, може да се използва правило:
table arp x {
chain y {
тип фильтра крючка ввод приоритет фильтра; политика принять;
arp saddr ip 192.168.2.1 счетчик пакетов 1 байт 46
}
} - Поддръжка на прозрачно пренасочване на заявки през прокси (tproxy). Например, за пренасочване на запитвания към порт 80 на порт на прокси 8080:
таблица ip x {
chain y {
тип филтър крючка пренасочване приоритет -150; политика приемане;
tcp dport 80 tproxy към :8080
}
} - Поддръжка на маркиране на сокети с възможност за получаване на зададена марка чрез setsockopt() в режим SO_MARK. Например:
таблица inet x {
chain y {
тип филтър крючка пренасочване приоритет -150; политика приемане;
tcp dport 8080 mark set сокет mark
}
} - Поддръжка за задаване на текстови имена на приоритети за вериги. Например:
nft добави верига ip x raw { тип филтър крючка пренасочване приоритет raw; }
nft добави верига ip x filter { тип филтър крючка пренасочване приоритет filter; }
nft добави верига ip x filter_later { тип филтър крючка пренасочване приоритет filter + 10; } - Поддръжка на метки SELinux (Secmark). Например, за определяне на марка «sshtag» в контекста на SELinux може да се стартира:
nft добави secmark inet filter sshtag «system_u:object_r:ssh_server_packet_t:s0»
А след това използвайте тази марка в правилата:
nft добави правило inet filter input tcp dport 22 meta secmark set «sshtag»
nft добави карта inet filter secmapping { тип inet_service : secmark; }
nft добави елемент inet filter secmapping { 22 : «sshtag» }
nft добави правило inet filter input meta secmark set tcp dport карта @secmapping - Възможност за задаване на закрепени към протоколи портове в текстов вид, както са определени в файла /etc/services. Например:
nft добави правило x y tcp dport «ssh»
nft списък ruleset -l
таблица x {
chain y {
…
tcp dport «ssh»
}
} - Възможност за проверка на типа мрежов интерфейс. Например:
добави правило inet raw prerouting meta iifkind «vrf» приема
- Подобрен контрол на динамичното обновление на съдържанието на набори (sets) чрез явното указание на флага «dynamic». Например, за обновяване на набора «s» с добавяне на изходния адрес и нулиране на записа при отсъствие на пакети за 30 секунди:
добави таблица x
добави набор x s { тип ipv4_addr; размер 128; таймаут 30s; флагове динамични; }
добави верига x y { тип филтър крючка въвеждане приоритет 0; }
добави правило x y обнови @s { ip saddr } - Възможност за задаване на отделно условие за възникване на таймаут. Например, за презаписване на таймаута по подразбиране за пакети, постъпващи на порт 8888, може да се укаже:
таблица ip filter {
ct timeout agressive-tcp {
протокол tcp;
l3proto ip;
политика = {established: 100, close_wait: 4, close: 4}
}
верига output {
…
tcp dport 8888 ct таймаут set «agressive-tcp»
}
} - Поддръжка на NAT за семейство inet:
таблица inet nat {
…
ip6 daddr dead::2::1 dnat към dead:2::99
} - Подобрен контрол на грешките поради печатни грешки:
nft добави верига filtre test
Грешка: Няма такъв файл или директория; имате предвид таблица «filter» в семейството ip?
добави верига filtre test
^^^^^^ - Възможност за задаване на имена на интерфейси в набори (sets):
набор sc {
тип inet_service . ifname
елементи = { «ssh» . «eth0» }
} - Актуализиран синтаксис на правилата flowtable:
nft добави таблица x
nft добави flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }
…
nft добави правило x пренасочване ip протокол { tcp, udp } поток добави @ft - Подобрена поддръжка на JSON.
Източник: opennet.ru
