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

Опубліковано випуск пакетного фільтра nftables 0.9.4, що розвивається як заміна iptables, ip6table, arptables і ebtables за рахунок уніфікації інтерфейсів фільтрації пакетів для IPv4, IPv6, ARP і мережевих мостів. У пакет nftables входять компоненти пакетного фільтра, що працюють у просторі користувача, у той час як на рівні ядра роботу забезпечує підсистема nf_tables, що входить до складу ядра Linux, починаючи з випуску 3.13. Необхідні для роботи випуску nftables 0.9.4 зміни включені до складу майбутньої гілки ядра Linux 5.6.

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

Основні нововведення:

  • Підтримка діапазонів у приєднаннях (concatenation, певні зв'язки адрес і портів, що спрощують зіставлення). Наприклад, для набору "whitelist", елементи якого є приєднанням, вказівка ​​прапора "interval" буде вказувати на те, що набір може включати діапазони в приєднанні (для приєднання "ipv4_addr. ipv4_addr. inet_service" раніше можна було перераховувати точні збіги виду "192.168.10.35. 192.68.11.123», а тепер можна вказувати групи адрес «80-192.168.10.35-192.168.10.40

    table ip foo {
    set whitelist {
    type ipv4_addr. ipv4_addr. inet_service
    flags interval
    elements = {192.168.10.35-192.168.10.40. 192.68.11.123-192.168.11.125. 80 }
    }

    chain bar {
    type filter hook prerouting priority filter; policy drop;
    ip saddr. ip daddr. tcp dport @whitelist accept
    }
    }

  • У наборах і map-списках забезпечено можливість використання директиви «typeof», що визначає формат елемента при зіставленні.
    Наприклад:

    table ip foo {
    set whitelist {
    typeof ip saddr
    elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    chain bar {
    type filter hook prerouting priority filter; policy drop;
    ip daddr @whitelist accept
    }
    }

    table ip foo {
    map addr2mark {
    typeof ip saddr: meta mark
    elements = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
    }
    }

  • Додано можливість використання приєднань у NAT-прив'язках, що дозволяє вказувати адресу та порт при визначенні NAT-перетворень на основі map-списків або іменованих наборів:

    nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }

    nft add map ip nat destinations { type ipv4_addr . inet_service: ipv4_addr. inet_service \\; }
    nft add rule ip nat pre dnat ip addr . port to ip saddr. tcp dport map @destinations

  • Підтримка апаратного прискорення з винесенням деяких операцій фільтрації на плечі картки. Прискорення включається через утиліту ethtool ("ethtool -K eth0 hw-tc-offload on"), після чого активується в nftables для основного ланцюжка за допомогою прапора "offload". При використанні ядра Linux 5.6 підтримується апаратне прискорення для зіставлення полів заголовка та перевірки вхідного інтерфейсу у поєднанні з прийомом, відкиданням, дублюванням (dup) та перенаправленням (fwd) пакетів. У прикладі нижче операції відкидання пакетів, що надходять від адреси 192.168.30.20, виконуються на рівні мережевої карти, без передачі пакетів ядру:

    # cat file.nft
    table netdev x {
    chain y {
    type filter hook ingress device eth0 priority 10; flags offload;
    ip saddr 192.168.30.20 drop
    }
    }
    # nft -f file.nft

  • Поліпшено інформування місця помилки в правилах.

    # nft delete rule ip yz handle 7
    Error: Примітка.
    delete rule ip yz handle 7
    ^

    # nft delete rule ip xx handle 7
    Error: Примітка.
    delete rule ip xx handle 7
    ^

    # nft delete table twst
    Error: No such file or directory; did you mean table 'test' in family ip?
    delete table twst
    ^^^^

    У першому прикладі показано, що таблиця «y» відсутня у системі, у другому, що відсутня обробник «7», а третьому, що виводиться підказка про друкарську помилку при наборі імені таблиці.

  • Додано підтримку перевірки slave-інтерфейсу через вказівку «meta sdif» або «meta sdifname»:

    … meta sdifname vrf1 …

  • Додано підтримку операції зсуву вправо або вліво. Наприклад, для зсуву існуючої мітки пакета вліво на 1 біт і установки меншого біта в 1:

    … meta mark set meta mark lshift 1 or 0x1 …

  • Реалізовано опцію «-V» для відображення розширеної інформації про версію.

    # nft -V
    nftables v0.9.4 (Jive at Five)
    cli: readline
    json: yes
    minigmp: no
    libxtables: yes

  • Опції командного рядка обов'язково повинні вказуватися перед командами. Наприклад, потрібно вказувати nft -a list ruleset, а запуск nft list ruleset -a приведе до виведення помилки.

    Джерело: opennet.ru

Додати коментар або відгук