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

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

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

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

  • До наборів додано підтримку лічильників пакетів та трафіку, прив'язаних до елементів набору. Лічильники включаються за допомогою ключового слова «counter»:

    table ip x {
    set y {
    typeof ip saddr
    протидія
    elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }

  • Для встановлення початкових значень лічильників, наприклад, для відновлення минулих лічильників після перезапуску набору можна використовувати команду «nft -f»:

    # cat ruleset.nft
    table ip x {
    set y {
    typeof ip saddr
    протидія
    elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }
    # nft -f ruleset.nft
    # nft list ruleset
    table ip x {
    set y {
    typeof ip saddr
    протидія
    elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }

  • Підтримка лічильників також додана у flowtable:

    table ip foo {
    flowtable bar {
    hook ingress priority -100
    devices = { eth0, eth1 }
    протидія
    }

    ланцюг вперед {
    type filter hook forward priority filter;
    flow add @bar counter
    }
    }

    Подивитися список лічильників можна командною «conntrack-L»:

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 packets=9 bytes=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
    secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
    packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
    packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null use=2

  • У наборах для приєднань (concatenation, певні зв'язки адрес і портів, що спрощують зіставлення) забезпечена можливість використання директиви «typeof», що визначає тип даних елементів для складових елементів набору:

    table ip foo {
    set whitelist {
    typeof ip saddr. tcp dport
    elements = {192.168.10.35. 80, 192.168.10.101. 80 }
    }

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

  • Директива typeof тепер також застосовна для приєднань у map-списках:

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

    chain bar {
    type filter hook prerouting priority filter; policy drop;
    meta mark set ip daddr. tcp dport map @addr2mark accept
    }
    }

  • Додано підтримку приєднань з діапазонами в анонімних (неіменованих) наборах:

    # nft add rule inet filter input ip daddr. tcp dport \
    {10.0.0.0/8. 10-23, 192.168.1.1-192.168.3.8. 80-443} accept

  • Надано можливість відкидання пакетів з прапорами 802.1q (VLAN) при обробці мережевих мостів:

    # nft add rule bridge foo bar ether type vlan reject with tcp reset

  • Додано підтримку зіставлення по ідентифікатору TCP-сеансу (conntrack ID). Для визначення conntrack ID можна використовувати опцію «output id»:

    # conntrack -L -output id
    udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 packets=2 \
    bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
    [ASSURED] mark=0 use=1 id=2779986232

    # nft add rule foo bar ct id 2779986232 counter

Джерело: opennet.ru

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