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.
Debian 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í.
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
Jak jsme jej vytvořili (firewall), shrnutí
Všechny příkazy jsou prováděny pod superuživatelem ROOT v konzoli.
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;
}
}
seřazeno podle síly příkazu
nft flush ruleset - smaže všechno (tabulky, řetězce, pravidla)
nft add table inet filter - vytvoření tabulky rodina inet, typ filter
nft delete table inet filter - smazání tabulky rodina inet, typ filter
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
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. Odpadnou 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.
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.
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
Komentáře
Kdokoliv může přidávat komentáře ke článkům bez registrace. Zadá si libovolnou přezdívku a napíše komentář.
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 - 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.