Nftables

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

Огляд

У пакетному фільтрі 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

Примітки

Посилання

  • Офіційний сайт
  • п
  • о
  • р
Організація
Ядро
Підтримка
  • Розробники
    • The Linux Programming Interface
    • kernel.org
    • LKML
    • Linux conferences
  • Користувачі
    • Linux User Group (LUG)
Реалізація
Debugging
Завантаження
ABIs
APIs
Kernel
System Call
Interface
  • POSIX
    • ioctl
    • select
    • open
    • read
    • close
    • sync
  • Linux-only
    • futex
    • epoll
    • splice
    • dnotify
    • inotify
    • readahead
In-kernel
Userspace
Демони,
Файлові системи
Бібліотеки-
обгортки
Компоненти
  • модулі ядра
  • BlueZ
  • cgroups
  • консоль
  • bcache
  • Device mapper
  • dm-cache
  • dm-crypt
  • DRM
  • EDAC
  • evdev
  • Kernel same-page merging (KSM)
  • LIO
  • Framebuffer
  • LVM
  • KMS driver
  • Netfilter
  • Netlink
  • nftables
  • Network scheduler
  • perf
  • SLUB
  • zram
  • zswap
  • Process and I/O schedulers:
  • O(n) scheduler
  • O(1) scheduler
  • Completely Fair Scheduler (CFS)
  • Brain Fuck Scheduler
  • Noop scheduler
  • SCHED_DEADLINE
  • initramfs
  • KernelCare
  • kexec
  • kGraft
  • kpatch
  • Ksplice
Variants
Віртуалізація
Adoption
Range
of use
  • Desktop
  • Embedded
  • Gaming
  • Тонкий клієнт:
  • Сервер:
  • Devices
Adopters
  • List of Linux adopters
  • GENIVI Alliance
  • '
  • Категорія Категорія:Ядро Linux