Пускането на пакетния филтър nftables 0.9.4

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

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

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

  • Поддръжка на диапазони в присъединенията (като съединение, определени комбинации от адреси и портове, опростяващи съпоставянето). Например за набор "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 . 192.68.11.123-192.168.11.125 . 80"):

    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-преобразувания на базата на списъци с карти или именовани набори:

    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 y z handle 7
    Грешка: Не може да се обработи правилото: Няма такъв файл или директория
    delete rule ip y z handle 7
    ^

    # nft delete rule ip x x handle 7
    Грешка: Не може да се обработи правилото: Няма такъв файл или директория
    delete rule ip x x handle 7
    ^

    # nft delete table twst
    Грешка: Няма такъв файл или директория; имали ли сте предвид таблица 'test' в семейство 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

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