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

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

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

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

  • Підтримка зіставлення пакетів за часом. Можна визначити як діапазони часу та дат, у яких спрацьовуватиме правило, так і налаштувати спрацьовування в окремі дні тижня. Також додано нову опцію «-T» для виведення епохального часу в секундах.

    meta time "2019-12-24 16:00" - "2020-01-02 7:00"
    meta hour "17:00" - "19:00"
    meta day "Fri"

  • Підтримка відновлення та збереження міток SELinux (secmark).

    ct secmark set meta secmark
    meta secmark set ct secmark

  • Підтримка map-списків synproxy, що дозволяють визначати більше одного правила на бекенд.

    table ip foo {
    synproxy https-synproxy {
    mss 1460
    wscale 7
    timestamp sack-perm
    }

    synproxy other-synproxy {
    mss 1460
    wscale 5
    }

    chain pre {
    type filter hook prerouting priority raw; policy accept;
    tcp dport 8888 tcp flags syn notrack
    }

    chain bar {
    type filter hook forward priority filter; policy accept;
    ct state invalid,untracked synproxy name ip saddr map { 192.168.1.0/24 : "https-synproxy", 192.168.2.0/24 : "other-synproxy" }
    }
    }

  • Можливість динамічного видалення елементів set-наборів із правил обробки пакетів.

    nft add rule … delete @set5 { ip6 saddr . ip6 daddr }

  • Підтримка зіставлення VLAN по ідентифікатору та протоколу, визначених у метаданих інтерфейсу мережного моста;

    meta ibrpvid 100
    meta ibrvproto vlan

  • Опція "-t" ("-terse") для виключення елементів set-наборів при відображенні правил. Під час виконання «nft -t list ruleset» буде виведено:

    table ip x {
    set y {
    type ipv4_addr
    }
    }

    А при "nft list ruleset"

    table ip x {
    set y {
    type ipv4_addr
    elements = { 192.168.10.2, 192.168.20.1,
    192.168.4.4, 192.168.2.34}
    }
    }

  • Можливість вказівки більше одного пристрою в ланцюжках netdev (працює лише з ядром 5.5) для поєднання типових правил фільтрації.

    add table netdev x
    add chain netdev xy { \
    type filter hook ingress devices = { eth0, eth1 } priority 0;
    }

  • Можливість додавання описів типів даних.

    # nft describe ipv4_addr
    datatype ipv4_addr (IPv4 address) (basetype integer), 32 bits

  • Можливість складання CLI-інтерфейсу з бібліотекою linenoise замість libreadline.

    ./configure —with-cli=linenoise

Джерело: opennet.ru

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