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

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

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

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

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

  • В set-списках появилась поддержка сопоставления имён сетевых интерфейсов по маске, например, заданной с использованием символа »*»:
         table inet testifsets {
            set simple_wild {
                   type ifname
                   flags interval
                   elements = { "abcdef*",
                                "othername",
                                "ppp0" }
            }
    
            chain v4icmp {
                    type filter hook input priority 0; policy accept;
                    iifname @simple_wild counter packets 0 bytes 0
                    iifname { "abcdef*", "eth0" } counter packets 0 bytes 0
            }
         }
    
  • Реализовано автоматическое объединение пересекающихся элементов set-списка во время работы. Ранее при выставлении опции «auto-merge» объединение производилось на стадии объявления правил, а теперь срабатывает и при инкрементальном добавлении новых элементов в процессе работы. Например, на этапе объявления список
       set y {
          flags interval
          auto-merge
          elements = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24,
                       3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8,
                       3.3.3.4, 3.3.3.5 }
       }
    
    будет превращён в 
       elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5,
                    4.4.4.4-4.4.4.8 }
    
    , а затем если добавить новые элементы
         # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 }
    
    примет вид
       elements = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6,
                    4.4.4.4-4.4.4.8 }
    

    При удалении из списка отдельных элементов, попадающих в существующие элементы с диапазонами, диапазон сокращается или разделяется.

  • В оптимизатор правил, вызываемый при указании опции »-o/--optimize», добавлена поддержка объединения нескольких правил трансляции адресов (NAT) в map-список. Например, для набора
         # cat ruleset.nft
         table ip x {
                chain y {
                        type nat hook postrouting priority srcnat; policy drop;
                        ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80
                        ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90
                }
         }
    

    выполнение «nft -o -c -f ruleset.nft» приведёт к преобразованию раздельных правил «ip saddr» в map-список:

        snat to ip saddr . tcp dport map { 1.1.1.1 . 8000 : 4.4.4.4 . 80, 
    2.2.2.2 . 8001 : 5.5.5.5 . 90 }
    

    Аналогично в map-списки могут преобразовываться и raw-выражения:

         # cat ruleset.nft
         table ip x {
                [...]
    
                chain nat_dns_acme {
                        udp length 47-63 @th,160,128 
    0x0e373135363130333131303735353203 goto nat_dns_dnstc
                        udp length 62-78 @th,160,128 
    0x0e31393032383939353831343037320e goto nat_dns_this_5301
                        udp length 62-78 @th,160,128 
    0x0e31363436323733373931323934300e goto nat_dns_saturn_5301
                        udp length 62-78 @th,160,128 
    0x0e32393535373539353636383732310e goto nat_dns_saturn_5302
                        udp length 62-78 @th,160,128 
    0x0e38353439353637323038363633390e goto nat_dns_saturn_5303
                        drop
                }
         }
    

    после оптимизации получим map-cписок:

       udp length . @th,160,128 vmap { 47-63 . 
       0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 
       0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 
       0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 
       0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 
       0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }
    
  • Разрешено использование raw-выражений в операциях конкатенации. Например:
         # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e }
    или
         table x {
                set y {
                        typeof ip saddr . @ih,32,32
                        elements = { 1.1.1.1 . 0x14 }
                }
         }
    
  • Добавлена поддержка указания целочисленных полей заголовков в операциях конкатенации:
         table inet t {
                map m1 {
                        typeof udp length . @ih,32,32 : verdict
                        flags interval
                        elements = { 20-80 . 0x14 : accept,
                                     1-10 . 0xa : drop }
                }
    
                chain c {
                        type filter hook input priority 0; policy drop;
                        udp length . @ih,32,32 vmap @m1
                }
         }
    
  • Добавлена поддержка сброса TCP-опций (работает только при наличии ядра Linux 5.18+):
         tcp flags syn reset tcp option sack-perm
    
  • Ускорено выполнение команд вывода цепочек («nft list chain x y»).



Источник: http://www.opennet.ru/opennews/art.shtml? num=57285

© OpenNet