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

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

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

Основні зміни:

  • Для систем з ядром Linux 6.2+ додано підтримку зіставлення протоколів vxlan, geneve, gre та gretap, що дозволяє використовувати прості вирази для перевірки заголовків в інкапсульованих пакетах. Наприклад, для перевірки IP-адреси в заголовку вкладеного пакета з VxLAN тепер можна використовувати правила (без необхідності попередньої деінкапсуляції заголовка VxLAN і прив'язки фільтра до інтерфейсу vxlan0): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip. 1.2.3.0/24 … udp dport 4789 vxlan ip saddr. vxlan ip daddr {1.2.3.4. 4.3.2.1}
  • Реалізовано підтримку автоматичного злиття залишків після часткового видалення елемента set-списку, що дозволяє видалити елемент або частину діапазону з існуючого діапазону (раніше діапазон можна було видалити тільки повністю). Наприклад, після видалення елемента 25 з set-списку з діапазонами 24-30 та 40-50 у списку залишаться 24, 26-30 та 40-50. Виправлення, необхідні для роботи злиття, будуть запропоновані в коригувальних випусках стабільних гілок ядра 5.10+. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip xy { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
  • Дозволено використання контактування та діапазонів при мапінг трансляції адрес (NAT). table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat to ip daddr. tcp dport map {10.1.1.136. 80: 1.1.2.69. 1024, 10.1.1.10-10.1.1.20. 8888-8889: 1.1.2.69. 2048-2049 } persistent } }
  • Додано підтримку виразу «last», що дозволяє дізнатися час останнього використання елемента правила або set-списку. Можливість підтримується з ядра Linux 5.14. table ip x {set y {typeof ip daddr. tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip xy table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 останній використаний 1s591ms timeout 1h expires 59m58s409ms, 172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms, 142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms, 172.67.70.134 . 443 останній використаний 4s688ms timeout 1h expires 59m55s312ms, 35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms, 138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms, 34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms, 130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms } } }
  • Додано можливість визначення квот у set-списках. Наприклад, для визначення квоти на трафік для кожної цільової IP-адреси, можна вказати: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device "eth0" priority filter; policy accept; ip daddr @y drop } } # nft add element inet xy { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list 4 quota over 65535 mbytes used 10000 bytes } } chain y { type filter hook egress device «eth8.8.8.8» priority filter; policy accept; ip daddr @y drop } }
  • Дозволено використання констант у set-списках. Наприклад, при використанні ключа списку адреси призначення та ідентифікатора VLAN можна безпосередньо вказати номер VLAN (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr. 123 } counter } }
  • Додано нову команду «destroy» для беззастережного видалення об'єктів (на відміну команди delete не генерує ENOENT при спробі видалення відсутнього об'єкта). Для роботи потрібно щонайменше ядро ​​Linux 6.3-rc. destroy table ip filter

Джерело: opennet.ru

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