UFW je izmišljen da bi se zaštitni zid mogao podesiti sa tri komande, i u tome uspeva. Problem je drugde: ufw status prikazuje namere, a ne rezultate. Pravilo može biti na listi i ne zatvarati apsolutno ništa — iz tri različita razloga, a svi se redovno javljaju na stvarnim serverima.
Početak koji vas ne zaključava napolje
Redosled komandi je bitan. Prvo dozvolite SSH, pa onda uključite:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
ufw enable pre dozvole za SSH preseca vašu sopstvenu sesiju, a odatle nadalje ostaje samo konzola provajdera. Ako je server već podešen a niste sigurni, držite drugu vezu otvorenom — ona preživljava neuspelu izmenu.
Pogledajte detaljan status; kratki krije podrazumevanu politiku:
sudo ufw status verbose
Prva greška: pravilo postoji, a port je otvoren celom svetu
Najčešći red u tuđim konfiguracijama:
sudo ufw allow 3306
Tako se MySQL otvara „da bih se povezivao od kuće" — i otvara se celom internetu. Postoje dve ispravne varijante i obe su bolje:
sudo ufw allow from 203.0.113.25 to any port 3306
ili, još pouzdanije, uopšte ne puštajte servis napolje: bind-address = 127.0.0.1 u MySQL konfiguraciji, a spoljni pristup preko SSH tunela. Zaštitni zid je druga linija; prva je da servis ne osluškuje na javnoj adresi. Pravilo u UFW-u može biti obrisano greškom, dok se bind-address ne menja sam od sebe.
Druga greška: IPv6
Pravilo poput ufw allow from 203.0.113.25 važi samo za IPv4. Ako server ima IPv6 adresu — a većina VPS-ova ima, uključenu — servis ostaje dostupan preko nje. Provajder je dodelio adresu, vi je se ne sećate, skener je se seća.
Proverite da li je v6 filtriranje uopšte uključeno (IPV6=yes u /etc/default/ufw) i da servis bez potrebe ne osluškuje na :::
ss -tulpn | grep ':::'
Pravila koja izričito navode adresu moraju se pisati posebno za svaku verziju protokola.
Treća greška: Docker
Najviše nervira. Docker objavljuje portove dodajući sopstvena pravila u iptables lance pre onih koje upisuje UFW. Kao rezultat, kontejner pokrenut sa -p 5432:5432 dostupan je sa interneta iako UFW prijavljuje Status: active i politiku deny incoming. Zaštitni zid nije pokvaren — prosto nikada ne dođe na red.
Lek nije u UFW-u nego u načinu objavljivanja porta:
ports:
- "127.0.0.1:5432:5432"
Vezivanje za lokalnu adresu najjednostavnije je i najpouzdanije rešenje. Napolje treba da gleda samo ono što zaista opslužuje posetioce: obično portovi 80 i 443 obrnutog posrednika.
Redosled pravila
UFW primenjuje prvo pravilo koje se poklapa i tu staje. Tako zabrana dodata posle dozvole neće raditi: nikada ne dođe na red. Pogledajte numeraciju i ubacite gde treba:
sudo ufw status numbered
sudo ufw insert 1 deny from 198.51.100.0/24
sudo ufw delete 7
Pravila se brišu po broju, ali se brojevi pomeraju posle svakog brisanja — brišite jedno po jedno i ponovo čitajte listu.
Provera spolja
Lokalne komande prikazuju šta je podešeno. Šta je zaista ispalo vidi se samo sa druge mašine:
nmap -Pn -p- 203.0.113.25
nc -zv 203.0.113.25 3306
Poslužiće bilo koji drugi server ili vaš kućni računar. To je jedina provera koja ne laže i vredi je pokrenuti posle svake primetne rekonfiguracije — naročito posle instalacije nečega što „samo podešava mrežu": Docker, kontrolni paneli, VPN-ovi.
Dnevnici
Podrazumevano UFW ne beleži gotovo ništa. Uključite to sa:
sudo ufw logging low
Zapisi idu u /var/log/ufw.log — ali samo ako u sistemu postoji rsyslog. Na Debianu 12 i Ubuntuu 24.04 njega možda nema, pa sve ide u systemd dnevnik:
sudo journalctl -k | grep -i '\[UFW'
Prazan /var/log/ufw.log sam po sebi ne znači ništa — prvo pogledajte u dnevnik.
Šta očekivati od zaštitnog zida
UFW zatvara ono što ne bi trebalo da bude dostupno. On ne ispituje sadržaj zahteva ka onome što je otvoreno: port 443 otvoren je svima, i šta god stigne na sajt stiže nesmetano. To je posao drugih alata — WAF-a na nivou aplikacije, IDS-a na nivou saobraćaja. Posao zaštitnog zida je skromniji i važniji: da se lista otvorenih portova poklapa sa onim u šta verujete. Kako ta lista izgleda zajedno sa aktivnim pravilima na jednoj stranici pokazuje demo ispod.