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

Опубликован выпуск пакетного фильтра nftables 1.0.8, унифицирующего интерфейсы фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов (нацелен на замену iptables, ip6table, arptables и ebtables). Значительное изменение номера версии не связано с какими-то кардинальными изменениями, а лишь является следствием последовательного продолжения нумерации в десятичном исчислении (прошлый выпуск был 1.0.9). Одновременно опубликован выпуск сопутствующей библиотеки libnftnl 1.2.7, предоставляющей низкоуровневый API для взаимодействия с подсистемой nf_tables.

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

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

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

  • В map-выражениях добавлена поддержка переменных:
    
       define dst_map = { ::1234 : 5678 }
    
       table ip6 nat {
          map dst_map {
             typeof ip6 daddr : tcp dport;
             elements = $dst_map
          }
          chain prerouting {
             ip6 nexthdr tcp redirect to ip6 daddr map @dst_map
          }
       }
    
  • Добавлена поддержка VLAN:
    
       ip saddr 10.1.1.1 icmp type echo-request vlan id set 321
       # payload
       ether type 8021ad vlan id 10 vlan type 8021q vlan id 100 vlan type ip accept
    
  • Для выражений «log» задействован новый строковый препроцессор с поддержкой переменных:
    
       define message="test"
       log prefix "my $message"
    
  • При вычислении значения выражения «meta hour» реализована обработка отрицательного смещения в часовом поясе, заданном через переменную окружения TZ:
    
       TZ=UTC-4 nft add rule x y meta hour "22:00"
    
  • Обеспечено преобразование порядка следования байтов при использовании выражений ct и meta, а также при использовании операций слияния и указания диапазонов в set-наборах.
    
       map mapv6 {
          typeof ip6 dscp : meta mark;
       }
       meta mark set ip6 dscp map @map1
    
       будет получен байткод:
       [ payload load 2b @ network header + 0 => reg 1 ]
       [ bitwise reg 1 = ( reg 1 & 0x0000c00f ) ^ 0x00000000 ]
       [ byteorder reg 1 = ntoh(reg 1, 2, 2) ]
       [ bitwise reg 1 = ( reg 1 › 0x00000006 ) ]
       [ lookup reg 1 set mapv6 dreg 1 ]
       [ meta set mark with reg 1 ]
    
  • Возобновлена поддержка команды «replace rule».
    
       replace rule ip t1 c1 handle 3 'jhash ip protocol . ip saddr mod 170 vmap { 
    0-94 : goto wan1, 95-169 : goto wan2, 170-269 }"
    
  • Возобновлена возможность добавления сетевых устройств в существующие flowtable:
    
       create flowtable inet filter f1 { hook ingress priority 0; counter }
       add flowtable inet filter f1 { devices = { dummy1 } ; }
    
  • Решены проблемы при использовании команды «create set»:
    
       define ip-block-4 = { 1.1.1.1 }
       create set netdev filter ip-block-4-test {
          type ipv4_addr
          flags interval
          auto-merge
          elements = $ip-block-4
       }
    
  • Решены проблемы при использовании цифрового представления опций tcp:
    
        tcp option 254
    
  • Решены проблемы при использовании выражений meta и ct с map-наборами:
    
        meta mark set vlan id map { 1 : 0x00000001, 4095 : 0x00004095 }
    
  • В выражениях payload и concat запрещено указание данных размером больше 512 байтов.
  • При выполнении команды «nft describe» реализован учёт значений из файлов group, rt_mark и rt_realms, размещённых в каталогах /etc/iproute2/ и /use/share/iproute2/.
    
        # nft describe meta rtclassid
        meta expression, datatype realm (routing realm) (basetype integer), 32 bits
    
        pre-defined symbolic constants from /etc/iproute2/rt_realms (in decimal):
            cosmos                                             0
        Reject statement with range
            meta mark set 0-100
    
  • Ускорена операция вывода списка таблиц. Реализована поддержка опции -t/—terse для ускорения команд «list table» и «list set».
  • Обеспечено преобразование выражений meter в динамические set-наборы:
    
       add rule t c tcp dport 80 meter m size 128 { ip saddr timeout 2s limit rate 
    10/second }
    
    будет преобразован в 
    
       set m {
          type ipv4_addr
          size 128
          flags dynamic,timeout
       }
       tcp dport 80 update @m { ip saddr timeout 2s limit rate 10/second burst 5 
    packets }
    
  • В представлении в формате JSON добавлена поддержка объектов synproxy и map-наборов с объединёнными данными.
  • В set-наборах, заданных в формате JSON, реализована поддержка флага auto-merge.
  • При использовании представления в формате JSON разрешено указание нескольких устройств в блоке «chain».
  • При использовании опций -f/—filename обеспечена обработка путей, относительно каталога текущего файла.
  • При использовании опций -I/—include перебор путей по умолчанию теперь осуществляется с конца списка.
  • Налажена работа опций -o/—optimize с выражениями, содержащими счётчики значений:
    
       # nft -c -o -f ruleset.nft
       Merging:
       ruleset.nft:5:17-45:                 ct state invalid counter drop
       ruleset.nft :6:17-59:                 ct state established,related counter 
    accept
       into:
            ct state vmap { invalid counter : drop, established counter : accept, 
    related counter : accept }
    
       Merging:
       ruleset.nft:7:17-43:                 tcp dport 80 counter accept
       ruleset.nft:8:17-44:                 tcp dport 123 counter accept
       into:
            tcp dport { 80, 123 } counter accept
    
       Merging:
       ruleset.nft:9:17-64:                 ip saddr 1.1.1.1 ip daddr 2.2.2.2 
    counter accept
       ruleset.nft:10:17-62:                 ip saddr 1.1.1.2 ip daddr 3.3.3.3 
    counter drop
       into:
              ip saddr . ip daddr vmap { 1.1.1.1 . 2.2.2.2 counter : accept, 
    1.1.1.2 . 3.3.3.3 counter : drop }
    
  • Восстановлена совместимость с дампами элемента set, созданными в nftables до версии 0.9.8.

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