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 — підсистема ядра 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 більше схожий на реальну граматику.
Наприклад, команда що блокує пакети які направляються за адресою 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