nftables Linuxissa 2026: Palomuurin määrittäminen, koventaminen ja iptables-migraatio käytännössä

Kovennettu nftables-palomuuri Linuxissa 2026: inet-perhe, ct state, SSH-rate limit setseillä, IPv4/IPv6-yhtenäisyys, lokitus ja iptables-nft-migraatio käytännön esimerkein.

nftables 2026: Linux-palomuurin opas

Päivitetty: 9. elokuuta 2026

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:

# Debian 12/13 ja Ubuntu 24.04 LTS
sudo apt update
sudo apt install -y nftables

# RHEL 9/10, Rocky Linux, AlmaLinux
sudo dnf install -y nftables

# Fedora 40+
sudo dnf install -y nftables

# Aktivoi ja käynnistä palvelu
sudo systemctl enable --now nftables.service

# Varmista versio (tulisi olla ≥ 1.1.0 vuonna 2026)
nft --version
# nftables v1.1.2 (Commodore Bullmoose)

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:

# Journald-tyylinen kysely viimeisiltä 15 minuutilta
journalctl -k --since "15 min ago" | grep -E 'nft (ssh-ban|input-drop):'

# Rsyslog-sääntö palomuurilokien eristämiseen: /etc/rsyslog.d/10-nftables.conf
if $msg contains 'nft ' then /var/log/nftables.log
& stop

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.

Tarvitseeko iptables-komennot päivittää nftables-komennoiksi Debian 12:ssa?

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ä.

Tietoa Kirjoittajasta Editorial Team

Our team of expert writers and editors.