The OpenNET Project / Index page

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

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

21.02.2022 23:15

Опубликован выпуск пакетного фильтра nftables 1.0.2, унифицирующего интерфейсы фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов (нацелен на замену iptables, ip6table, arptables и ebtables). Необходимые для работы выпуска nftables 1.0.2 изменения включены в состав ядра Linux 5.17-rc.

В пакет nftables входят компоненты пакетного фильтра, работающие в пространстве пользователя, в то время как на уровне ядра работу обеспечивает подсистема nf_tables, входящая в состав ядра Linux начиная с выпуска 3.13. На уровне ядра предоставляется лишь общий интерфейс, не зависящий от конкретного протокола и предоставляющий базовые функции извлечения данных из пакетов, выполнения операций с данными и управления потоком.

Непосредственно правила фильтрации и специфичные для протоколов обработчики компилируются в байткод в пространстве пользователя, после чего данный байткод загружается в ядро при помощи интерфейса Netlink и выполняется в ядре в специальной виртуальной машине, напоминающей BPF (Berkeley Packet Filters). Подобный подход позволяет значительно сократить размер кода фильтрации, работающего на уровне ядра и вынести все функции разбора правил и логики работы с протоколами в пространство пользователя.

Основные новшества:

  • Добавлен режим оптимизации правил, включаемый при помощи новой опции "-o" ("--optimize"), которую можно комбинировать с опцией "--check" для проверки и оптимизации изменений в файле с набором правил без его фактической загрузки. Оптимизация позволяет объединять похожие правила, например, правила:
    
          meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept
          meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.5 accept
          ip saddr 1.1.1.1 ip daddr 2.2.2.2 accept
          ip saddr 2.2.2.2 ip daddr 3.3.3.3 drop
    

    будут объединены в

    
          meta iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 
    1.1.1.2 . 2.2.2.5 } accept
          ip saddr . ip daddr vmap { 1.1.1.1 . 2.2.2.2 : accept, 2.2.2.2 . 3.3.3.3 
    : drop }
    

    Пример использования:

    
       # nft -c -o -f ruleset.test
       Merging:
         ruleset.nft:16:3-37:  ip daddr 192.168.0.1 counter accept
         ruleset.nft:17:3-37:  ip daddr 192.168.0.2 counter accept
         ruleset.nft:18:3-37:  ip daddr 192.168.0.3 counter accept
       into:
         ip daddr { 192.168.0.1, 192.168.0.2, 192.168.0.3 } counter packets 0 bytes 0 accept
    
  • В set-списках реализована возможность указания ip- и tcp-опций, а также chunk-ов sctp:
    
            set s5 {
                   typeof ip option ra value
                   elements = { 1, 1024 }
            }
    
            set s7 {
                   typeof sctp chunk init num-inbound-streams
                   elements = { 1, 4 }
            }
    
            chain c5 {
                   ip option ra value @s5 accept
            }
    
            chain c7 {
                   sctp chunk init num-inbound-streams @s7 accept
            }
    
  • Добавлена поддержка TCP-опций fastopen, md5sig и mptcp.
  • Добавлена поддержка использования в сопоставлениях подтипа mp-tcp:
    
            tcp option mptcp subtype 1
    
  • Улучшен код фильтрации, работающий на стороне ядра.
  • Для flowtable реализована полная поддержка формата JSON.
  • Предоставлена возможность использования действия "reject" в операциях сопоставления Ethernet-кадров.
    
            ether saddr aa:bb:cc:dd:ee:ff ip daddr 192.168.0.1 reject
    


  1. Главная ссылка к новости (https://www.mail-archive.com/n...)
  2. OpenNews: Выпуск пакетного фильтра nftables 1.0.1
  3. OpenNews: Выпуск пакетного фильтра nftables 1.0.0
  4. OpenNews: Оптимизация Linux для обработки 1.2 млн JSON-запросов в секунду
  5. OpenNews: Уязвимость в подсистеме ядра Linux Netfilter
  6. OpenNews: Разработчики Netfilter отстояли коллективное принятие решений при нарушении GPL
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/56739-nftables
Ключевые слова: nftables, netfilter
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (51) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, InuYasha (??), 23:38, 21/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Не, забавно, конечно, а может, и удобно. Но каждый раз когда начинают сыпать сахар в синтаксис, возникает ситуация, когда одно и то же можно сделать 10ю способами. И всё.

    Не понял немного про точки, но вообще, если правил не тысячи, "до оптимизации" было читать в столбик проще. IMHO, конечно.
          meta iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 .
    1.1.1.2 . 2.2.2.5 } accept

     
     
  • 2.4, Аноним (4), 00:04, 22/02/2022 Скрыто модератором
  • +5 +/
     
     
  • 3.7, YetAnotherOnanym (ok), 01:21, 22/02/2022 Скрыто модератором
  • +1 +/
     
  • 2.36, Аноним (36), 12:59, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Не понял немного про точки

    это типа конкатенация такая
    После оптимизации все, что в скобках можно выписать в столбик и дать имя. Тогда останется одна строчка с правилом и отдельно список значений, на соответствие которым это правило и будет проверять

     

  • 1.2, Аноним (2), 23:40, 21/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А ICMP и IGMP не фильтрует что ли?
     
     
  • 2.3, llolik (ok), 23:45, 21/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Фильтрует. Но для примера лучше самые попсовые.
     

  • 1.5, Ан (??), 01:10, 22/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    R
    К сожалению, ничего лучше pf в мире брандмауэров до сих пор не придумано.
     
     
  • 2.10, Azudim (??), 02:16, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Я вот тоже все поглядываю на замены, но что то не вижу альтернатив..

    Вот где еще можно сделать читабельный конфиг, когда у тебя на хосте 2 внешних интерфейса, 5 локальных сетей, 5-6 инстансов OpenPVN со своими ифейсами + MPD который 50 PPPoE сессий поднимает, тонна пробросов на разные сервисы внутри и т.д.. ?

     
     
  • 3.14, Аноним (14), 05:50, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Надо структурировать задачи и подойти к её решению со стороны zone based firewall.
    nftables позволяет сконструировать что угодно.
     
  • 3.32, Аноним (32), 11:55, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –4 +/
    >MPD который 50 PPPoE сессий поднимает

    *  media-sound/mpd
    Latest version available:
    Latest version installed: [ Not Installed ]
    Size of files: 710 KiB
    Homepage:      https://www.musicpd.org https://github.com/MusicPlayerDaemon/MPD
    Description:   The Music Player Daemon (mpd)
    License:       GPL-2
    Шта?

     
     
  • 4.35, Sin2x (ok), 12:28, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +4 +/
    http://mpd.sourceforge.net/
     
  • 3.34, pfg21 (ok), 12:26, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    дык проще простого, пиши програмку с читабельным конфигом, которая компеляет ентот человекочитаблеьный конфиг в байт-код nft. и все будет оке.
     
  • 3.50, пох. (?), 10:18, 03/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Ну если на мир смотреть через дырку в сортире, кроме жопы ничего и не видно.

    > MPD который 50 PPPoE сессий поднимает

    просто переходите на темную сторону и заканчивайте создавать проблемы пользователям.

    Нет pppoe, нет половины проблемы. А остальное можно оставить в pf.

     
  • 2.19, Anon090807 (?), 09:42, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >К сожалению, ничего лучше iptables в мире брандмауэров до сих пор не придумано.

    Поправил тебя. Можешь не благодарить.
    P.S. И находятся же еще в мире странные существа, считающие это убожество - pf - пределом мечтаний.

     
     
  • 3.22, llolik (ok), 10:25, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >>К сожалению, ничего лучше iptables в мире брандмауэров до сих пор не придумано.
    > Поправил тебя. Можешь не благодарить.

    Ну если быть совсем точным, то iptables - это не брандмауэр, а набор управляющих утилит (как и сабжевый nftables). Брэндмауэр - это netfilter и он в ядре.

    А по сабжу, лично мне nftables понравился, хотя и некоторые расширения iptebles пока не реализованы ( https://wiki.nftables.org/wiki-nftables/index.php/Supported_features_compared_ ). Конфиг пишется понятно и довольно интуитивно, через консоль писать километровые команды построчно - задача не обязательная. Из относительных минусов: документацию хотелось-бы более-менее консистентную, а не ситуационную wiki.

     
  • 3.41, Azudim (??), 14:49, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    А есть возможность с IPTABLES прослушать трафик на всех портах разом и выяснить какое правило iptables блокирует/разрешает прохождение пакета? Или просто, какие правила пакет проходит и на каких интерфейсах?


     
     
  • 4.45, Аноним (4), 18:31, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    modprobe nf_log
    iptables -t raw -I PREROUTING <критерий выбора пакета> -j TRACE
     
     
  • 5.51, пох. (?), 13:04, 03/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    только nf_log_ipv4

    (угу, очередное поулучшайкали)

    sysctl который это активировал, соответственно, стал ненужен.

     
  • 2.31, Аноним (31), 11:40, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Agnitum Outpost Firewall
     

  • 1.6, Аноним (6), 01:15, 22/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +11 +/
    Какой-то ад, по-моему. Пфом по функционалу оно не стало. А синтаксис для среднестатистического админа нетривиален. Вопрос знатокам: а зачем? Это под гуй тулзы делалось, чтоб для погроммистов мышкой писать окошки админам мышкой?

    Пипитаблес звезд с неба не хватал, но был понятен и прозрачен. А для админа который без знаний погроммирования это важно.

     
     
  • 2.8, Аноним (8), 01:37, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Я тут с дебиана 9 на 11 переводил VDSку, так и не разобрался, даже по статьям свежим не работает. В итоге через прослойку iptables сделал. Целый язык-фреймворк придумали. А надо было срочно перейти, т.к. я в команде chmod перед слешем точку не поставил.
     
     
  • 3.9, mumu (ok), 01:49, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Через прослойку вполне нормальный подход. Все знакомые так делали. Импорт, экспорт, потом немного править руками (define-ы те же). Всё работает как часы.
    Нет ни одной причины что-то там писать с нуля, кроме академической.
     
     
  • 4.11, Аноним (6), 02:48, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Зная о том как пишутся костыли гхм прослойки и прочие трансляторы, я бы переписал с 0. Так спокойнее.

    Зы. Посоны, война по ходу началась. Всем соболезную.

     
     
  • 5.24, Sultan (?), 10:29, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Что уж, перепишите...
    А мне - оно и так работает.
     
  • 5.30, Sultan (?), 11:22, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Там сложность в том, что в iptables куча сторонних модулей, трансляцию синтаксиса которых...
     
  • 3.13, Аноним (14), 05:48, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Кто ж виноват, что Вы не готовились заранее Да и правила iptables в большинстве... большой текст свёрнут, показать
     
     
  • 4.20, Аноним (8), 09:44, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    А как сделать перенаправление с виртуального /dev/tap_vpn на внешний интерфейс? Т.е. подключаюсь к сети сервера, но чтобы в инет через него?
     
     
  • 5.25, Sultan (?), 10:34, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Тут сумбур какой-то. Опишите задачу ясней. Половина ответа содержится в правильно сформулированном вопросе.
    Если вы приходите по впн, терминируемом сервером, то нужен просто NAT типо такого:
    table ip nat {
            set lans {
                    type ipv4_addr
                    flags interval
                    auto-merge
                    elements = { 192.168.0.11,
                                 192.168.0.12,
                                 192.168.0.15-192.168.0.20 }
            }

            chain PREROUTING {
                    type nat hook prerouting priority dstnat; policy accept;

            }

            chain INPUT {
                    type nat hook input priority 100; policy accept;
            }

            chain POSTROUTING {
                    type nat hook postrouting priority srcnat; policy accept;
                    oif "eno2" ip saddr @lans counter masquerade
            }

            chain OUTPUT {
                    type nat hook output priority -100; policy accept;
            }
    }

     
     
  • 6.43, Аноним (43), 16:30, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    При запуске сервера запускается это:
    ip address add 192.168.250.1/24 dev tap_vb0
    iptables -t nat -A POSTROUTING -s 192.168.250.0/24 -j SNAT --to-source 8x.14x.4x.20x
    и как это через nft?
     
     
  • 7.47, Аноним (47), 11:07, 24/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    table inet filter {
    ...
    set nat {
            type ipv4_addr
            flags interval
            elements = {
                    192.168.1.0/24,
                    192.168.250.0/24
            }

    ...
        chain POSTROUTING {
            type nat hook postrouting priority srcnat; policy accept;
            oifname "OUT_INTERFACE" ip saddr @nat counter snat to 8x.14x.4x.20x
        }
    }

     
  • 6.44, Аноним (43), 16:32, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    и dnsmasq занимается динамическими IP
     
  • 2.12, Аноним (14), 05:38, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А по-моему, там всё отлично. Именованные списки sets и maps - очень удобны, жаль только, что не глобальны.
    jump, так вообще - вещь, во многих случаях позволяющая избавиться от линейного поиска.
    Вот подход линейных портянок pf и ipfilter без каких либо списков, на мой взгляд, не оптимальен - это подход а-ля Cisco acl 20-25 летней давности.
    pf пригоден только как хостовый пакетный фильтр, и то часто хотелось бы большего.
     
     
  • 3.16, Sw00p aka Jerom (?), 06:52, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >jump, так вообще - вещь, во многих случаях позволяющая избавиться от линейного поиска

    пример в студию

     
     
  • 4.23, Sultan (?), 10:26, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Точно так же, как в iptables. Синтетический пример:
    iif eth0 ...
    ...
    iif eth0 ...
    iif eth1 ...

    меняем на
    iif eth0 jump eth0-forward

    table eth0 eth0-forward {
       ваши проверки
    }

    И пакеты не бегают по линейному списку

     
     
  • 5.33, Sw00p aka Jerom (?), 12:08, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >[оверквотинг удален]
    > iif eth0 ...
    > ...
    > iif eth0 ...
    > iif eth1 ...
    > меняем на
    > iif eth0 jump eth0-forward
    > table eth0 eth0-forward {
    >    ваши проверки
    > }
    > И пакеты не бегают по линейному списку

    это что за пример? по какому линейному списку если правила форвардинга никак не пересекаются с правилами фильтрации. Давайте конкретный полный пример, как с реализацией в iptables так и с nftables.

     
     
  • 6.37, Sultan (?), 13:09, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Правила могут пересекаться как для разных интерфейсов, так и для сервисов.
    В гугле всё есть - идите и берите "полный пример".
     

  • 1.15, leap42 (ok), 06:39, 22/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Кулсисопы негодуе, а сетевикам - каеф xD
    /s
     
     
  • 2.21, User (??), 10:05, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Сетевики, однако, на цисках давно, и даже sdn все нихрена не на голых *tables.
    В общем, пионэры идите в...
     
     
  • 3.42, leap42 (ok), 16:22, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > В общем, пионэры идите в...

    Пиоэнэры админят свои циски (привет 90е) с венды через pussy.exe, пока профи сидят на линухах (на которых тож внезапно есь огнестена, и давно перешли на жуники). Да и на серваках firewall в приличных конторах настраивает сетевик, а не кулсисоп, как в вашей богадельне.

    /s

     
     
  • 4.46, User (??), 07:19, 23/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Пиоэнэры админят свои циски (привет 90е) с венды через pussy.exe,

    Вы так говорите, как будто в этом есть что-то плохое)
    > Да и на серваках firewall в приличных конторах настраивает сетевик, а не кулсисоп, как в вашей богадельне.

    Ага. На всех трех. Настраивает и настраивает, настраивает и настраивает, наяривает... В перерывах между извлечением застрявшей бумаги из принтера и переносом монитора Зинаиды Васильевны от окна чтоб не дуло.
    Firewall. На серваках. Сетевики. В 2022. Ъ.
    В худшем случае это какой нибудь ansible по всему зоопарку делает, в более ином вообще ни файрволла ни серваков - одна оркестрашка в облаке...

     
     
  • 5.52, пох. (?), 13:09, 03/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > одна оркестрашка в облаке...

    и сплошной ALLOW для всех.

    А потом нвидия такая "ой, даже верилоги поперли!" - кто бы мог подумать, да и было ли, чем.
    (особенно учитывая что кульхацкеры ТОЖЕ не смогли - правда "зато у нас есть бэкап!")


     
  • 2.29, Sultan (?), 11:10, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Один из немногих вменяемых фильтров пакетов.
     

  • 1.17, Аноним (17), 06:55, 22/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    После systemd хоть камни с неба
     
  • 1.18, Аноним (18), 08:22, 22/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    что то не осилил как такую конструкцию втащить?

    -A PREROUTING -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name DEFSSH --mask 255.255.255.255 --rsource
    -A PREROUTING -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name DEFSSH --mask 255.255.255.255 --rsource -j DROP

    а ещё я в ipset добавляю себя на несколько часов когда удачно по ssh захожу и соответственно есть правило
    -A PREROUTING -m set --match-set temp_allow_hosts src -j ACCEPT

    кто то пытался такое перетаскивать в nft?

     
     
  • 2.26, Аноним (4), 10:36, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    https://stackoverflow.com/a/69178498 например
     
  • 2.28, Sultan (?), 11:09, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    С ipset надо переписывать на named sets и named maps. Например:

    -A PREROUTING -m set --match-set temp_allow_hosts src -j ACCEPT
    надо переписать на named sets

    table ip nat {
            set temp_allow_hosts {
                    type ipv4_addr
                    flags interval
                    auto-merge
                    elements = { 192.0.0.0/24, 192.168.0.0/24,
                                 192.168.10.0/24, 192.168.20.0/24,
                                 192.168.251.0-192.168.254.255 }
            }
    ...
            chain POSTROUTING {
                    ip saddr @temp_allow_hosts counter accept
            }
    ...
    }

    Изучайте документацию - там всё есть.
    Есть и недостаток - пока переписаны не все модули.

     

  • 1.27, Аноним (27), 10:42, 22/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Шли годы...
    А документации по nftables (нет, пара кривых, устаревших вики-страниц - это не она) так и не появлялось.
     
     
  • 2.39, Аноним (39), 13:54, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    man nft
     
  • 2.53, пох. (?), 13:11, 03/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    как будто документация по iptables была чем-то хороша?

    Последней качественной линуксной документацией был LARTC. Причем и тот вызывал плевки и перекошенные рожи кодерков "нэ так всэ это было, нэ так!" - поскольку писали его методом реверса, проб и ошибок. Кодеркам было некогда писать документацию, надо было быстрее-быстрее еще что-то поломать.

     

  • 1.38, March_13 (?), 13:12, 22/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Раз уж упомянули... скажите, а вы SCTP часто используете?
     
     
  • 2.40, Аноним (32), 14:02, 22/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Я сказал демону sshd использовать SCTP. Работает. Но не тестировал пропускную способность по сранению с TCP.
     

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



    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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