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

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

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

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

  • В оптимизаторе правил, вызываемом при указании опции »-o/--optimize», налажена автоматическая упаковка правил через их объединение и преобразование в map- и set-списки. Например, правила
         # cat ruleset.nft
         table ip x {
                chain y {
                       type filter hook input priority filter; policy drop;
                       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.4 accept
                       meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept
                       meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 
    accept
                       meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept
                }
         }
    
    после выполнения «nft -o -c -f ruleset.nft» будут преобразованы в следующим образом:
         ruleset.nft:4:17-74:                 meta iifname eth1 ip saddr 1.1.1.1 ip 
    daddr 2.2.2.3 accept
         ruleset.nft:5:17-74:                 meta iifname eth1 ip saddr 1.1.1.2 ip 
    daddr 2.2.2.4 accept
         ruleset.nft:6:17-77:                 meta iifname eth1 ip saddr 1.1.1.2 ip 
    daddr 2.2.3.0/24 accept
         ruleset.nft:7:17-83:                 meta iifname eth1 ip saddr 1.1.1.2 ip 
    daddr 2.2.4.0-2.2.4.10 accept
         ruleset.nft:8:17-74:                 meta iifname eth2 ip saddr 1.1.1.3 ip 
    daddr 2.2.2.5 accept
         into:
                 iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 
    1.1.1.2 . 2.2.2.4, eth1 . 1.1.1.2 . 2.2.3.0/24, eth1 . 1.1.1.2 . 
    2.2.4.0-2.2.4.10, eth2 . 1.1.1.3 . 2.2.2.5 } accept
    
  • Оптимизатор также может преобразовывать в более компактную форму правила, в которых уже используются простые set-списки, например правила:
         # cat ruleset.nft
         table ip filter {
                chain input {
                       type filter hook input priority filter; policy drop;
                       iifname "lo" accept
                       ct state established,related accept comment "In traffic we 
    originate, we trust"
                       iifname "enp0s31f6" ip saddr { 209.115.181.102, 
    216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept
                       iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } 
    ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept
               }
         }
    
    после выполнения «nft -o -c -f ruleset.nft» будут упакованы следующим образом:
         ruleset.nft:6:22-149:                      iifname "enp0s31f6" ip saddr { 
    209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 
    32768-65535 accept
         ruleset.nft:7:22-143:                      iifname "enp0s31f6" ip saddr { 
    64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 
    32768-65535 accept
         into:
                    iifname . ip saddr . ip daddr . udp sport . udp dport { 
    enp0s31f6 . 209.115.181.102 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 
    216.197.228.230 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 64.59.144.17 . 
    10.0.0.149 . 53 . 32768-65535, enp0s31f6 . 64.59.150.133 . 10.0.0.149 . 53 . 
    32768-65535 } accept
    
  • Решена проблема с генерацией байткода для слияния интервалов, в которых применяются типы с разным порядком следования байтов, например IPv4 (сетевой порядок следования байтов) и meta mark (системный порядок следования байтов).
        table ip x {
               map w {
                     typeof ip saddr . meta mark : verdict
                     flags interval
                     counter
                     elements = {
                             127.0.0.1-127.0.0.4 . 0x123434-0xb00122 : accept,
                             192.168.0.10-192.168.1.20 . 0x0000aa00-0x0000aaff : 
    accept,
                     }
              }
              chain k {
                     type filter hook input priority filter; policy drop;
                     ip saddr . meta mark vmap @w
              }
        }
    
  • Налажено сопоставления редких протоколов при использовании raw-выражений, например:
         meta l4proto 91 @th,400,16 0x0 accept
    
  • Решены проблемы с включением правил с интервалами:
         insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
    
  • Улучшен API JSON, в котором появилась поддержка выражений в set- и map-списках.
  • В расширениях к python-библиотеке nftables разрешена загрузка наборов правил для обработки в режиме проверки (»-c») и добавлена поддержка внешнего определения переменных.
  • В элементах set-списков разрешено добавление комментариев.
  • В byte ratelimit разрешено указания нулевого значения.



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

© OpenNet