Modul 5 · 5.2
Vatrozid s ufw i nftables
Modul 5: Zaštita mreže · Vrijeme čitanja: 12 minuta
Cilj učenja: Nakon ove lekcije moći ćete postaviti vatrozid koji propušta samo ono što je potrebno, za IPv4 i za IPv6, a da sami sebi ne zaključate pristup. Znat ćete i od čega Vas vatrozid na poslužitelju ne štiti.
Ključni pojmovi: filtar paketa, netfilter, nftables, iptables-nft, ufw, zadana pravila, allow, deny, reject, limit, IPv6 u ufw-u, vatrozid pružatelja usluge, firewalld, Docker i vatrozid
Što radi vatrozid
Vatrozid na Vašem poslužitelju je filtar paketa: za svaki dolazni mrežni paket provjerava popis pravila i odlučuje smije li paket proći. U Linuxu se taj filtar nalazi u jezgri i zove se netfilter. Postavljate ga pomoću programa:
- nftables (naredba
nft) je današnji alat. Debian ga standardno koristi od verzije Debian 10. - iptables je stari alat. Na modernim sustavima
iptablesje obično samo prijevod na nftables (iptables-nft), tako da stare upute i dalje rade. - ufw (Uncomplicated Firewall) je jednostavan sloj iznad toga, standardno prisutan na Ubuntuu i jednom naredbom instaliran na Debianu. Za jedan poslužitelj ufw je najjednostavniji izbor. Ova lekcija koristi ufw, a zatim pokazuje kako ista pravila izgledaju u nftablesu.
Vatrozid je Vaš drugi sloj obrane. Prvi je da servisi slušaju samo na ispravnoj adresi (lekcija 5.1). Zajedno osiguravaju da pogreška u jednom sloju ne postane odmah otvorena vrata.
Najprije: kako ćete se vratiti ako nešto pođe po zlu?
Klasična pogreška: uključite vatrozid, zaboravite propustiti SSH i veza se prekine. Tada više ne možete pristupiti putem SSH-a. Prije nego što počnete:
- Provjerite kako se otvara konzola Vašeg pružatelja usluge (lekcija 1.2). Ona radi mimo mreže, dakle i kada vatrozid sve zatvori. Ondje se prijavite i upišite
ufw disable. - Ako niste sigurni, izradite snimku stanja (snapshot).
- Ostavite trenutačnu SSH sesiju otvorenom i testirajte s drugom sesijom.
ufw u pet koraka
Korak 1: instalacija i odabir zadanih pravila.
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'Zadana pravila vrijede za sve za što ne postoji posebno pravilo. "Deny incoming" znači: sve što dolazi je zabranjeno, osim onoga što u nastavku dopustite. To je jedina sigurna osnova. Odlazni promet (Vaš poslužitelj koji preuzima ažuriranja) dopuštate.
Korak 2: propustite SSH prije nego što uključite vatrozid.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH je aplikacijski profil koji ufw poznaje (odgovara priključku 22/tcp). Ako SSH radi na drugom priključku, upotrijebite broj: sudo ufw allow 2222/tcp. Obratite pozornost na "Rules updated (v6)": ufw izrađuje pravilo i za IPv6. To radi zato što u /etc/default/ufw stoji redak IPV6=yes, što je zadana postavka. Svakako to provjerite: ako je postavljeno na no, Vaš vatrozid vrijedi samo za IPv4.
Korak 3: ostalo što Vam treba.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # samo ako koristite HTTP/3Pravilo možete ograničiti na jednu izvornu adresu, na primjer za administracijski priključak kojem se smije pristupati samo iz Vašeg ureda:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpKorak 4: uključivanje.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupKorak 5: provjera. Otvorite drugi prozor i ponovno se prijavite. Ako to uspije, SSH je ispravno postavljen. Zatim pregledajte 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 se uklanja pomoću brojeva: sudo ufw status numbered, a zatim sudo ufw delete 3.
deny, reject i limit
- deny tiho odbacuje paket: izvana se vidi "filtrirano" (lekcija 5.1).
- reject šalje natrag odbijanje: izvana se vidi "zatvoreno". To je urednije za Vaše vlastite servise, ali otkriva da poslužitelj postoji.
- limit propušta vezu, ali blokira adresu koja unutar 30 sekundi pokuša uspostaviti vezu šest ili više puta. Korisno za SSH:
sudo ufw limit OpenSSHumjestoallow. Metoda je gruba (broji veze, a ne neuspjele prijave); fail2ban (lekcija 5.3) je precizniji.
Ista pravila u nftablesu
ufw u pozadini zapisuje pravila za netfilter. Ako želite raditi bez ufw-a, sami pišete datoteku za nftables. Na Debianu se nalazi u /etc/nftables.conf, a učitavate je servisom 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;
}
}Čitajte je ovako. Tablica se zove filter i pripada obitelji inet: jedna tablica za IPv4 i IPv6 istodobno, tako da IPv6 ne možete zaboraviti. U lancu input zadano pravilo je drop. Zatim: odgovori na već postojeće veze smiju se vratiti (established,related), sve na loopbacku je dopušteno, ICMP je dopušten (potreban je, među ostalim, za IPv6 i za poruke o pogreškama u veličini paketa), a dopušteni su i priključci 22, 80 i 443.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # provjera bez učitavanja
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetKoristite ili ufw ili vlastitu datoteku za nftables, ne oboje: oba zapisuju u isti netfilter i mogu jedno drugome smetati u pravilima.
Od čega Vas vatrozid ne štiti
- Servisi koje sami propustite. Priključak 443 otvoren je za Vašu web-stranicu; ranjivost u Vašoj web-stranici stoga je i dalje dostupna. Vatrozid štiti samo priključke koji su zatvoreni.
- Docker. Kada pomoću Dockera objavite priključak (
-p 5432:5432), Docker postavlja vlastita pravila za netfilter koja preusmjeravaju promet prije nego što se primijene pravila ufw-a. Dokumentacija Dockera doslovno navodi da Docker i ufw ne idu dobro zajedno. Priključak kontejnera tako može biti otvoren izvana, a da gaufw statusne prikazuje. Rješenje (objava na127.0.0.1) naučit ćete u lekciji 9.3. - Odlazni promet. Uz "allow outgoing" hakirani program može slati podatke bilo kamo. Za većinu malih poslužitelja to je prihvatljiv izbor; strogo zaštićena okruženja ograničavaju i odlazni promet.
Vatrozid Vašeg pružatelja usluge
Mnogi pružatelji usluga imaju i vatrozid u mreži, ispred Vašeg poslužitelja, koji postavljate u korisničkom sučelju (ponekad se zove "cloud firewall" ili "security group"). To je odličan dodatni sloj, a radi i ako na samom poslužitelju nešto pogrešno postavite. Ali on ne zamjenjuje vatrozid na poslužitelju: ako preselite poslužitelj ili promijenite pružatelja usluge, on ne ide s Vama, a ne nudi ga ni svaki pružatelj usluge. Zato uvijek zadržite vatrozid na samom poslužitelju.
Na AlmaLinuxu i Rocky Linuxu
Ondje je firewalld standardno uključen, sa zonama. Najvažnije naredbe:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadBez --permanent promjena vrijedi samo do sljedećeg ponovnog pokretanja; s --permanent vrijedi tek nakon --reload. SSH je u zadanoj zoni već otvoren.
U praksi
Ako ipak sami sebi zaključate pristup na VPS-u kod WebOké, na zaslonu VPS-a otvorite konzolu, prijavite se i isključite vatrozid (ufw disable) ili poništite posljednje pravilo. Kod drugih pružatelja usluga taj se izlaz u nuždi također zove konzola, VNC ili rescue. Saznajte gdje se nalazi taj gumb prije nego što Vam zatreba.
Sažetak
- Vatrozid je Vaš drugi sloj nakon načela "slušaj samo gdje je potrebno"; nftables je alat u jezgri, a ufw jednostavan sloj iznad njega.
- Počnite s
default deny incoming, propustite SSH prijeufw enable, testirajte s drugom sesijom i upoznajte konzolu svog pružatelja usluge. - Provjerite pokriva li ufw i IPv6 (
IPV6=yes); u nftablesu to odjednom rješava obiteljinet. denyizvana daje "filtrirano",rejectdaje "zatvoreno";limitusporava ponovljene pokušaje povezivanja.- Priključci Dockera zaobilaze ufw (lekcija 9.3); vatrozid Vašeg pružatelja usluge dodatni je sloj, a ne zamjena.
Kviz
Zadatak
Zadatak O5.2: Postavite svoj vatrozid. Na svom poslužitelju uključite vatrozid s ufw-om (ili nftablesom, ili firewalldom na AlmaLinuxu/Rockyju): standardno sve dolazno zatvoreno, SSH te ono što Vam stvarno još treba. Testirajte s drugom sesijom, provjerite je li IPv6 pokriven i izvana pomoću nc provjerite je li nedopušteni priključak zatvoren ili filtriran. Ispunite kontrolni popis i zalijepite svoj ufw status verbose (ili nft list ruleset); za svaki otvoreni priključak navedite čemu služi.
Zadatak O5.2: Postavite svoj vatrozid
Ovaj zadatak rješavate sami; nitko ga ne provjerava. Označite što ste napravili i označite zadatak kao završen.
Za web-poslužitelj samo 22 (ili Vaš SSH-port), 80 i 443, za IPv4 i IPv6. Administratorski portovi samo s fiksne adrese ili preko SSH-tunela. Preko konzole: ufw disable (ili ispraznite nftables pravila).
Vaše kvačice i bilješke ostaju samo u ovom pregledniku; ne šaljemo ih nikamo. Ako ste prijavljeni, u Moji tečajevi čuvamo samo podatak da ste zadatak završili.
Dodatno štivo
- Zaštita Vašeg VPS-a: prvih pet minuta
- Više nemate pristup svom VPS-u: što sada?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Dokumentacija za Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Dokumentacija Dockera, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
