[[oktatas:linux:tuzfal:netfilter:nftables|< nftables]]
====== nftables ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2020, 2022
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|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
=== Hálózat ===
nft add rule ip filter input ip saddr 192.168.10.0/24 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)