[[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)