nftables — підсистема ядра Linux, що забезпечує фільтрацію і класифікацію мережевих пакетів / дейтаграм / кадрів. Включена в ядро, починаючи з версії 3.13, випущеної 19 січня 2014 року. Є проєктом із заміни фреймворків iptables, ip6tables, arptables, ebtables в мережевому екрані Netfilter. Шляхом об'єднання функціональності фреймворків, у nftables менше дублюється код при побудові правил для Netfilter і краща низькорівнева оптимізація. Станом на 26 квітня 2016 року перебуває в процесі розробки. У просторі користувача nftables налаштовується за допомогою утиліти nft.

Nftables
Тип утиліта
консольний застосунокd і мережевий екран
Платформа Ядро Linux і Linux-libred
Операційна система GNU/Linux[d] і Android
Мова програмування C
Ліцензія GNU General Public License, version 2.0[d]
Репозиторій git.netfilter.org/nftables/
Вебсайт netfilter.org/projects/nftables/

Огляд ред.

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

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

Синтаксис командного рядка nft ред.

Синтаксис nft більше схожий на реальну граматику.

Наприклад, команда що блокує пакети які направляються за адресою 1.2.3.4:

nft add rule ip filter output ip daddr 1.2.3.4 drop

Синтаксис такої ж дії для iptables:

iptables -t filter -A OUTPUT -j DROP -d 1.2.3.4

Для забезпечення зворотної сумісності надається спеціальний прошарок, що дозволяє використовувати iptables/ip6tables поверх інфраструктури nftables.

Історія ред.

Проєкт був вперше представлений на Netfilter Workshop 2008 Патріком Мак-Гарді з команди по розробці ядра Netfilter

Перший попередній реліз реалізації ядра і призначеного для користувача простору був представлений в березні 2009 року. Хоча інструмент був названий найбільшою зміною брандмауера Linux з моменту появи iptables у 2001 році, в той час він отримав мало освітлення в пресі.

У жовтні 2012 року, був запропонований прошарок сумісності з iptables і анонсоване можливе включення проєкту в основну гілку ядра. 16 жовтня 2013 року було відправлено запит на включення змін (pull request) в ядро ​​Linux. 19 січня 2014 року nftables був включений в ядро ​​Linux версії 3.13.

Зразок ред.

Перевірити стан служби можна командою sudo systemctl status nftables.service

nftables може стартувати при запуску, для цього необхідно увімкнути сервіс sudo systemctl enable nftables.service , при цьому усі правила будуть автоматично завантажуватись, при запуску системи, із файлу /etc/nftables.conf

Зразки файлів з налаштуваннями nftables.conf можна переглянути тут

Мій файл виглядає приблизно так

#!/usr/sbin/nft -f

flush ruleset # очищення попередніх правил 

 # таблиця правил для ip_v4(ip)
 # якщо використати ip6 то таблиця буде для ip_v6
 # для використання таблиці для обох протоколів треба вказати inet
table ip filter {
	chain input { # ланцюжок для вхідних з'єднань
		type filter hook input priority filter; policy drop; # відкинути усі вхідні з'єднання окрім описаних нижче
		meta l4proto icmp limit rate 10/minute accept # дозволити icmp запити (10 за хвилину) інакше перейти далі
		meta l4proto icmp drop # відкинути icmp запити, інакше вони потраплять у наступне правило, а вони рахуються established і відповіді будуть дозволені
		ct state established,related accept # дозволити вже встановленні з'єднання
		iif "lo" accept # дозволити внутрішні з'єднання служб з локальною машиною
		ip saddr 172.16.10.0/24 tcp dport 22 accept # дозволити SSH з'єднання з локальної мережі 172.16.10.0/24
		ip saddr 192.168.200.0/24 tcp dport 22 accept # дозволити SSH з'єднання з локальної мережі 192.168.200.0/24
		tcp dport 22 drop # заборонити з'єднання по SSH 
		tcp dport 80 accept # дозволити http 
	}

	chain forward { # ланцюжок для прохідних з'єднань
		type filter hook forward priority filter; policy drop; # заборонити прохідні з'єднання, оскільки машина не використовується як роутер або комутатор https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_home_router
	}

	chain output { # ланцюжок для вихідних з'єднань
		type filter hook output priority filter; policy accept; # дозволити вихідні з'єднання
	}
}

Зміни внесені у файл потрібно передати у службу nft -f /etc/nftables.conf

Щоб переглянути поточні правила використайте команду nft list ruleset

Примітки ред.

Посилання ред.