Modul 5 · 5.2
Požarni zid z ufw in nftables
Modul 5: Zaščita omrežja · Čas branja: 12 minut
Učni cilj: Po tej lekciji boste znali nastaviti požarni zid, ki dovoli samo to, kar je nujno, za IPv4 in IPv6, ne da bi se zaklenili ven, in boste vedeli, pred čim Vas požarni zid na strežniku ne ščiti.
Ključni pojmi: paketni filter, netfilter, nftables, iptables-nft, ufw, privzeta politika, allow, deny, reject, limit, IPv6 v ufw, požarni zid ponudnika, firewalld, Docker in požarni zid
Kaj počne požarni zid
Požarni zid na Vašem strežniku je paketni filter: za vsak dohodni omrežni paket pogleda seznam pravil in odloči, ali sme skozi. V Linuxu je ta filter v jedru in se imenuje netfilter. Nastavite ga s programom:
- nftables (ukaz
nft) je sodobno orodje. Debian ga privzeto uporablja od različice Debian 10. - iptables je staro orodje. Na sodobnih sistemih je
iptablesnavadno prevajalnik v nftables (iptables-nft), tako da stara navodila še vedno delujejo. - ufw (Uncomplicated Firewall) je preprosta plast nad tem, na Ubuntuju je nameščen privzeto, na Debian pa ga namestite z enim ukazom. Za posamezen strežnik je ufw najpreprostejša izbira. Ta lekcija uporablja ufw in nato pokaže, kako so ista pravila videti v nftables.
Požarni zid je Vaša druga obrambna plast. Prva je, da storitve poslušajo samo na pravem naslovu (lekcija 5.1). Skupaj poskrbita, da napaka v eni plasti ne pomeni takoj odprtih vrat.
Najprej: kako se vrnete, če gre kaj narobe?
Klasična napaka: vklopite požarni zid, pozabite dovoliti SSH in povezava se prekine. Prek SSH potem ne pridete več do strežnika. Preden začnete:
- Vedite, kako odprete konzolo svojega ponudnika (lekcija 1.2). Ta deluje mimo omrežja, torej tudi, ko požarni zid vse zapre. Tam se prijavite in vtipkate
ufw disable. - Če niste prepričani, naredite posnetek stanja (snapshot).
- Trenutno sejo SSH pustite odprto in preizkušajte z drugo sejo.
ufw v petih korakih
1. korak: namestitev in izbira privzete politike.
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'Privzeta politika velja za vse, za kar ni pravila. "Deny incoming" pomeni: vse dohodno je prepovedano, razen tega, kar dovolite v nadaljevanju. To je edina varna osnova. Odhodni promet (strežnik, ki prenaša posodobitve) dovolite.
2. korak: dovolite SSH, preden vklopite požarni zid.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH je aplikacijski profil, ki ga ufw pozna (pomeni vrata 22/tcp). Če SSH teče na drugih vratih, uporabite številko: sudo ufw allow 2222/tcp. Bodite pozorni na "Rules updated (v6)": ufw pravilo ustvari tudi za IPv6. To naredi, ker je v /etc/default/ufw nastavljeno IPV6=yes, kar je privzeto. To na hitro preverite; če je nastavljeno na no, Vaš požarni zid velja samo za IPv4.
3. korak: kar še potrebujete.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # samo, če uporabljate HTTP/3Pravilo lahko omejite na en izvorni naslov, na primer za skrbniška vrata, ki so dovoljena samo iz Vaše pisarne:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcp4. korak: vklop.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup5. korak: preverjanje. Odprite drugo okno in se ponovno prijavite. Če uspe, je SSH pravilno nastavljen. Nato si oglejte pravila:
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)Pravilo odstranite s številkami: sudo ufw status numbered in nato sudo ufw delete 3.
deny, reject in limit
- deny paket tiho zavrže: od zunaj vidite "filtrirano" (lekcija 5.1).
- reject vrne zavrnitev: od zunaj vidite "zaprto". To je lepše za Vaše lastne storitve, vendar izda, da strežnik obstaja.
- limit povezavo dovoli, a blokira naslov, ki v 30 sekundah šestkrat ali večkrat poskusi vzpostaviti povezavo. Uporabno za SSH:
sudo ufw limit OpenSSHnamestoallow. Ukrep je grob (šteje povezave, ne neuspelih prijav); fail2ban (lekcija 5.3) je natančnejši.
Ista pravila v nftables
ufw v ozadju piše pravila netfilter. Če želite delati brez ufw, sami napišete datoteko nftables. Na Debianu je to /etc/nftables.conf, naložite pa jo s storitvijo 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;
}
}Berite jo tako. Tabela se imenuje filter in je iz družine inet: ena tabela za IPv4 in IPv6 hkrati, tako da IPv6 ne morete pozabiti. V verigi input je politika drop. Nato: odgovori na že vzpostavljene povezave smejo nazaj (established,related), vse na povratni zanki (loopback) je dovoljeno, ICMP je dovoljen (potreben med drugim za IPv6 in za sporočila o napakah glede velikosti paketov), dovoljena pa so tudi vrata 22, 80 in 443.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # preverjanje brez nalaganja
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetUporabite bodisi ufw bodisi lastno datoteko nftables, ne obojega: oba pišeta v isti netfilter in si lahko pravila medsebojno ovirata.
Pred čim Vas požarni zid ne ščiti
- Storitve, ki jih sami dovolite. Vrata 443 so odprta za Vaše spletno mesto, zato je ranljivost v spletnem mestu povsem dosegljiva. Požarni zid ščiti samo zaprta vrata.
- Docker. Ko z Dockerjem objavite vrata (
-p 5432:5432), Docker nastavi lastna pravila netfilter, ki promet preusmerijo, preden začnejo veljati pravila ufw. Dokumentacija Dockerja dobesedno pravi, da se Docker in ufw ne razumeta dobro. Vrata vsebnika so lahko torej od zunaj odprta, čeprav jihufw statusne prikaže. Rešitev (objava na127.0.0.1) spoznate v lekciji 9.3. - Odhodni promet. Z "allow outgoing" lahko vdrt program pošilja kamorkoli. Za večino majhnih strežnikov je to sprejemljiva izbira; stroga okolja omejujejo tudi odhodni promet.
Požarni zid Vašega ponudnika
Mnogi ponudniki imajo tudi požarni zid v omrežju, pred Vašim strežnikom, ki ga nastavite v nadzorni plošči za stranke (včasih se imenuje "cloud firewall" ali "security group"). To je odlična dodatna plast in deluje tudi, če na samem strežniku kaj nastavite narobe. Vendar ne nadomesti požarnega zidu na strežniku: če strežnik preselite ali zamenjate ponudnika, ne gre z Vami, in ga ne ponuja vsak ponudnik. Zato imejte vedno požarni zid tudi na samem strežniku.
Na AlmaLinux in Rocky Linux
Tam je privzeto vklopljen firewalld, ki deluje z conami. Najpomembnejši ukazi:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadBrez --permanent sprememba velja le do naslednjega ponovnega zagona; z --permanent pa šele po --reload. SSH je v privzeti coni že odprt.
V praksi
Če se na VPS pri WebOké vseeno zaklenete ven, na zaslonu VPS odprite konzolo, se prijavite in izklopite požarni zid (ufw disable) ali razveljavite zadnje pravilo. Pri drugih ponudnikih se ta zasilni vhod prav tako imenuje konzola, VNC ali rescue. Vedite, kje je ta gumb, preden ga potrebujete.
Povzetek
- Požarni zid je Vaša druga plast po načelu "poslušaj samo, kjer je treba"; nftables je orodje v jedru, ufw preprosta plast nad njim.
- Začnite z
default deny incoming, dovolite SSH predufw enable, preizkusite z drugo sejo in poznajte konzolo svojega ponudnika. - Preverite, da ufw pokriva tudi IPv6 (
IPV6=yes); v nftables to naenkrat stori družinainet. denyod zunaj pokaže "filtrirano",rejectpokaže "zaprto";limitzavira ponavljajoče se povezave.- Vrata Dockerja gredo mimo ufw (lekcija 9.3); požarni zid ponudnika je dodatna plast, ne nadomestilo.
Kviz
Naloga
Naloga O5.2: Nastavitev Vašega požarnega zidu. Na svojem strežniku vklopite požarni zid z ufw (ali nftables ali firewalld na AlmaLinux/Rocky): privzeto vse dohodno zaprto, SSH in to, kar resnično še potrebujete. Preizkusite z drugo sejo, preverite, ali je pokrit tudi IPv6, in od zunaj z nc poglejte, ali so nedovoljena vrata zaprta ali filtrirana. Izpolnite kontrolni seznam in prilepite svoj ufw status verbose (ali nft list ruleset); pri vseh odprtih vratih navedite, čemu so namenjena.
Naloga O5.2: Nastavitev Vašega požarnega zidu
To nalogo opravite sami; nihče je ne pregleda. Odkljukajte, kar ste naredili, in nalogo označite kot opravljeno.
Za spletni strežnik samo 22 (ali Vaša vrata SSH), 80 in 443, za IPv4 in IPv6. Skrbniška vrata samo z stalnega naslova ali prek tunela SSH. Prek konzole: ufw disable (ali izpraznite pravila nftables).
Vaše kljukice in zapiski ostanejo samo v tem brskalniku, nikamor jih ne pošiljamo. Če ste prijavljeni, v Moji tečaji shranimo samo podatek, da ste nalogo opravili.
Za nadaljnje branje
- Zaščita VPS: prvih pet minut
- Nimate več dostopa do VPS: kaj zdaj?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Dokumentacija Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Dokumentacija Docker, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
