Debian, Kali Linux – nftables Firewall

nftables вече е част от Линукс ядрото, осигуряващо филтриране и класифициране на мрежови пакети което в момента се осигурява от netfilter, по известен с интерфейса си iptables, макар да е неправилно или неточно по долу ще го наричам именно така. nftables изцяло заменя iptables, като същевременно запазва и дори подобрява досегашната му функционалност на защитна стена в Линукс. Главното предимство на nftables пред iptables са по малкото правила което осигурява много по голяма производителност. nftables се конфигурира само чрез един интерфейс nft, докато iptables се конфигурира чрез помощните програми iptables, ip6tables, arptables и ebtables. Синтаксиса на nft не прилича много на iptables но веднъж хване ли му се логиката се вижда колко интиутивно е замислен.

Нека да разгледаме по долу снимка на екрана от моя лаптоп с Кали Линукс. Видно е, че съм получил и от двата протокола IPv4/IPv6 мрежови адреси, така наречения Dual Stack. В iptables трябва да конфигурирам и двата протокола в различна конфигурация с iptables и ip6tables но с nftables това не е нужно.

Отварям конфигурационния файл sudo vim /etc/nftables.conf на nftables, изтривам ако има нещо там и копирам следния код:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
        chain input {
                type filter hook input priority 0;
                iif lo accept
                ct state invalid counter drop
                ct state established,related counter accept
                ip protocol icmp counter accept
                ip6 nexthdr icmpv6 counter accept
                counter drop
        }
}

След което изпълнявам командата nft -f /etc/nftables.conf в терминала за да влязат правилата на защитната стена в сила. За да проверим дали всичко е наред можем да изпълним sudo nft list ruleset като общо взето трябва да получим резултат като картинката по долу.

Е, вече имаме разботеща защитна стена в Dual Stack с няколко реда конфигурация която всъщност гласи: – Не позволявай никакви пакети до машината ми освен протокола icmp което напълно ме устройва за моя лаптоп.

Нека все пак да направим един кратък преглед на конфигурацията до тук и да се опитаме да си изясним как работи nftables.

flush ruleset Изтрива всички правила в защитната стена.

table inet filter Създаваме таблицата filter. inet параметъра е много ключов – той показва, че в таблицата ще управляваме и двата протокола IPv4 и IPv6. Тук е мястото да се отбележи, че в iptables таблиците filter, nat, mangle и raw както и веригите INPUT, FORWARD, OUTPUT, PREROUTING, POSTROUTING са перманентно създадени, готови за работа. Тук в nftables това не е така, от гледна точка на ресурси защо трябва да имаме нещо ако не го ползваме, това е и причината да си създаваме таблиците и веригите ние.

chain input Създава верига за входящи пакети в която ще филтрираме и анализираме пакетите които идват от мрежата към нас.

iif lo accept Разреши пакети към input interface 127.0.0.1.

ct state invalid counter drop Блокирай невалидни пакети.

ct state established,related counter accept Регистрирай входящите пакети и създай конекшън в conntrack таблицата.

ip protocol icmp counter accept Рареши icmp за IPv4.

ip6 nexthdr icmpv6 counter accept разреши icmp за IPv6.

counter drop Блокирай всичко без описаните правила по горе.

Сигурен съм, че някой се чуди какво е това counter 🙂 Ами това е брояча на пакети. След като имаме работеща конфигурация за да разберем дали тя работи в iptables изпълнявахме iptables -nvL в терминала за да видим достигнали ли са пакети до тази верига. В iptables всяка таблица, всяка верига и всяко правило има брояч задължително, тази функционалност е невероятен безмислен ресурс когато се търси перформънс в една защитната стена до която достигат няколкостотин хиляди пакета в секунда. Затова в nftables ние избираме въобще дали да конфигурираме брояч на всяка таблица, верига или правило по отделно.

Защитна стена на лаптоп едва би задоволила някой който има сървър със стандартни услуги уеб, фтп, терминал и др. Затова нека да разгледаме един по разширен пример:

#!/usr/sbin/nft -f

flush ruleset

define admin = {172.16.133.21, 172.16.133.22, 172.16.133.23}

define flood = {10.2.2.2, 10.3.3.3, 10.4.4.4, 10.5.5.5,
                10.6.6.6, 10.7.7.7, 10.8.8.8, 10.9.9.9}

table inet filter {
        chain input {
                type filter hook input priority 0;
                iif lo accept
                ct state invalid drop
                ct state established,related accept
                ip saddr 192.168.0.0/16 tcp dport 22 accept
                ip saddr $admin tcp dport 22 accept comment "admin"
                #ip6 saddr 2001:470:20f1:2::/64 tcp dport 22 accept
                udp dport 53 accept
                tcp dport {53, 80, 443} ct state new accept
                ip protocol icmp accept
                #ip6 nexthdr icmpv6 accept
                ip saddr {10.10.10.10, 10.11.11.11} reject with icmp type port-unreachable
                ip saddr {10.12.12.12, 10.13.13.13} tcp dport {80, 443} drop
                ip saddr $flood drop
                counter drop
        }
}

Всеки който е конфигурирал iptables ще се “светне”, че една такава конфигурация ще отнеме не 10 а 50 правила. Причината е, че всеки адрес или мрежа в iptables ще отнеме ново правило. В nftables в едно правило можем да вмъкваме колкото си искаме мрежи или адреси, така намалявайки драстично правилата увеличаваме пропускателната способност на защитната стена в пъти повече което всъщност е големия проблем на iptables (лоша пропускателна способност при DoS атаки или Geo Location филтриране дори при използването на ipset)

За да се запази конфигурацията в сила и да е активна след рестарт е хубаво да изпълним: sudo systemctl enable nftables.service

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.