The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

15.07.2023 12:05

Опубликован выпуск пакетного фильтра 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.


  1. Главная ссылка к новости (https://www.mail-archive.com/n...)
  2. OpenNews: Уязвимости в ядре Linux, затрагивающие nftables и модуль tcindex
  3. OpenNews: Уязвимости в Netfilter и io_uring, позволяющие повысить свои привилегии в системе
  4. OpenNews: Уязвимость в nftables, позволяющая повысить свои привилегии
  5. OpenNews: Выпуск пакетного фильтра iptables 1.8.9
  6. OpenNews: Выпуск пакетного фильтра nftables 1.0.7
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/59444-nftables
Ключевые слова: nftables
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (37) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Роман (??), 13:04, 15/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Нормально, JSON для автогенераций, счётчики для биллинга в "облаках"
     
  • 1.2, Аноним (2), 13:05, 15/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Ничему их история успеха флэша не научила, всё тянут свои виртуальные машины с житами.
     
     
  • 2.3, Тот_Самый_Анонимус__ (?), 13:43, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Надо на webassebly — он универсален.
     

  • 1.4, Всадник Апокалипсиса (?), 14:46, 15/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что лучше использовать для изучения сетей: nftables или pf?
     
     
  • 2.5, Аноним (5), 15:08, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    лучше пару лет потерпеть и сразу учить пакетный фильтр будущего, вместо этих кусков г.
     
     
  • 3.6, Всадник Апокалипсиса (?), 15:26, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Что это ещё за пакетный фильтр будущего?
     
     
  • 4.31, Госпидя (?), 18:24, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    достаточно одной команды deny
     
  • 2.7, leap42 (ok), 15:30, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Что лучше использовать для изучения сетей: nftables или pf?

    Cisco

     
     
  • 3.8, Аноним (8), 15:36, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Он попросил для изучения, а не мучения
     
     
  • 4.26, Аноним (26), 02:34, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    я бы сказал vendor"имения"
     
  • 3.9, Иваня (?), 15:37, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А если на это нет денег?
     
  • 3.21, Аноним (21), 20:16, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ушла
     

  • 1.10, lucentcode (ok), 17:24, 15/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Ну, а фильтрацию по string, как в iptables --match string не завезли до сих пор? Уже не один год простейшее(модуль string) завести не могут. Нет, я конечно понимаю, что можно перевести строку в байты, и по байтам фильтровать пакеты, но делать это вручную жутко не удобно. То ли дело фичи модуля string, с ними дело идёт куда веселей.
     
     
  • 2.11, Аноим (?), 17:54, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Если вас не устраивает nftables, зачем на него переезжать?
    Оставайтесь с iptables
     
     
  • 3.13, Андрей04091977 (ok), 17:59, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    из rhel 9 iptables выпилен
     
     
  • 4.24, Tron is Whistling (?), 20:44, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Кто вам такое сказал? iptables-legacy на месте, мы допустим на nftables не переехали ещё.
     
  • 2.15, Аноним (15), 18:50, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Айпишник - это не строка. Это 32 бита в случае с IPv4. Фильтруются по префиксу.

    Пакет - это тоже не строка. Это не UTF-8 строка, это не ASCII-строка, это не еще-черт-знает-в-какой-кодировке строка. Это набор байт, причем потенциально зашифрованных в случае с TLS. Что ты там собрался фильтровать по строке - остается загадкой блдь.

     
     
  • 3.22, Аноним (21), 20:19, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Собирается впарить в пользовательские браузеры корпоратиный безопастный сертефикат.
     
  • 3.25, Tron is Whistling (?), 20:45, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    В DNS-запросах например можно строку поискать.
     
     
  • 4.32, Аноним (32), 18:50, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Можно, и даже изредка нужно. Но чаще всё равно приходится пользоваться отдельным AF типа Knot resolver, потому что строку поискать мало, надо ещё с результатом что-то сделать, и чаще нетривиальное.
     
  • 3.41, lucentcode (ok), 13:18, 31/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А кто говорил, что IP 8212 это строка Я, выше, подобного нигде не писал Сам... большой текст свёрнут, показать
     

  • 1.14, Аноним (14), 18:00, 15/07/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Даже Red Hat офигел от вида этих правил и написал к ним фронтенд - firewalld. Потому что знали, что иначе саппорт утонет в вопросас от тех, кому не посчастливилось родиться гиком и кто не в состоянии вникнуть в эту мешанину фигурных скобок...
     
     
  • 2.17, Пушок (?), 19:10, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >Даже Red Hat офигел от вида этих правил и написал к ним фронтенд - firewalld. Потому что знали, что всё меньше остаётся желающих тратить жизнь на мешанину фигурных скобок...
     
  • 2.19, Аноним (19), 20:03, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > посчастливилось родиться гиком

    Не дац боженька такого счастья. Уд лучше алкоголиком.

     
     
  • 3.20, Аноним (19), 20:04, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    (писал выпимши)
     
  • 2.23, Аноним (23), 20:28, 15/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    В firewalld я стараюсь берег не терять из виду, там тоже можно утонуть. Хорошо, что 99% задач на поверхности. А если от скуки заглянуть поглубже в кроличью нору, получаешь по ЧСВ нокаутирующий удар.
     
  • 2.27, Аноним (27), 05:06, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Так-то все совсем наоборот, firewalld нарисован чтобы можно было на плоских портянках iptables соорудить что-то удобоваримое.
     
  • 2.28, Аноним (5), 06:55, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    однако json лучше чем yaml, а то ещё пропустишь пробел пока редактируешь в nano
     
  • 2.29, Аноним (29), 07:07, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А как я много лет пользовался firewalld ДО появления nftables тогда? Вообще firewalld лишь недавно портировали для работы с nftables (и то в связи с депрекацией iptables).
     
     
  • 3.34, jeyson (?), 20:03, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Всё просто: до появления nftables firewalld был фронтом для itables. Т.е. для тех, кто умел только firewalld пользоваться, переход состоялся вобще незаметно. Круто же
     
  • 2.30, пох. (?), 09:57, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Даже Red Hat офигел от вида этих правил и написал к ним фронтенд - firewalld.

    наоборот. Эти невменяемые простыни с фигурными скобочками, непригодные для управления из командной строки и чтения человеком - как раз и придуманы чтобы упростить написание firewalld и гомощельных интерфейсов какввенде.

    Или ты думал, что формат вывода в нескучном json - это для людей делали?

     
     
  • 3.33, Аноним (32), 18:52, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Так хорошо же. Наконец-то делают удобно. А когда неудобно, всегда можно собственный генератор правил написать. Кодить-то хоть умеешь?
     
     
  • 4.36, пох. (?), 21:44, 16/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Кому удобно? Мне было вполне удобно с iptables. Не без косяков (которые не могли исправить годами - эти вот умеющие кодить) но пользоваться было можно.

    А какввенде у меня уже есть - в венде. И кодить не надо.

     
     
  • 5.37, Аноним (32), 17:33, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Мне удобно. Ну и ещё пару ребят знаю, им тоже нравится как оно в продах топ500 работает. Если тебе не подходит, ну что ж сделаешь? Не пользуйся, накодь своё.
     
     
  • 6.38, пох. (?), 18:22, 17/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Мне удобно. Ну и ещё пару ребят знаю, им тоже нравится как
    > оно в продах топ500 работает.

    ок. Вот такой линoops. Паре ребят сделали щастье (потому что за ними платиновый спонсор, зато сэкономивший на сетевом железе за их счет), остальным устроили п-ц. А потом такие "пачиму вы нас не любите".

    > Если тебе не подходит, ну что ж сделаешь? Не пользуйся, накодь своё.

    ты уже много накодил-то?

    Не пользуюсь, линoops пошел нахрен со всех моих сетевых фильтров. Доживает свой век в паре совсем древних систем, естественно, с iptables и древним-древним ведром без вредных улучшизмов додолбавших их таки в хлам. Либо ng-fw, либо уж хрен с ним, древний цискин аплайанс. По сравнению с iptables чудовищно уродливо (но спасает трассировщик которого у вас нет и не будет) по сравнению с этим фигурноскобчатым невменозом - просто само совершенство.

     
     
  • 7.39, Аноним (32), 23:03, 18/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Паре ребят сделали щастье (потому что за ними платиновый спонсор

    Кто девушку ужинает, тот её и танцует. Ты вроде взрослый мужик, уже стыдно думать в твоём возрасте что тебе мир что-то должен.

    > А потом такие "пачиму вы нас не любите".

    Это тебе кажется. Вряд ли кто-то так спрашивает на самом деле. Отчасти потому, что в гнавшихся три дня, чтобы сказать как им безразличен линукс в интернете никогда не было недостатка, отчасти потому, что без разницы кто там кого любит или не любит. Любить или не любить можно человека. А линукс — просто инструмент для зарабатывания денег. Если ты не можешь на нём зарабатывать, чьи это проблемы?

    > ты уже много накодил-то?

    Сегодня прям дохера, часа три код писал не отрываясь. А ты?

    > линoops пошел нахрен со всех моих сетевых фильтров

    КИСА ТЫ ОБИДЕЛАС?

     
  • 3.40, Легивон (?), 21:33, 21/07/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Я пишу без фигурных скобочек (за исключением минималистичной части - объявляения таблиц/чейнов/хуков, которые я забил 1 раз в плейбук и больше о них не вспоминал) и у меня все работает. И от iptables отличается лишь синтаксисом (в iptables короткие аргументы с тире, а в nftables слова, но соотвествие по сути 1:1, переучиваться не надо).
    За это небольшое неудобство я получаю дичайшую киллер фитчу - бесшовное обновление МЭ находу и ipsets встроеные в фаервол! Только за это можно смело сказать: nftables - NUJNO, хорошо сделали.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру