Выпуск пакетного фильтра nftables 1.0.8
Опубликован выпуск пакетного фильтра nftables 1.0.8, унифицирующего интерфейсы фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов (нацелен на замену iptables, ip6table, arptables и ebtables). В пакет nftables входят компоненты пакетного фильтра, работающие в пространстве пользователя, в то время как на уровне ядра работу обеспечивает подсистема nf_tables, входящая в состав ядра Linux начиная с выпуска 3.13. На уровне ядра предоставляется лишь общий интерфейс, не зависящий от конкретного протокола и предоставляющий базовые функции извлечения данных из пакетов, выполнения операций с данными и управления потоком.
Непосредственно правила фильтрации и специфичные для протоколов обработчики компилируются в байткод в пространстве пользователя, после чего данный байткод загружается в ядро при помощи интерфейса Netlink и выполняется в ядре в специальной виртуальной машине, напоминающей BPF (Berkeley Packet Filters). Подобный подход позволяет значительно сократить размер кода фильтрации, работающего на уровне ядра и вынести все функции разбора правил и логики работы с протоколами в пространство пользователя.
Основные изменения:
- Добавлена возможность установки меток «meta» и «ct» из других полей в правилах. Например, для создания метки «meta» на основе манипуляций с IP-адресом из заголовка DSCP можно использовать конструкции вида:
... meta mark set ip dscp ... meta mark set ip dscp and 0x0f ... meta mark set ip dscp ‹ 8 ... meta mark set (ip dscp and 0xf) ‹ 8
- В оптимизаторе правил, вызываемом при указании опции »-o» (»--optimize»), улучшена упаковка выражений, связанных с трансляцией адресов (NAT). Например, правила
ip saddr 10.141.11.0/24 masquerade ip saddr 10.141.13.0/24 masquerade tcp dport 83 redirect to :8083 tcp dport 84 redirect to :8084
будут объединены вip saddr { 10.141.11.0/24, 10.141.13.0/24 } masquerade redirect to :tcp dport map { 83 : 8083, 84 : 8084 }
- В анонимных map-списках реализована поддержка сохраняющих состояние (stateful) выражений, таких как счётчики:
... meta mark { 0xa counter, 0xb counter } ... ip saddr vmap { 127.0.0.1 counter : drop, * counter : accept }
- Появилась возможность упаковки наборов правил со сопоставленями 'ct state', без потери возможности подсчёта пакетов, например:
... ct state vmap { established counter : accept, \ related counter : accept, \ invalid counter : drop }
- На системах с ядром Linux 6.5 добавлена поддержка сброса сохраняющих состояние выражений (обнуления счётчиков) в списках element, set и map:
reset element t m '{ 1.2.3.4 }' reset map ip t m reset set ip t m
- Упрощён синтаксис команды «reset», позволяющей обнулять сохраняющую состояние информацию в правилах, такую как счётчики и состояние квот:
reset rules # сброс всех счётчиков reset rules ip # сброс всех счётчиков для семейства 'ip' reset rules ip t # сброс всех счётчиков для таблицы 'filter' в семействе 'ip' reset rules ip t c # сброс всех счётчиков в цепочке 'input'
При сбросе именованных объектов появилась возможность не указывать ключевое слово «table»:
reset counters reset counters ip reset counters ip filter
- Решена проблема с выводом некорректных сообщений об ошибках из-за отсутствия указания транспортного протокола при использовании map-выражений вида
... redirect to :tcp dport map { 83 : 8083, 84 : 8084 }
(осуществляет перенаправление трафика на localhost, выбирая порт перенаправления в зависимости от целевого порта, например, пакеты к порту 83 будут перенаправлены на TCP-порт 8083 хоста localhost).
При попытке загрузки правил, размер которых превышает ограничение, применяемое в непривилегированном пространстве имён (например, при попытке загрузки списков GeoIP в контейнере), обеспечен вывод рекомендации по увеличению значения параметра »/proc/sys/net/core/wmem_max».
- Разрешено обновление устройств в существующих цепочках netdev.
# cat ruleset.nft table netdev x { chain y { type filter hook ingress devices = { eth0 } priority 0; policy accept; } } # nft -f ruleset.nft # nft add chain netdev x y '{ devices = { eth1 }; }' # nft list ruleset table netdev x { chain y { type filter hook ingress devices = { eth0, eth1 } priority 0; policy accept; } } # nft delete chain netdev x y '{ devices = { eth0 }; }' # nft list ruleset table netdev x { chain y { type filter hook ingress devices = { eth1 } priority 0; policy accept; } }
В выводе «nft list sets» по умолчанию включено отображение элементов списка. Для отключения показа элементов предложена опция »-t» (»--terse»).
- Улучшены диагностические сообщений при ошибках, вызванных неверным выбором типа данных и некорректным использованием jump/goto в map.
# cat test.nft table ip x { map y { typeof ip saddr : verdict elements = { 1.2.3.4 : filter_server1 } } } # nft -f test.nft test.nft:4:26-39: Error: Could not parse netfilter verdict; did you mean `jump filter_server1'? elements = { 1.2.3.4 : filter_server1 } ^^^^^^^^^^^^^^
- В наборах для присоединений (concatenation, определённые связки адресов и портов, упрощающие сопоставление) реализована возможность указания констант.
... update @s1 { ip saddr . 10.180.0.4 . 80 }
- Добавлена поддержка отображения комментариев при выводе таблиц и цепочек в формате JSON:
# nft -j list ruleset {"nftables": [{"metainfo": {"version": "1.0.7", "release_name": "Old Doc Yak", "json_schema_version": 1}}, {"table": {"family": "inet", "name": "test3", "handle": 4, "comment": "this is a comment"}}]}
- Добавлена возможность использования JSON при сопоставлении инкапсулированных и туннелируемых данных. Например, для сопоставления с полем dscp, инкапсулированным в заголовок vxlan, можно использовать следующую конструкцию:
# udp dport 4789 vxlan ip dscp 0x02 [ { "match": { "left": { "payload": { "field": "dport", "protocol": "udp" } }, "op": "==", "right": 4789 } }, { "match": { "left": { "payload": { "field": "dscp", "protocol": "ip", "tunnel": "vxlan" } }, "op": "==", "right": 2 } } ]
- Добавлена поддержка JSON в выражении 'last used', показывающем когда последний раз использовался элемент правила или списка.
- В команде 'nft list hooks' обеспечен показ зарегистрированных обработчиков bpf.
- Запрещено одновременное использование параметров »-i» (»--interactive») и »-f» (»--filename»).
В Python-привязках применение distutils заменено на setuptools.
Источник: http://www.opennet.ru/opennews/art.shtml? num=59444
© OpenNet