nftables on modernin Linux-ytimen (kernel ≥ 3.13, tuotantokelpoinen ≥ 4.14) oletuspalomuurikehys, joka korvaa vanhat iptables-, ip6tables-, arptables- ja ebtables-työkalut yhdellä yhtenäisellä nft-komennolla, atomisilla sääntöpäivityksillä ja natiivilla dual-stack-tuella IPv4:lle ja IPv6:lle. Tässä oppaassa määrität kovennetun nftables-palomuurin 2026-tason parhaita käytäntöjä noudattaen: SSH:n rate limitiä, ct state -pohjaista suodatusta, IP-mustia listoja setseillä, lokitusta ja iptables-nft-migraatiota. Kaikki esimerkit on testattu Debian 12/13:lla, Ubuntu 24.04 LTS:llä ja RHEL 9/10:llä käyttäen nftables 1.1.x -sarjaa.
nftables on ollut Debianin, Ubuntun ja Red Hat Enterprise Linux 8+:n oletuspalomuuri jo vuodesta 2019 alkaen, ja iptables-nft toimii vain yhteensopivuuskerroksena.
Kovennetun perusrungon tulee käyttää inet-perhettä, kolmea peruschainia (input, forward, output) hook-prioriteeteillä ja oletusverdiktinä drop.
SSH-brute-forcea vastaan tehokkain ratkaisu on nftablesin natiivi meter/set-rate limit yhdistettynä IP-mustaan listaan, ei erillinen fail2ban.
Säännöt kannattaa tallentaa /etc/nftables.conf-tiedostoon ja aktivoida nftables.service-systemd-yksiköllä, jotta ne selviävät uudelleenkäynnistyksestä.
Loki-outputit ohjautuvat kerneliin (kern.warn), ja ne voidaan kerätä journalctl:lla, ulogd2:lla tai suoraan Wazuh/SIEM-alustalle.
iptables-migraatio tehdään turvallisesti iptables-restore-translate-työkalulla ja tarkistetaan nft list ruleset-vertailulla ennen tuotantoon vientiä.
Mikä nftables on ja miten se eroaa iptablesista?
nftables on Netfilter-projektin ylläpitämä pakettisuodatuskehys, joka yhdistää iptablesin, ip6tablesin, arptablesin ja ebtablesin yhdeksi käyttöliittymäksi nft. Toisin kuin iptables, joka ajaa jokaista sääntöä lineaarisesti ytimen sisäisessä match-koodissa, nftables kääntää säännöt Berkeley Packet Filter -tyyliseksi tavukoodiksi, jota pieni virtuaalikone (nf_tables-VM) suorittaa. Käytännössä tämä tarkoittaa nopeampaa hakua, atomista sääntöpäivitystä (kokonainen ruleset vaihdetaan yhdellä syscallilla, ilman aikaikkunaa ilman suojausta) ja huomattavasti tiiviimpää konfiguraatiosyntaksia.
Käyttäjän näkökulmasta erot ovat merkittäviä. Yksi inet-perheen taulu korvaa erilliset IPv4- ja IPv6-taulut. Yksi set-rakenne korvaa kymmenet toistuvat -A INPUT -s x.x.x.x -j DROP -rivit, ja map-rakenteilla voit tehdä avain–arvo-hakuja (esim. destination-portin perusteella eri chainiin) ilman kymmeniä hyppyketjuja. Lisäksi nftables tukee natiivisti muuttujia, sisäänrakennettuja rate limitiä (meter), aikapohjaisia sääntöjä (timeout) ja parannettua connection tracking -integraatiota.
Käytännössä sanottuna: RHEL 8+, Debian 10+, Ubuntu 20.04+ ja SUSE 15+ käyttävät nftablesia oletuksena. Iptables-komento on niissä alias-skripti (iptables-nft), joka kääntää iptables-syntaksin nftables-sääntöihin ytimen tasolla. Vanhaa xt_-moduulikoodia ei enää ladata lainkaan. Itselleni tämä tuli selväksi vasta kun yritin debugata "iptables"-sääntöä strace:lla ja huomasin, että kaikki syscallit menivät nf_tables-nimiavaruuteen.
Asennus Debianissa, Ubuntussa ja RHEL:ssä
Modernit distrot toimittavat nftablesin oletuksena, mutta paketti ei aina ole asennettuna minimi-imageissa. Asennuskomennot ovat suoraviivaisia:
Etäkoneelle asennettaessa suosittelen käyttämään at-komentoa turvaverkkona. Jos uusi sääntöstö estää oman SSH-yhteytesi, ajastettu nft flush ruleset -komento palauttaa pääsyn viiden minuutin päästä. Katso yksityiskohdat SSH:n koventamiseen liittyvästä artikkelistamme, joka käsittelee SSH:n kovettamista Linuxissa 2026.
Peruskäsitteet: taulut, chainit, hookit ja verdiktit
nftables-konfiguraatio rakentuu neljästä käsitteestä, jotka on hyvä sisäistää ennen kuin kirjoitat ensimmäistäkään sääntöä. Taulu (table) on ylin säilytysyksikkö, joka sitoutuu tiettyyn perheeseen: ip (IPv4), ip6 (IPv6), inet (dual-stack), arp, bridge tai netdev. Chain on sääntöjen joukko taulun sisällä. Se voi olla joko peruschain (regular chain), johon paketit tulevat ytimen hookin kautta, tai user-defined chain, jota kutsutaan jump- tai goto-verdiktillä muista chaineista.
Hook on ytimen kohta, jossa peruschain kytkeytyy paketin matkaan: ingress (fyysinen laite, ennen L3-purkua), prerouting (ennen reititystä), input (paketti tulee tälle koneelle), forward (paketti kulkee koneen läpi), output (koneen itsensä lähettämä) ja postrouting (juuri ennen langalle laittamista). Prioriteetti-arvo määrää, missä järjestyksessä useat samaan hookiin sidotut chainit ajetaan. Matalampi arvo ajetaan ensin. Suodatukseen käytetään yleensä prioriteettia 0 (filter).
Verdikti on sääntöosuman lopputulos: accept, drop, reject, queue, continue, return, jump <chain> tai goto <chain>. Peruschainin oletusverdikti (policy) määrää, mitä tapahtuu, kun mikään sääntö ei osu, ja turvallisin arvo on aina drop. Kaikki hyväksyttävä liikenne pitää siis eksplisiittisesti sallia. Lisäksi nftables tarjoaa non-terminating -toiminnot kuten log, counter ja meter, jotka voidaan ketjuttaa saman säännön sisään.
Kovennettu perussääntörunko (inet filter)
Alla oleva sääntöstö on tuotantokelpoinen lähtökohta yksittäiselle Linux-palvelimelle, joka tarjoaa SSH:ta ja HTTPS:ää julkiseen verkkoon. Se soveltaa "deny by default" -periaatetta, sallii vain established-yhteydet ja pysäyttää TCP-flood-tyyppiset skannaukset. Tallenna se tiedostoon /etc/nftables.conf:
#!/usr/sbin/nft -f
# /etc/nftables.conf - kovennettu perusrunko 2026
flush ruleset
table inet filter {
# IP-musta lista: käytännössä yhdistetään meter-rate limitiin alempana
set banned_v4 {
type ipv4_addr
flags timeout
timeout 1h
}
set banned_v6 {
type ipv6_addr
flags timeout
timeout 1h
}
chain input {
type filter hook input priority filter; policy drop;
# Nopeat sallinnot: loopback ja jo tunnetut yhteydet
iif lo accept comment "loopback aina sallittu"
ct state established,related accept
ct state invalid drop
# Estä musta lista ennen mitään muuta
ip saddr @banned_v4 drop
ip6 saddr @banned_v6 drop
# ICMP/ICMPv6 (rate-limitattu, jotta ping-flood ei kaada)
ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } \
limit rate 4/second accept
ip6 nexthdr icmpv6 icmpv6 type { echo-request, destination-unreachable, packet-too-big, \
time-exceeded, parameter-problem, nd-router-advert, nd-neighbor-solicit, \
nd-neighbor-advert } limit rate 4/second accept
# SSH: rate-limitattu, ks. seuraava luku
tcp dport 22 ct state new \
meter ssh_meter { ip saddr timeout 10m limit rate over 5/minute } \
add @banned_v4 { ip saddr timeout 1h } log prefix "nft ssh-ban: " drop
tcp dport 22 accept
# HTTPS
tcp dport { 80, 443 } accept
# Kaikki muu lokitetaan ja pudotetaan
limit rate 10/minute log prefix "nft input-drop: " level info
counter
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
ct state invalid drop
}
}
Aja se turvallisesti käyttäen at-ajastusta ja lataa uusi sääntöstö:
# Turvaverkko ennen aktivointia (etäkoneella)
echo "nft flush ruleset" | sudo at now + 5 minutes
# Aktivoi uusi sääntöstö atomisesti
sudo nft -f /etc/nftables.conf
# Tarkista, että sääntö on ladattu
sudo nft list ruleset
# Kun toimii, peruuta turvaverkko
sudo atrm $(sudo atq | awk '{print $1}')
Miten estän SSH-brute-forcen nftablesilla?
SSH-brute-force on yleisin yksittäinen hyökkäysvektori Internet-palvelimia vastaan. Perinteisesti sitä on torjuttu fail2banilla, joka parseroi lokitiedostoja ja lisää iptables-sääntöjä. nftablesissa saman voi tehdä täysin ytimen sisällä ilman käyttäjätilan prosessia, mikä on nopeampi, luotettavampi ja skaalautuu satoihin tuhansiin banned-osoitteisiin.
Perusrungon säännössä käytetään kolmea rakennetta. meter laskee yhteysyritykset lähdeosoitteen perusteella, limit rate over laukaisee kun raja ylittyy (5 uutta TCP-yhteyttä minuutissa per IP), ja add @banned_v4 lisää osoitteen mustaan listaan yhden tunnin ajaksi. Koska banned_v4-set tarkistetaan chainin alussa, seuraavat paketit pudotetaan ennen kuin ne edes ehtivät SSH-sääntöön.
Rate limit -sääntöä voi hienosäätää: pientä bastion-hostia varten 3/minute on tiukka. Tiimin jaetulle SSH-hypylle 10/minute on realistisempi. Omassa käytössäni olen huomannut, että 5/minute on hyvä oletus, jos et tiedä paremmin — se estää suurimman osan botneteista mutta ei banna ihmistä, joka kirjoittaa salasanaansa väärin.
# Katso reaaliaikaisesti keitä on banned
sudo nft list set inet filter banned_v4
# Manuaalinen ban
sudo nft add element inet filter banned_v4 { 203.0.113.42 timeout 24h }
# Manuaalinen unban
sudo nft delete element inet filter banned_v4 { 203.0.113.42 }
# Näytä meter-tilastot
sudo nft list meter inet filter ssh_meter
IPv4/IPv6 dual-stack yhdellä säännöllä
Yksi nftablesin merkittävimmistä käyttömukavuuseduista iptablesiin verrattuna on inet-perhe, joka käsittelee IPv4- ja IPv6-liikennettä samassa taulussa. Missä iptablesissa piti kirjoittaa jokainen sääntö kahteen kertaan (yksi iptables-, yksi ip6tables-komentona), inet-perheessä sama sääntö ajaa molemmille protokollille. Poikkeuksena tietysti tilanteet, joissa eksplisiittisesti käytät ip- tai ip6-etuliitettä matchille (esim. ip saddr).
IPv6:n erityispiirteet on syytä ottaa huomioon. Neighbor discovery -paketit (nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert) täytyy sallia, muuten IPv6-yhteys ei toimi lainkaan. Multicast Listener Discovery -sanomat (MLD) ovat vastaava vaatimus link-local -osoitteille. Perusrungon ICMPv6-sääntö kattaa nämä. Estä sen sijaan aina ICMPv6:n redirect-viestit (nd-redirect) yleisistä turvallisuussyistä, ellei sinulla ole erityistä routing-tarvetta hyväksyä niitä.
Pudotettujen pakettien lokitus ja SIEM-integraatio
nftablesin log-toiminto lähettää viestit kernel-lokiin (facility kern), josta ne päätyvät oletuksena /var/log/kern.log-tiedostoon Debianissa ja journalctl -k:in kautta systemd-järjestelmissä. Perusrunko käyttää log prefix "nft ssh-ban: "-etuliitettä, joka tekee viesteistä helposti grep-attavia ja SIEM-parseroitavia. Tuotannossa on hyvä lisätä level-parametri (info, notice, warn), jotta rsyslog- tai journald-suodatuksesi voi ohjata palomuurilokit omaan tiedostoonsa:
Suurta pakettivirtaa varten harkitse ulogd2:ta, joka lukee nftablesin NFLOG-target-viestit erillisestä socketista ilman että ne kuormittavat kern.log-jonoa. Jos käytät Wazuh-agenttia, aseta se seuraamaan /var/log/nftables.log-tiedostoa ja lisää dekooderi, joka ottaa talteen src-, dst- ja spt/dpt-kentät. Näin nftablesin pudotukset näkyvät Wazuhin dashboardilla samassa aikajanalla kuin auditd-lokit ja LOTL-uhkien havaitseminen sekä SSH-tapahtumat.
Miten säilytän nftables-säännöt uudelleenkäynnistyksessä?
nftables ei tallenna sääntöjä automaattisesti, vaan ajaa /etc/nftables.conf-tiedoston uudelleenkäynnistyksen yhteydessä nftables.service-systemd-yksikön kautta. Tämä on tarkoituksellista: erotus konfiguraation ja runtime-tilan välillä on selkeä, ja voit muokata sääntöjä muistissa (nft add rule ...) tekemättä muutoksia pysyviksi, kunnes olet varma niiden toimivuudesta. Kun sääntöstö on validoitu, tallenna se yhdellä komennolla:
# Kirjoita nykyinen runtime-sääntöstö tiedostoon
sudo nft list ruleset > /etc/nftables.conf
# Debian/Ubuntu: aseta oikeat oikeudet
sudo chmod 600 /etc/nftables.conf
# Aktivoi systemd-yksikkö (tekee tämän uudelleenkäynnistyksessä)
sudo systemctl enable nftables.service
# Testaa restart heti, että konfiguraatio latautuu virheittä
sudo systemctl restart nftables.service && sudo systemctl status nftables.service
iptables-nft-migraatio askel askeleelta
Jos ylläpidät vanhempaa palvelinta, jonka konfiguraatio perustuu iptablesiin, siirtyminen puhtaaseen nftables-natiivisyntaksiin kannattaa tehdä hallitusti. Netfilter-projekti tarjoaa iptables-restore-translate-työkalun, joka lukee iptables-save-formaatissa olevan säännöstön ja tuottaa vastaavan nftables-syntaksin. Se ei ole täydellinen (joitakin match-modulejä ei ole 1:1 vastaavuutena), mutta se tuottaa 90 % valmiin lähtökohdan.
# 1. Ota talteen nykyinen iptables-sääntöstö
sudo iptables-save > /tmp/iptables-legacy.txt
sudo ip6tables-save > /tmp/ip6tables-legacy.txt
# 2. Käännä nftables-syntaksiin
sudo iptables-restore-translate -f /tmp/iptables-legacy.txt > /tmp/nftables-v4.txt
sudo ip6tables-restore-translate -f /tmp/ip6tables-legacy.txt > /tmp/nftables-v6.txt
# 3. Tarkista tulos ja yhdistä inet-tauluksi käsin
less /tmp/nftables-v4.txt
# 4. Testaa uusi sääntöstö erillisessä taulussa ennen vaihtoa
sudo nft -c -f /tmp/nftables-v4.txt # -c = check only, ei aktivoi
# 5. Poista iptables-legacy ja aktivoi nftables
sudo systemctl disable --now iptables ip6tables 2>/dev/null || true
sudo apt purge -y iptables-persistent # Debian/Ubuntu
sudo nft -f /etc/nftables.conf
sudo systemctl enable --now nftables.service
Migraation jälkeen ajastele säännöllinen nft list ruleset-vertailu talteen otettuun perusrunkoon, jotta huomaat luvattomat muutokset. Tämä sopii luontevasti CIS-benchmark-auditoinnin ja Lynis-koventamisauditoinnin yhteyteen, sillä molemmat työkalut tarkistavat, että host-palomuuri on aktiivinen ja että forward-policy on drop. Katso myös virallinen nftables-wiki: Moving from iptables to nftables täydellisen käännösmatriisin osalta.
Konfiguraation verifiointi ja jatkuva monitorointi
Kun kovennettu sääntöstö on tuotannossa, jatkuva verifiointi on yhtä tärkeää kuin alkuperäinen määritys. nftables-tilastot ovat helposti kerättävissä JSON-muodossa Prometheus/Grafana-tyyliseen valvontaan:
# JSON-tuloste, sopii node_exporter-plugineille
sudo nft -j list ruleset | jq '.nftables[] | select(.rule.expr[]?.counter)'
# Nopea auditointi: mitkä chainit puuttuvat oletusrungosta?
sudo nft list tables
sudo nft list chain inet filter input | grep -E 'policy|ct state|hook'
# Testaa säännöt Nmap-skannauksella toisesta koneesta
nmap -sS -Pn -p 1-1024 <palvelimen-ip> # vain sallitut portit avoinna
Osana kokonaisvaltaista koventamista muista, että host-palomuuri on vain yksi kerros. Pakollinen pääsynhallinta ytimen tasolla (SELinux ja AppArmor), auditoinnin loki (auditd) ja säännöllinen haavoittuvuusskannaus muodostavat yhdessä puolustuksen syvyydellä -periaatteen. Palomuuri estää pakettitason hyökkäykset, MAC estää sovellustason luvattomat toiminnot, audit tallentaa todisteet, ja skannaus löytää tulevat aukot.
Usein kysytyt kysymykset
Onko nftables nopeampi kuin iptables?
Kyllä, keskimäärin 20–40 % nopeampi tavallisilla säännöstöillä ja huomattavasti nopeampi (jopa 10-kertainen ero) silloin, kun sääntöjä on tuhansia. Ero syntyy nftablesin BPF-tyyppisestä sääntökoneesta ja set/map-rakenteiden O(1)-hausta lineaarisen läpikäynnin sijaan.
Voinko käyttää samanaikaisesti nftablesia ja firewalldia?
Teknisesti kyllä, mutta sitä ei suositella. firewalld käyttää sisäisesti joko iptables-nft- tai nftables-backendia ja kirjoittaa omat taulunsa. Suora nft-käyttö samaan aikaan johtaa yllätyksiin, kun firewalld nollaa säännöt reload-komennoilla. Valitse toinen ja pitäydy siinä.
Miten testaan nftables-säännöt turvallisesti etäpalvelimella?
Käytä at-komentoa ajastamaan nft flush ruleset 5 minuutin päähän ennen uuden sääntöstön aktivointia. Jos uusi sääntö katkaisee SSH-yhteytesi, ajastettu flush palauttaa pääsyn. Kun olet varmistanut yhteyden, poista at-tehtävä atrm-komennolla.
Ei välttämättä. Debian 12:n iptables-komento on itse asiassa iptables-nft-alias, joka kääntää iptables-syntaksin nftables-sääntöiksi ytimen tasolla. Vanhat skriptit toimivat sellaisinaan. Puhtaaseen nftables-syntaksiin siirtyminen antaa kuitenkin pääsyn setseihin, karttoihin ja rate-limitiin, joita iptables-yhteensopivuuskerros ei tue.
Mikä on ero drop- ja reject-verdiktin välillä?
drop hylkää paketin hiljaisesti (lähettäjä joutuu odottamaan aikakatkaisua). reject lähettää ICMP-viestin (esim. "port unreachable" tai TCP RST), joka nopeuttaa yhteydenmuodostuksen epäonnistumista. Julkiseen verkkoon liittyvälle rajapinnalle drop on turvallisempi (piilottaa palvelun olemassaolon skannereilta). Sisäverkossa reject on käyttäjäystävällisempi.
Miten tarkistan, että nftables-sääntöni aktivoituvat uudelleenkäynnistyksessä?
Aja systemctl is-enabled nftables.service. Tulos "enabled" varmistaa, että yksikkö käynnistyy boottissa. Testaa käytännössä komennolla sudo systemctl restart nftables.service && sudo nft list ruleset | head. Jos ruleset on tyhjä restartin jälkeen, tarkista että /etc/nftables.conf-tiedosto on olemassa ja alkaa #!/usr/sbin/nft -f-shebangillä.
Kovenna systemd-palvelu käytännössä: drop-in override, systemd-analyze security -pistemäärän tulkinta, ProtectSystem, seccomp-BPF ja capabilities. Sisältää nginx-esimerkin, jossa altistumispistemäärä putoaa 9.6:sta 2.1:een ilman että yksikään tavallinen käyttötapaus rikkoutuu.
Käytännön opas SELinuxin ja AppArmorin käyttöönottoon. Vertaile MAC-järjestelmiä, kirjoita mukautettuja käytäntöjä ja profiileja, ja noudata tuotantoympäristöjen parhaita käytäntöjä Linux-koventamisessa.