Изход на пакетния филтър nftables 1.0.0

Публикуван е выпуск на пакетния филтър nftables 1.0.0, който унифицира интерфейсите за филтриране на пакети за IPv4, IPv6, ARP и мрежови мостове (целта е да замени iptables, ip6tables, arptables и ebtables). Необходимите за работата изменения, свързани с версия nftables 1.0.0, са включени в ядрото на Linux 5.13. Значителната промяна в номера на версията не е свързана с кардинални изменения, а е просто следствие от последователността на номерацията в десетичен формат (предишната версия беше 0.9.9).

В пакетa nftables влизат компоненти на пакетния филтър, работещи в пространството на потребителя, докато на ниво ядро работата е осигурена от подсистемата nf_tables, която е част от ядрото на Linux от версия 3.13. На ниво ядро се предоставя само общ интерфейс, независим от конкретния протокол, предлагащ основни функции за извличане на данни от пакети, извършване на операции с данни и управление на потока.

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

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

  • В set-списците е добавена поддръжка на елемента-маска „*“, който сработва за всякакви пакети, които не попадат под другите елементи, определени в набора.
    table x {
    map blocklist {
    type ipv4_addr : verdict
    flags interval
    elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop }
    }
    chain y {
    type filter hook prerouting priority 0; policy accept;
    ip saddr vmap @blocklist
    }
    }
  • Предоставена е възможност за определяне на променливи от командния ред с опцията „—define“.
    # cat test.nft
    table netdev x {
    chain y {
    type filter hook ingress devices = $dev priority 0; policy drop;
    }
    }
    # nft —define dev="{ eth0, eth1 }" -f test.nft
  • В map-списците е разрешено използването на постоянни (stateful) изрази:
    table inet filter {
    map portmap {
    type inet_service : verdict
    counter
    elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop }
    }
    chain ssh_input {
    }
    chain wan_input {
    tcp dport vmap @portmap
    }
    chain prerouting {
    type filter hook prerouting priority raw; policy accept;
    iif vmap { "lo" : jump wan_input }
    }
    }
  • Добавена е командата „list hooks“ за извеждане на списъка с обработчици на даденото семейство пакети:
    # nft list hooks ip device eth0
    family ip {
    hook ingress {
    +0000000010 chain netdev x y [nf_tables]
    +0000000300 chain inet m w [nf_tables]
    }
    hook input {
    -0000000100 chain ip a b [nf_tables]
    +0000000300 chain inet m z [nf_tables]
    }
    hook forward {
    -0000000225 selinux_ipv4_forward
    0000000000 chain ip a c [nf_tables]
    }
    hook output {
    -0000000225 selinux_ipv4_output
    }
    hook postrouting {
    +0000000225 selinux_ipv4_postroute
    }
    }
  • В блоковете «queue» е разрешено комбинирането на изрази jhash, symhash и numgen за разпределение на пакетите по опашки в потребителското пространство. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 «queue» също може да се комбинира с map-списъци за избор на опашка в потребителското пространство въз основа на произволни ключове. … queue flags bypass to oifname map { «eth0» : 0, «ppp0» : 2, «eth1» : 2 }
  • Предоставена е възможност за разкритие на променливи, включващи set-списък, в множество map-ове. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { «lo» : accept, «eth0» : drop, «eth1» : drop } } }
  • Комбинирането на vmap-ове (verdict map) с интервали е разрешено: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
  • Синтаксисът на съвпаденията за NAT е опростен. Разрешено е указването на диапазони на адресите: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } или явни IP адреса и портове: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } или комбинации от диапазони на IP и портове: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }

Източник: opennet.ru

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