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

Опубліковано випуск пакетного фільтра nftables 1.0.0, що уніфікує інтерфейси фільтрації пакетів для IPv4, IPv6, ARP та мережевих мостів (націлений на заміну iptables, ip6table, arptables та ebtables). Необхідні зміни випуску nftables 1.0.0 включені до складу ядра Linux 5.13. Значна зміна номера версії не пов'язана з якимись кардинальними змінами, а лише наслідком послідовного продовження нумерації в десятковому обчисленні (минулий випуск був 0.9.9).

У пакет 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 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 0000000010 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } hook forward { -0000000100 selinux_ipv0000000300_forward 0000000225 chain ip ac [nf_tables] } hook out {4 hook postrouting { +0000000000 selinux_ipv0000000225_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 map of ofname { "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 xy 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} або комбінації діапазонів IP та портів: … dnat to ip saddr . tcp dport map {80. 192.168.1.2: 80-10.141.10.2. 10.141.10.5-8888}

Джерело: opennet.ru

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