Издаване на пакетен филтър nftables 0.9.5

Публикувано издаване на пакетен филтър nftables 0.9.5, развивающий се като заместител на iptables, ip6tables, arptables и ebtables чрез унификация на интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове. В пакета nftables се включват компоненти на пакетен филтър, работещи в потребителското пространство, докато в ядрото функционира подсистемата nf_tables, която е част от ядрото на Linux от версия 3.13. Необходимите за функционирането на версия nftables 0.9.5 промени са включени в ядрото Linux 5.7.

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

Основни нововъведения:

  • В наборите е добавена поддръжка на броячи на пакети и трафика, свързани с елементите на набора. Броячите се включват чрез ключовата дума "counter":

    таблица ip x {
    набор y {
    typeof ip saddr
    counter
    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
    таблица ip x {
    набор y {
    typeof ip saddr
    counter
    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
    таблица ip x {
    набор y {
    typeof ip saddr
    counter
    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 }
    counter
    }

    chain forward {
    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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster