The OpenNET Project / Index page

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

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

14.03.2023 11:53

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

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

Основные изменения:

  • Для систем с ядром Linux 6.2+ добавлена поддержка сопоставления протоколов vxlan, geneve, gre и gretap, что позволяет использовать простые выражения для проверки заголовков в инкапсулированных пакетах. Например, для проверки IP-адреса в заголовке вложенного пакета из VxLAN, теперь можно использовать правила (без необходимости предварительной деинкапсуляции заголовка VxLAN и привязки фильтра к интерфейсу vxlan0):
    
          ... udp dport 4789 vxlan ip protocol udp
          ... udp dport 4789 vxlan ip saddr 1.2.3.0/24
          ... udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
    
  • Реализована поддержка автоматического слияния остатков после частичного удаления элемента set-списка, что позволяет удалить элемент или часть диапазона из существующего диапазона (раньше диапазон можно было удалить только целиком). Например, после удаления элемента 25 из set-списка с диапазонами 24-30 и 40-50 в списке останутся 24, 26-30 и 40-50. Исправления, необходимые для работы автослияния, будут предложены в корректирующих выпусках стабильных веток ядра 5.10+.
    
          # nft list ruleset
          table ip x {
              set y {
                  typeof tcp dport
                  flags interval
                  auto-merge
                  elements = { 24-30, 40-50 }
              }
          }
    
          # nft delete element ip x y { 25 }
    
          # nft list ruleset
          table ip x {
              set y {
                  typeof tcp dport
                  flags interval
                  auto-merge
                  elements = { 24, 26-30, 40-50 }
              }
          }
    
  • Разрешено использование контактации и диапазонов при маппинге трансляции адресов (NAT).
    
      table ip nat {
          chain prerouting {
              type nat hook prerouting priority dstnat; policy accept;
              dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 
    10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent
         }
      }
    
  • Добавлена поддержка выражения "last", позволяющего узнать время последнего использования элемента правила или set-списка. Возможность поддерживается начиная с ядра Linux 5.14.
    
      table ip x {
          set y {
              typeof ip daddr . tcp dport
              size 65535
              flags dynamic,timeout
              last
              timeout 1h
          }
    
          chain z {
              type filter hook output priority filter; policy accept;
              update @y { ip daddr . tcp dport }
          }
      }
    
      # nft list set ip x y
      table ip x {
          set y {
              typeof ip daddr . tcp dport
              size 65535
              flags dynamic,timeout
              last
              timeout 1h
              elements = { 172.217.17.14 . 443 last used 1s591ms timeout 1h expires 59m58s409ms,
                           172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms,
                           142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms,
                           172.67.70.134 . 443 last used 4s688ms timeout 1h expires 59m55s312ms,
                           35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms,
                           138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms,
                           34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms,
                           130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms }
             }
      }
    
  • Добавлена возможность определения квот в set-списках. Например, для определения квоты на трафик для каждого целевого IP-адреса, можно указать:
    
      table netdev x {
          set y {
              typeof ip daddr
              size 65535
              quota over 10000 mbytes
          }
    
          chain y {
              type filter hook egress device "eth0" priority filter; policy accept;
              ip daddr @y drop
          }
      }
    
      # nft add element inet x y { 8.8.8.8 }
      # ping -c 2 8.8.8.8
     
      # nft list ruleset
      table netdev x {
          set y {
              type ipv4_addr
              size 65535
              quota over 10000 mbytes
              elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes }
          }
    
          chain y {
              type filter hook egress device "eth0" priority filter; policy accept;
              ip daddr @y drop
          }
      }
    
  • Разрешено использование констант в set-списках. Например, при использования в качестве ключа списка адреса назначения и идентификатора VLAN можно напрямую указать номер VLAN (daddr . 123):
    
          table netdev t {
              set s {
                  typeof ether saddr . vlan id
                  size 2048
                  flags dynamic,timeout
                  timeout 1m
              }
    
              chain c {
                  type filter hook ingress device eth0 priority 0; policy accept;
                  ether type != 8021q update @s { ether daddr . 123 } counter
              }
          }
    
  • Добавлена новая команда "destroy" для безоговорочного удаления объектов (в отличие от команды delete не генерирует ENOENT при попытке удаления отсутствующего объекта). Для работы требуется как минимум ядро Linux 6.3-rc.
    
         destroy table ip filter
    


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


Обсуждение (40) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.17, Аноним (17), 14:01, 14/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Лучший пакетный фильтр. Хотя системы надо проектировать так, чтобы nftables/iptables были опциональными = чтобы система не перестала быть защищенной, если эти фильтры внезапно отключить.
     
     
  • 2.20, Аноним (20), 14:06, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Лучший?

    Уже 10 лет у них просят string/hex match, в ответ: используйте iptables.

     
     
  • 3.21, Аноним (21), 14:10, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    нет регулярок? пичалько
     
     
  • 4.63, Аноним (63), 01:30, 20/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Регулярки - тяжесть.
     
  • 3.23, Аноним (17), 14:16, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    фильтровать айпишники по "регуляркам и строкам"? вы там с дуба рухнули? уже есть маски
     
     
  • 4.26, Аноним (26), 15:17, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Причём тут IP?!

    Где я написал хоть слово про IP?!

    Мне содержимое пакетов надо анализировать и на основе этого drop.

    И нет, я не ISP, мне это для домашней машины надо.

     
     
  • 5.27, Аноним (17), 15:30, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    и что же ты там по сырому потенциально зашифрованному телу пакета собрался фильтровать?
     
     
  • 6.36, Аноним (26), 16:14, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Аноним, у тебя галлюцинации?

    Где ты увидел слово "зашифрованный" трафик?

    Сначала ты нёс про IP, теперь про шифрование, дальше что?

     
     
  • 7.46, Аноним (46), 20:29, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Приведи юзкейс уже для такого.
     
     
  • 8.51, _Kuzmich (ok), 08:27, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Непонятно почему человека заминусили У меня такой юзкейс в сторону бакэнда дел... текст свёрнут, показать
     
  • 8.61, saa (?), 18:23, 19/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    iptables -I INPUT -p tcp --sport 80 -m string --string Location http warning... текст свёрнут, показать
     
  • 5.32, pfg21 (ok), 15:45, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    пишешь нфтейблес "пакеты перенаправлять в мою программу" и там онализируешь.
     
     
  • 6.35, Аноним (26), 16:13, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Песец.

    А вы мне подарите EPYC на 96 ядер, чтобы гонять трафик из ядра в userspace и обратно для потока в 500Mbit?

     
     
  • 7.39, Аноним (39), 16:28, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Значит просто, без задней мысли, пишешь нфтейблес "пакеты перенаправлять в мой модуль ядра" и там анализируешь
     
  • 7.41, Аноним (41), 19:11, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    50 мбайт/с? 96 ядер ??? Такой поток пишется на жесткий диск 20 летней свежести одним ядром тех же времен
     
  • 7.47, Аноним (46), 20:30, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Чел, чем ты там занимаешься?!
     
     
  • 8.49, bergentroll (ok), 23:32, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Комменты пишет же... текст свёрнут, показать
     
  • 7.56, Аноним (56), 12:21, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Тебе лучше на чём-то из этого https://www.xilinx.com/products/boards-and-kits/alveo.html фильтровать. Дешевле выйдет, чем 96 ядер.
     
  • 3.30, Аноним (30), 15:37, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >используйте eBPF

    fixed.

     

  • 1.25, Аноним (-), 14:35, 14/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Изучаю базовые команды линуха. Уже взялся тыкать iptables, но тут узнал, что это легаси и ненужно. А собственно чем nftables лучше? Ну кроме того, что iptables выпиливают из свежих дистров.
     
     
  • 2.28, Аноним (28), 15:34, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > что iptables выпиливают из свежих дистров

    А в замен ничего не впиливают?

     
  • 2.31, pfg21 (ok), 15:44, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    по теме "чем лучше" написаны кучи статей, но сложных и мудреных.  
    iptables остается до поры до времени, как один из интерфейсов управления, его правила компилируются в "nftables-байткод" и отдаются в ядро на исполнение.
     
  • 2.33, Аноним (33), 15:57, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    iptables сейчас работает через nftables.
    К тому же он проще, если его действительно удаляют из дистрибутивов то очень плохо
     
  • 2.37, Аноним (26), 16:15, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Лучше, ХЗ.

    Сложнее на порядок и синтаксис ад - да, несомненно.

     
     
  • 3.52, 1 (??), 09:09, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Я голосую за приведения синтаксиса nftables к синтаксису rust. И все будут довольны.
    Опять же безопастностЪ !
     
  • 3.58, Аноним (56), 13:22, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Что в нём адово? Синтаксис наподобие iproute2.
     
  • 2.38, Аноним (26), 16:18, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    iptables никуда не денутся ещё ... всегда будут, просто потому что userspace API Линус не ломает, точка.

    Изучайте, используйте.

    Другой вопрос, что в новомодных компаниях их местные senior devops могут решить, что nfilters - будущее, и вы обязаны их использовать.

     
     
  • 3.43, llolik (ok), 19:38, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    iptables - это не API ядра, это утилиты. В ядре только, собственно, сам фильтр - netfilter. Так что выкинуть могут.

    > и вы обязаны их использовать

    Ну, не утверждаю про обязаны, но nftables, как-минимум ИМХО, сильно читабельней.

     

  • 1.29, Аноним (30), 15:35, 14/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >выполняется в ядре в специальной виртуальной машине, напоминающей BPF (Berkeley Packet Filters).

    eBPF?

     
  • 1.40, лютый ж.... (?), 17:17, 14/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    не взлетит, пока доцкеры сидят на iptables
     
     
  • 2.42, Аноним (42), 19:30, 14/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Давно уже не использую iptables и вырубил его использование у докера вообще, тол... большой текст свёрнут, показать
     
     
  • 3.64, Аноним (63), 01:33, 20/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Волшебные номера вхардкожены, и - имена интерфейсов. А тогда - не так всё просто.
     

  • 1.44, Аноним (44), 19:48, 14/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Помнится мне обещали что ip4 скоро кончится, зато ip6 который мне присвоят не требует настройки брандмауэра!
     
     
  • 2.50, Аноним (50), 06:17, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Наоборот же :). Не меньше, а больше брандмауэра, из-за отсутствия NAT.

    Но ipv6 всё равно отличная вещь, там, где он есть.

     
     
  • 3.53, 1 (??), 09:10, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    И ещё более отличная, там где его нет.
     
  • 3.57, Аноним (56), 13:17, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    В Linux запилили NAT для IPv6.
     
     
  • 4.62, saa (?), 18:26, 19/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    это не тот нат, что в ип4.
     
  • 2.55, Аноним (56), 12:11, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >ip6 который мне присвоят не требует настройки брандмауэра!

    1. IPv6 в РФ не присвоят, РКН против.
    2. Тебе безбожно врали.

     
     
  • 3.59, Аноним (59), 15:01, 15/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > 1. IPv6 в РФ не присвоят, РКН против.

    Каво? У меня пров /56 сети раздаёт... Хошь подключай.

     

  • 1.54, ChatGPT (?), 10:57, 15/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Я не осилил, в отличие от iptables. Это надо отдельно курс пройти по разработке конфигураций.
     

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



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

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