Modul 5 · 5.2
Firewall s ufw a nftables
Modul 5: Zabezpečení sítě · Doba čtení: 12 min.
Cíl lekce: Po této lekci budete umět nastavit firewall, který povoluje jen to, co je nutné, pro IPv4 i IPv6, aniž byste se sami zablokovali, a budete vědět, před čím Vás firewall na serveru nechrání.
Klíčové pojmy: paketový filtr, netfilter, nftables, iptables-nft, ufw, výchozí politika, allow, deny, reject, limit, IPv6 v ufw, firewall poskytovatele, firewalld, Docker a firewall
Co dělá firewall
Firewall na Vašem serveru je paketový filtr: u každého příchozího síťového paketu se podívá do seznamu pravidel a rozhodne, zda smí projít. V Linuxu je tento filtr součástí jádra a jmenuje se netfilter. Nastavujete ho pomocí programu:
- nftables (příkaz
nft) je současný nástroj. Debian ho standardně používá od verze Debian 10. - iptables je starší nástroj. Na moderních systémech je
iptablesobvykle jen překlad do nftables (iptables-nft), aby staré návody stále fungovaly. - ufw (Uncomplicated Firewall) je jednoduchá vrstva nad tím, standardně přítomná v Ubuntu a v Debianu instalovatelná jedním příkazem. Pro jeden server je ufw nejsnazší volba. Tato lekce používá ufw a potom ukazuje, jak vypadají stejná pravidla v nftables.
Firewall je Vaše druhá obranná vrstva. První spočívá v tom, že služby naslouchají jen na správné adrese (lekce 5.1). Společně zajišťují, že chyba v jedné vrstvě hned neznamená otevřené dveře.
Nejdříve: jak se dostanete zpět, když se něco pokazí?
Klasická chyba: zapnete firewall, zapomenete povolit SSH a spojení se přeruší. Přes SSH se pak už nedostanete. Než začnete:
- Zjistěte, jak otevřít konzoli u svého poskytovatele (lekce 1.2). Funguje mimo síť, tedy i tehdy, když firewall vše zablokuje. Tam se přihlásíte a zadáte
ufw disable. - Pokud si nejste jistí, vytvořte snapshot.
- Nechte aktuální SSH relaci otevřenou a testujte ve druhé relaci.
ufw v pěti krocích
Krok 1: instalace a volba výchozího nastavení.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'Výchozí politika platí pro vše, pro co neexistuje žádné pravidlo. "Deny incoming" znamená: vše příchozí je zakázáno, kromě toho, co následně povolíte. To je jediný bezpečný základ. Odchozí provoz (Váš server stahuje aktualizace) povolíte.
Krok 2: povolit SSH, ještě než firewall zapnete.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH je aplikační profil, který ufw zná (odpovídá portu 22/tcp). Pokud SSH běží na jiném portu, použijte číslo: sudo ufw allow 2222/tcp. Všimněte si hlášení "Rules updated (v6)": ufw vytvoří pravidlo také pro IPv6. Dělá to proto, že v /etc/default/ufw je řádek IPV6=yes, což je výchozí stav. Raději to zkontrolujte; pokud je nastaveno no, platí Váš firewall jen pro IPv4.
Krok 3: co dalšího potřebujete.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # pouze pokud používáte HTTP/3Pravidlo můžete omezit na jednu zdrojovou adresu, například pro administrační port, který smí být dostupný jen z Vaší kanceláře:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpKrok 4: zapnutí.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupKrok 5: kontrola. Otevřete druhé okno a přihlaste se znovu. Pokud to funguje, je SSH nastavené správně. Potom si prohlédněte pravidla:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Pravidlo odstraníte podle čísla: sudo ufw status numbered a pak sudo ufw delete 3.
deny, reject a limit
- deny paket tiše zahodí: zvenku uvidíte "filtrováno" (lekce 5.1).
- reject pošle zpět odmítnutí: zvenku uvidíte "zavřeno". Je to korektnější pro Vaše vlastní služby, ale prozradí to, že tam server je.
- limit spojení povolí, ale zablokuje adresu, která se během 30 sekund pokusí připojit šestkrát nebo vícekrát. Hodí se pro SSH:
sudo ufw limit OpenSSHmístoallow. Je to hrubé opatření (počítá spojení, ne neúspěšná přihlášení); fail2ban (lekce 5.3) je přesnější.
Stejná pravidla v nftables
ufw na pozadí zapisuje pravidla do netfilteru. Pokud chcete pracovat bez ufw, napíšete si soubor pro nftables sami. V Debianu je uložen v /etc/nftables.conf a načítá ho služba nftables:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}Čtěte ho takto. Tabulka se jmenuje filter a patří do rodiny inet: jedna tabulka pro IPv4 i IPv6 zároveň, takže na IPv6 nemůžete zapomenout. V řetězci input je politika drop. Dále: odpovědi na již existující spojení smějí projít zpět (established,related), vše na loopbacku je povoleno, ICMP je povoleno (potřebné mimo jiné pro IPv6 a chybová hlášení o velikosti paketů) a povoleny jsou porty 22, 80 a 443.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # zkontrolovat bez načtení
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetPoužívejte buď ufw, nebo vlastní soubor nftables, ne obojí: oba zapisují do stejného netfilteru a mohou si navzájem překážet v pravidlech.
Před čím Vás firewall nechrání
- Služby, které sami povolíte. Port 443 je otevřený pro Váš web; zranitelnost ve Vašem webu je tedy normálně dostupná. Firewall chrání jen porty, které jsou zavřené.
- Docker. Když v Dockeru publikujete port (
-p 5432:5432), Docker nastaví vlastní pravidla netfilteru, která přesměrují provoz dříve, než se uplatní pravidla ufw. Dokumentace Dockeru doslova uvádí, že Docker a ufw spolu dobře nefungují. Port kontejneru tak může být zvenku otevřený, i když houfw statusnezobrazuje. Řešení (publikovat na127.0.0.1) se naučíte v lekci 9.3. - Odchozí provoz. S "allow outgoing" se napadený program může připojit kamkoli. Pro většinu malých serverů je to přijatelná volba; přísná prostředí omezují i odchozí provoz.
Firewall Vašeho poskytovatele
Mnoho poskytovatelů má také firewall v síti, před Vaším serverem, který nastavujete v zákaznickém panelu (někdy se mu říká "cloud firewall" nebo "security group"). Je to výborná vrstva navíc a funguje i tehdy, když na samotném serveru něco nastavíte špatně. Firewall na serveru ale nenahrazuje: když server přesunete nebo změníte poskytovatele, nepřejde s ním, a ne každý poskytovatel ho nabízí. Proto mějte vždy firewall i přímo na serveru.
V AlmaLinuxu a Rocky Linuxu
Tam je standardně zapnutý firewalld se zónami. Nejdůležitější příkazy:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadBez --permanent platí změna jen do příštího restartu; s --permanent platí až po --reload. SSH je ve výchozí zóně již otevřené.
V praxi
Pokud se přesto zablokujete na VPS u WebOké, otevřete na obrazovce VPS konzoli, přihlásíte se a firewall vypnete (ufw disable) nebo vrátíte poslední pravidlo. U jiných poskytovatelů se tento nouzový vstup jmenuje také konzole, VNC nebo rescue. Zjistěte si, kde to tlačítko je, dříve než ho budete potřebovat.
Shrnutí
- Firewall je Vaše druhá vrstva po zásadě "naslouchat jen tam, kde je to nutné"; nftables je nástroj v jádře, ufw jednoduchá vrstva nad ním.
- Začněte s
default deny incoming, povolte SSH předufw enable, testujte ve druhé relaci a znejte konzoli svého poskytovatele. - Zkontrolujte, že ufw pokrývá i IPv6 (
IPV6=yes); v nftables to rodinainetzajistí najednou. denydává zvenku "filtrováno",rejectdává "zavřeno";limitbrzdí opakovaná spojení.- Porty Dockeru obcházejí ufw (lekce 9.3); firewall poskytovatele je vrstva navíc, ne náhrada.
Kvíz
Úkol
Úkol O5.2: Nastavení firewallu. Zapněte na svém serveru firewall pomocí ufw (nebo nftables, případně firewalld na AlmaLinux/Rocky): ve výchozím stavu vše příchozí zavřené, povolené SSH a to, co skutečně potřebujete. Otestujte to ve druhé relaci, zkontrolujte, zda je pokryto IPv6, a zvenku pomocí nc ověřte, že nepovolený port je zavřený nebo filtrovaný. Vyplňte kontrolní seznam a vložte výstup ufw status verbose (nebo nft list ruleset); u každého otevřeného portu uveďte, k čemu slouží.
Úkol O5.2: Nastavení firewallu
Tento úkol provádíte sami; nikdo ho nekontroluje. Odškrtněte, co jste udělali, a označte úkol jako splněný.
Pro webový server jen 22 (nebo Váš SSH port), 80 a 443, pro IPv4 i IPv6. Administrační porty jen z pevné adresy nebo přes SSH tunel. Přes konzoli: ufw disable (nebo vyprázdnit pravidla nftables).
Vaše zaškrtnutí a poznámky zůstávají pouze v tomto prohlížeči; nikam je neposíláme. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol splnili.
Doporučujeme k přečtení
- Zabezpečení Vašeho VPS: prvních pět minut
- Nemáte už přístup ke svému VPS? Co dělat dál?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Dokumentace Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Dokumentace Dockeru, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
- Jaké služby na Vašem VPS naslouchají a co je dostupné zvenčí?
- VPS: od prvního přihlášení k zabezpečenému serveru 3.4: Firewall s ufw (nebo nftables)
