Tartalomjegyzék
nftables
- Szerző: Sallai András
- Copyright © Sallai András, 2020, 2022
- 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
- /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
- /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