< nftables

nftables

Szerző: Sallai András

Copyright © Sallai András, 2020, 2022

Licenc: CC Attribution-Share Alike 4.0 International

Web: https://szit.hu

Az nftables

Az nftables az új csomagszabályzó keretrendszer, amely felváltja az iptables, ip6tables, arptables, ebtables infrastruktúrát.

A Linux kernel 3.13 verziójától érhető el. Új parancssori segédprogramot kapott, amelynek szintaxisa is eltér az iptables-től. Az nftables szabályok többdimenziós fába rendezhetők, amelyek segítik az áttekinthetőséget.

Rendelkezik egy kompatibilitási réteggel, amely lehetővé teszi, iptables parancsok futtatását.

Debian 10-en a Netfilter már alapból nftables alapú. Az nftables-t még az iptables paranccsal használjuk. A Debian 11-ben már nincs iptables parancs. Ha szeretnénk iptables parancsot, telepíthető az iptables csomag telepítésével. Ha telepítjük az iptables csomagot, létrejönnek az alapértelmezett táblák, úgymint: input, output, forward, mivel az iptables paranccsal nem hozhatók létre ezek a táblák és láncok; az nftables használatával, meg maguknak kell azokat létrehozni.

Az iptables csomag rendelkezésünkre bocsájt egy iptables-translate nevű parancsot is, ami úgy paraméterezhetünk mint egy iptables parancsot. Az eredmény az nft talbes paraméterezve.

Az nftables-t az nft paranccsal használjuk.

Az nftables-el együtt kapunk egy szolgáltatást:

nftables.service

Az nftables.service leállításával állíthatjuk le a tűzfalat, és tölthetjük be.

Kezdés

Debian 11 operációs rendszer telepítése után nincs tűzfal, nincs egyetlen szabály sem.

A szabályokhoz táblák, láncok szükségesek. Ezek az nftables keretrendszer első használatakor nem állnak rendelkezésre, létre kell azokat hozni.

Szükségünk lesz az nft parancsra. Ellenőrizzük:

# nft --version
nftables v0.9.8 (E.D.S.)

Táblázás

Táblák listázása:

nft list tables

Első indításnál nincs semmilyen tábla.

Egy input tábla létrehozása:

nft add table inet filter

A parancs elemézése:

add - hozzáadunk valamit

table - táblát adunk hozzá

inet - IPv4 és IPv6 címteret használjuk

filter - a létrehozott tábla neve (tetszőleges név)

A szűrésekhez egy filter nevű táblát hoztunk létre.

Most listázzuk a táblákat (prompttal, kimenettel):

# nft list tables
table inet input

Az inet, azt jelenti szeretnénk IPv4 és IPv6 címtérrel is dolgozni.

A filter típusú táblákhoz használható típusok: inet, ip, ip6, arp, bridge

Tábla törlése:

nft delete table inet filter

Láncozás

Új lánc:

nft add chain inet filter input '{type filter hook input priority 0; }'

A parancs elemézése:

add - hozzáadunk valamit

chain - láncot adunk hozzá

inet - IPv4 és IPv6 címtérrel dolgozunk

filter - a filter táblához hozzuk létre

input - a létrehozott lánc neve

aposztrófok között

filter típusú táblához hozunk létre láncot

a kernelben az input nevű kampóhoz csatoljuk a láncot

prioritás

Listázás:

nft list chains

Törlés:

nft delete chain inet filter input

Szabályok

Ha már van láncunk, készíthetünk szabályokat. A szabályokban leírjuk milyen csomagokra szeretnénk illeszkedést, és mit szeretnénk csinálni az illeszkedés esetén.

Listázás

A szabályok listázása:

nft list ruleset

Vagy így:

nft list table inet filter

Szabályok ürítése:

nft flush ruleset

Alap

Elérhető a webszerver:

nft add rule inet filter input tcp dport 80 counter accept

A helyi folyamatok felé jön egy csomag, TCP protokollon keresztül, és a célja a 80-s port, akkor elfogadjuk az „accept” célt alkalmazzuk.

Mindent tiltunk:

nft add rule inet filter input counter drop

A tiltó utasításnál nem adtunk meg semmilyen illeszkedést, ezért minden csomagra illeszkedik, ami befelé jön.

A szabályokra való illeszkedést egymás után, sorba vizsgálja a kernel. Ha egy csomag illeszkedik egy szabályra, a szabály célja kerül végrehajtásra. Ez általában elfogadás vagy tiltás. A további szabályok illeszkedését már nem vizsgálja a kernel. Ezért minden csomagra illeszkedő drop céllal megadott szabályt mindig az utolsó helyre tesszük.

Szabály törléséhez először listázzuk ki a számát:

nft -a list ruleset

Az eredmény valami ilyen:

tcp dport 80 accept # handle 3

Utána mehet a törlés:

nft delete rule inet filter input handle 3

Ha az első szabály ez a tiltás.

Szúrjuk be a második helyre a levelezőszerver engedését:

nft insert rule inet filter input tcp dport 25 counter accept

nft insert rule inet filter input position 3 tcp dport 25 counter accept

Visszatérő csomagok engedélyezése:

nft insert rule inet filter input udp sport 53 counter accept

A beszúrás az első helyre történik.

Beszúrás

nft insert rule inet filter input position 3 tcp dport 21 accept

vagy

nft add rule inet filter input position 3 tcp dport 21 accept

Törlés

Szabályok űrítése

nft flush chain inet filter input

Lokális csomagok

nft insert rule inet filter input iifname "lo" counter accept

Állapotfigyelés

nft add rule inet filter input ct state established,related tcp sport 80 counter accept

Honnan hova

nft add rule inet filter input ip saddr 192.168.10.11 tcp dport 80 counter accept

Vegyes

nft add rule ip filter input ip saddr 192.168.10.11 ip daddr 192.168.20.12 counter accept

Naplózás

nft add rule inet filter input counter log

nft add rule inet filter input counter log prefix \"---ELDOB---\"

Napló figyelése:

tail -f /var/log/syslog

Maszkolás

Létrehozzuk a nat táblát:

nft add table nat

A postrouting lánc létrehozása:

nft add chain nat postrouting { type nat hook postrouting priority 100 \; }

Maszkolás beállítása

nft add rule nat postrouting ip saddr 192.168.10.0/24 oif enp0s3 masquerade

A 192.168.10.0/24 a maszkolt hálózat. Az enp0s3 a kimenő interfész.

A forward engedélyezése:

sysctl -w net.ipv4.ip_forward=1

A forward engedélyezése

Nézzük a forward engedélyezését részletesen, és tartósan; az előző részben a forward engedélyezése a gép újraindítása után nem marad meg.

Az engedélyezés több módon is lehetséges.

sysctl -w net.ipv4.ip_forward=1

Vagy:

echo 1 > /proc/sys/net/ipv4/ip_forward

Ellenőrzés:

sysctl net.ipv4.ip_forward

Hálózati kártyán:

sysctl net.ipv4.conf.enp0s3.forwarding

Tartósan

Ahhoz, hogy a beállítás tartós legyen, be kell írnunk egy fájlba. Az újraindítás után a beállítás aktiválódik. Ha szeretnénk egy új beállítást aktiválni futás közben, erre is van lehetőségünk. Szerkesszük a /etc/sysctl.conf állományt:

nano /etc/sysctl.conf

net.ipv4.ip_forward = 1

Aktualizálás:

sysctl -p /etc/sysctl.conf

Vagy:

systemctl restart procps

Alternatív lehetőség a beállításra:

/etc/sysctl.d/local.conf

Rules tartósan

Az nftables.service

A operációs rendszer telepítése után kapunk egy nftables.service szolgáltatást, ami a rendszerindításkor betölti a szabályokat. Alapértelmezetten a szolgáltatás indulása le van tiltva.

Engedélyezzük a szolgáltatást, hogy a gép újraindítása után a szabályok betöltésre kerüljenek:

systemctl enable nftables

Tűzfal szabályok az /etc/nftables.conf fájlból töltődnek be.

A státusz lekérdezése:

systemctl status nftables

A tűzfal szabályok betöltése paranccsal:

systemctl start nftables

Tűzfal leállítása:

systemctl stop nftables

Indítsuk el:

systemctl start nftables

Mentés

Az nft paranccsal beállított táblák, láncok és tűzfalak a gép újraindítása után elvesznek. Az nftables szolgáltatás a /etc/nftables.conf fájlból olvassa beállításokat. A beállítófájl szintaxisa megegyezik nft list ruleset kimenetével. Ennek eredménye, hogy a kimenetet egyszerűen a /etc/nftables.conf fájlba irányíthatjuk, amit szolgáltatás tud használni.

nft list ruleset > /etc/nftables.conf

Szabályok szerkesztése

A táblák, láncok és szabályok szerkeszthetők egy szövegszerkesztővel is:

nano /etc/nftables.conf

table inet filter { chain input { type filter hook input priority 0; policy drop; iifname lo accept tcp dport 22 accept } chain forward { type filter hook forward pirority 0; } chain output { type filter hook output pirority 0; } }

Az nft paranccsal fájlba irányított állományban nincs benne a következő két sor:

#!/usr/sbin/nft -f
flush ruleset

Nélküle is működik a beállítás, de ez a két sor bekerül, ha telepítjük az iptables csomagot.

Szabályok fájlba

A tűzfal szabályokat lementhetjük saját állományba, amit később felhasználhatunk.

Ha szeretnénk külön fájlba menteni a beállításokat:

nft list ruleset > s.conf

Ezt később felhasználhatjuk.

Az újrafelhasználás előtt a beállítások ürítése:

nft flush ruleset

A szabályok betöltése a fájlból:

nft -f s.conf

Szabályok összeállítása

Kétféle tűzfal készíthetünk:

Alapból minden tiltva, csak azt lehet amit engedünk.

Alapból minden mehet, csak az van tiltva amit beállítunk.

A visszatérő csomagokat figyelhetjük kapcsolat követéssel, vagy nélküle.

Példa

nft insert rule inet filter input iifname "lo" counter accept
nft insert rule inet filter input udp sport 53 counter accept

Leírás:

először engedünk mindent helyben

a DNS szervertől elfogadjuk a befelé jövő csomagokat

Forrás

https://wiki.nftables.org/wiki-nftables/index.php/Main_Page (2022)

https://wiki.archlinux.org/title/nftables (2022)

https://wiki.debian.org/nftables (2022)