NFTables linuxový firewall - návod, příklady

Bohužel iptables již zastaral, přichází nftables (linuxový firewall), zde stručný návod.

Testováno na distribuci linux debian 11.2, nftables v 0.9.8

Proč firewall nftables nahrazuje iptables?

Předchozí framework (iptables) má několik těžko řešitelných problémů, týkajících se škálovatelnosti, výkonu, údržby kódu atd. Mezi výhody, které linuxový firewall nftables přinesl, jsou zjednodušení ABI, méně duplikování zdrojového kódu, sjednocení zpracování různých protokolů (dříve různé zpracování pro IPv4, IPv6, ARP) a zjednodušení správy pravidel.

nftables v debian 11.2Debian 11.2 „Bullseye“ z 8.12.2021 již má firewall nftables zabudovaný místo iptables.
Ještě bych připomenul rodinu (family) nftables:

Po instalaci linuxu debian v 11.2 je defaultně nastavena v /etc/nftables.conf tabulka rodiny inet s řetězci input, forward, output. Firewall není zapnut.

Je třeba ještě zapnout firewall. Jako root:

systemctl enable nftables.service
systemctl start nftables

Prvním výše uvedeným příkazem se vytvořil symbolický odkaz
na /etc/systemd/sysinit.target.wants/nftables.service -> /lib/systemd/system/nftables.service
Druhým výše uvedeným příkazem se spustila služba nftables.

Pak v podstatě stačí doplnit výchozí pravidla a pár drobností, rodina nftables inet pokrývá IPv4 i IPv6 - dual. Výchozí pravidla jsou accept - vše povoleno.
Proto nám stačí ve výchozím stavu zadat:

nft add chain inet filter input '{ policy drop; }'
nft add chain inet filter forward '{ policy drop; }'
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input ct state '{ established, related }' accept
nft add rule inet filter input iifname "lo" accept
nft list ruleset > /root/firewall.txt
cat /root/firewall.txt
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state invalid drop
ct state {established, related} accept
iifname "lo" accept
}

chain forward {
type filter hook forward priority 0; policy drop;
}


chain output {
type filter hook output priority 0; policy accept;
}
}
A zobrazená pravidla přidáme/přepíšeme do souboru /etc/nftables.conf, který pak bude vypadat následovně:
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state invalid drop
ct state {established, related} accept
iifname "lo" accept
}

chain forward {
type filter hook forward priority 0; policy drop;
}


chain output {
type filter hook output priority 0; policy accept;
}
}

Tímto máme funkční nejjednodušší linuxový firewall pro pracovní stanici pokrývající oblast IPv4 i IPv6.

Pokud chceme firewal nftables vypnout, stačí zvolit opačný postup, tedy "systemctl disable nftables.service" - symbolický odkaz byl odstraněn, "systemctl stop nftables" - služba nftables byla zastavena.

Běh služby si můžeme ověřit příkazem systemctl status nftables

Po zapsání pravidel do /etc/nftables.conf je potřeba restartovat službu nftables:
systemctl restart nftables

Při dodržení tohoto postupu pak i při rebootu bude firewall spuštěný s novými pravidly.

Nyní si sestavíme vlastní nftables firewall pro pracovní stanici, kde zakážeme všechno příchozí spojení a povolíme všechno odchozí.

Pravidla a jejich parametry

První je třeba si ujasnit co je co.

Abychom mohli zapisovat skutečná pravidla, musíme znát jejich názvy. Každé pravidlo má také různé parametry, které umožňují přesně popsat, co chceme na daném paketu zkoumat. Níže uvádím přehled nejběžnějších možností používaných s nftables.

meta – meta informace, například o rozhraní
oif <index výstupního rozhraní>
iif <index vstupního rozhraní>
oifname <název výstupního rozhraní>
iifname <název vstupního rozhraní>

icmp – protokol ICMP
type <typ icmp>

icmpv6 – protokol ICMP
type <typ icmpv6>

ip – protokol IPv4
protocol <protokol>
daddr <cílová adresa>
saddr <zdrojová adresa>

ip6 – protokol IPv6
daddr <cílová adresa>
saddr <zdrojová adresa>

tcp – protokol TCP
dport <cílový port>
sport <zdrojový port>

udp – protokol UDP
dport <cílový port>
sport <zdrojový port>

sctp – protokol SCTP
dport <cílový port>
sport <zdrojový port>

ct – connection tracking, sledování spojení
state <new | established | related | invalid>

nft flush ruleset - vymazání (reset) všech tabulek, řetězců a pravidel

nft add table inet filter - vytvoření tabulky inet filter

nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }' - vytvoření řetězce input pro tabulku inet filter = příchozí provoz.
nft add chain inet filter forward '{ type filter hook forward priority 0; policy drop; }'
Pro forward taky vše zakážeme. Všechno si vypíšeme:

nft list ruleset

Vypíší se všechna pravidla, ty pak připíšeme do /etc/nftables.conf

table inet filter {
chain input {
type filter hook input priority filter; policy drop;
}

chain forward {
type filter hook forward priority filter; policy drop;
}
}

A zjistíme, že firewall funguje a nám nic nejde. Potřebujeme povolit již navázaná spojení a "lo":

table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state invalid drop
ct state {established, related} accept
iifname "lo" accept
}
chain forward { type filter hook forward priority 0; policy drop; }
}

Přidáme pravidla (rule) do tabulky inet filter, řetězce input

nft add rule inet filter input ct state invalid drop

nft add rule inet filter input ct state { established, related } accept

nft add rule inet filter input iifname "lo" accept

# přístup na SSH jen z určité IP
nft add rule inet filter input ip saddr 192.168.0.110 tcp dport ssh accept

A zde máme nejjednodušší firewall nftables pro pracovní stanici

firewall nftables


Jak jsme jej vytvořili (firewall), shrnutí

Všechny příkazy jsou prováděny pod superuživatelem ROOT v konzoli.

  1. systemctl enable nftables.service - zapneme spouštění firewallu po rebootu
  2. systemctl start nftables - spustíme firewall nftables
  3. flush ruleset - vymazání (reset) všech pravidel
  4. nft add table inet filter - vytvoření tabulky inet filter
  5. nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }' - vytvoření řetězce pro příchozí provoz.
  6. nft add chain inet filter forward '{ type filter hook forward priority 0; policy drop; }'
    Pro forward taky vše zakážeme.
  7. nft add rule inet filter input ct state invalid drop
  8. nft add rule inet filter input ct state { established, related } accept
  9. nft add rule inet filter input iifname "lo" accept
  10. nft list ruleset > /etc/nftables.conf - přepíše novými pravidly, nebo ty pravidla uložíme např. do /root/fw.txt a jen je do /etc/nftables.conf zkopírujeme. Pak se nemusí dělat následující úpravy, jelikož po instalaci debianu tam „#!/usr/sbin/nft -f“ a „flush ruleset“ jsou i s prázdnou tabulkou inet filter (tu smažeme).

Upravíme soubor /etc/nftables.conf, přidáme mu atributy „spustitelný“ chmod 755 /etc/nftables.conf, na začátek přidáme:

#!/usr/sbin/nft -f

flush ruleset


Příklad souboru /etc/nftables.conf

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # accept any localhost traffic
        iif lo accept

        # accept traffic originated from us
        ct state established,related accept

        # drop invalid packets
        ct state invalid counter drop

        # accept ssh, http, and https
        tcp dport { 22, 80, 443 } accept

        # accept icmp
        ip protocol icmp accept

        # count and reject everything else
        counter reject with icmpx type admin-prohibited
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }

}

Úpravy firewallu nftables s nástrojem nft

seřazeno podle síly příkazu

nft flush ruleset - smaže všechno (tabulky, řetězce, pravidla)

Tabulky - tables

nft add table inet filter - vytvoření tabulky rodina inet, typ filter
nft delete table inet filter - smazání tabulky rodina inet, typ filter

Řetězce - chains

nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }' - vytvoří řetězec input
nft add chain inet filter input '{ policy accept; }' - upraví výchozí politiku řetězce
nft delete chain inet filter input - smaže řetězec input
nft rename chain inet filter input webik - přejmenuje řetězec input->webik

Pravidla - rules

Všechny upravy si můžeme dělat v textovém souboru například /root/firewall.txt a pak je načíst příkazem

nft flush ruleset
nft -f /root/firewall.txt

Ale distribuce založené na debianu očekávají konfigurační soubor firewallu nftables v /etc/nftables.conf, proto je dobré nevymýšlet vymyšlené a upravovat právě tento soubor. Odpanou nám tím starosti s editací tabulek, řetězců, pravidel.
Ale může se stát, že se při načítání souboru objeví chyba syntaxe:

firewall.txt:14:51-56: Error: syntax error: unexpected string...

14 je řádek, 51-56 sloupec chyby.

Zjištění funkčnosti firewallu nftables

Pingneme si localhost 127.0.0.1, tedy:

ping -c2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.373 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.068 ms

Jde to. Zjistíme si handle pro pravidlo "lo" (accept):

nft -a list ruleset
table inet filter { # handle 4
chain input { # handle 1
type filter hook input priority filter; policy drop;
ct state invalid drop # handle 5
ct state { established, related } accept # handle 6
iifname "lo" accept # handle 7
}

chain forward { # handle 2
type filter hook forward priority filter; policy drop;
}

chain output { # handle 3
type filter hook output priority filter; policy accept;
}
}

Nyní smažeme povolení (accept) na 127.0.0.1: nft delete rule inet filter input handle 7

A opět to pingneme:

ping 127.0.0.1 -c2
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1019ms

Nejde to, přesně podle očekávání, 100% ztracených packetů. Pak přístup k "lo" zase obnovíme:
nft add rule inet filter input iifname "lo" accept

A poté opět pingneme a ono to zase půjde. Nicméně jsme si ověřili, že firewall nftables je funkční a funguje podle našich představ.

Konverze z iptables->nftables

Pokud máme starý firewall iptables, nebo jen nějaká pravidla z iptables, lze je nechat přeložit do nftables pomocí iptables-translate.

# iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT
nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept


Odkazy

  1. linuxový firewall s moderními vlastnostmi
  2. správa tabulek, řetězců a pravidel s utilitou nft
  3. správa pravidel v našem firewallu
  4. akce prováděné nad pravidly včetně nastavení NAT
  5. struktury pro zvýšení výkonu firewallu
  6. příklad konfigurace firewallu a vzorové situace

Další odkazy

ping 127.0.0.1 -c2                                                                                                                                                                                                                     
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.                                                                                                                                                                                           
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.373 ms                                                                                                                                                                                   
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.068 ms

Komentáře

1. Přezdívka: schweik, email: , 01.09.2023 11:04:33
Prosím, připomeňte čtenáři, že nutnou podmínkou fungování některých režimů firewallu je zapnutý forwarding (např. sudo echo "1" > /proc/sys/net/ipv4/conf/all/forwarding)

Děkuji

Kdokoliv může přidávat komentáře ke článkům bez registrace. Zadá si libovolnou přezdívku a napíše komentář.

Jak používat messenger Signál


SSL pro weby od 11/2015 zdarma


MS WINDOWS 10, 11 - sběr informací o uživateli


DEBIAN 12 (bookworm) - OS zdarma debian vyšel 10.6.2023

debian

debian - stáhnout nejnovější DEBIAN pro PC
debian edu - debian pro školy a školní prostředí, stažení DEBedu (torrent)


Zranitelnost „ROM-0“ routerů


Předali data tajným službám
Americké bezpečnostní agentuře (NSA) předali data Microsoft, Yahoo, Google, Facebook...


Itálie preferuje open source
Italský parlament schválil zákon, který nařizuje státním institucím pořizovat otevřený software před komerčním. To znamená LINUX místo MS-WINDOWS, LIBRE OFFICE místo MS OFFICE atd.

19.03. 2024 10:36:16
  • Redakční systém MRS
  • 10 nečastějších zranitelností WEBU
  • Esperantoesperanto - univerzální mezinárodní jazyk
  • Kryptografie okolo nás - kniha popisuje využití kryptografie v běžném životě
  • SMS zdarma - posílání SMS zdarma
  • proč LINUX
  • základy LINUXU
  • Software na úřadech - jeho otevřené alternativy
  • Řekněte sbohem Microsoftu
  • Rychlost připojení - změřte si svoji rychlost
  • SEO servis
  • Jak psát web
  • Zákony - občanský, autorský, obchodní zákoník atd.
  • Infosoud - nalezení stání a průběhu jednání
  • Soudní rozhodnutí - nalezení rozsudků
  • ARES - registr ekonomických subjektů
  • Katastr nemovitostí
  • Broďan - brodské nezávislé zpravodajství

vydělávejte
na burze kryptoměn

23.03. 2024 15:47:51
Návštěvy
Celkem: 290050
Týden: 883
Dnes: 67
  přihlásit poslední změna: 21.07. 2023 19:59:51