Krátká příručka na použítí příkazu nft pro nastavení packetového filteru v linuxovém jádře. Formou zápisu může připomínat známý příkaz ip. Tento článek vůbec nemá za cíl vysvětlit, jak se firewall nastavuje. Jen má být příručkou pro často používané příkazy.

Výpis pravidel

nft list ruleset

Výpis pravidel včetně čísla (handle) pravidla:

nft -a list ruleset

Uložení pravidel

nft list ruleset > /etc/nft.rules

Příkaz nft vykonává změny v pravidlech atomicky, je tedy vhodné do souboru pro načtení pravidel na počátek připsat flush ruleset, který způsobí vymazání pravidel.

Upravené uložení pravidel potom může vypadat:

echo "flush ruleset" > /etc/nft.rules
nft list ruleset >> /etc/nft.rules

V Debianu se o načítání pravidel stará systémová unita nftables.service, která očekává pravidla v souboru /etc/nftables.conf. Tento soubor již obsahuje zrušení předchozích pravidel flush ruleset a také správný interpretr #!/usr/sbin/nft -f. Je spustitelný, což umožňuje, po jeho změně, zavedení pravidel pomocí prostého spuštění:

/etc/nftables.conf

Celkem snadno bychom si mohli napsat skript pro uložení pravidel a jeho volání před každým ukončením nftables unity (nebo jiné vytvořené pro tento účel). Snadno tak dosáhneme například persistentních counterů, pokud je v pravidlech používáme a chceme zachovat jejich hodnoty i například po rebootu.

Načtení uložených pravidel

nft -f /etc/nft.rules

Vložení nového pravidla

nft add rule inet filter input tcp dport 5432 accept

Vložení pravidla s poznámkou a počítadlem

Poznámka je skutečně součástí pravidla (NFTA_RULE_USERDATA) a je vypisována při vypsání pravidel. Nejedná se tedy pouze o popis pravidla v konfiguračním souboru, ale je svázáno s pravidlem. Toto velmi usnadňuje čtení rozsáhlejších firewallů, kdy se nemusíme spoléhat na konfigurační soubory, ale poznámky vidíme přímo ve výpisu pravidel z jádra.

nft add rule inet filter input tcp dport 3306 counter drop comment "mysql"

Vložení pravidla na pozici

Vloží pravidlo za pravidlo definované parametrem position:

nft add rule inet filter input position 7 ip saddr @blist4 counter drop
nft add rule inet filter input position 7 ip6 saddr @blist6 counter drop

Handles neoznačují pořadí pravidla, ale skutečně ono pravidlo. Je tedy, na rozdíl od výpisu iptables -L -n -v --line-numbers možné používat přidávání pravidel na určené pozice opakovaně a nebude se nám chaoticky měnit jejich pořadí.

Smazání pravidla dle čísla

nft delete rule inet filter input handle 7
nft delete rule inet filter output handle 17

Vytvořeni setu ip (seznam ip)

Pokud chceme například filtrovat na základě zdrojové adresy, kterých bude vícero, je výhodné si vytvořit set a adresy přidávat do něj.

Flag interval je nutný, pokud chceme do seznamu přidávat i celé sítě, nikoliv konkrétní adresu:

nft add set inet filter blist4 '{ type ipv4_addr; flags interval; }'
nft add set inet filter blist6 '{ type ipv6_addr; flags interval; }'

Přidání položky (adresy) do setu

nft add element inet filter blist4 { 198.51.100.0/24 }

Smazání setu

nft del set inet filter blist