UFW vzniklo preto, aby sa firewall nastavil tromi príkazmi, a to zvláda. Problém je inde: ufw status ukazuje zámery, nie výsledok. Pravidlo môže byť v zozname a pritom nezatvárať vôbec nič — z troch rôznych dôvodov, a všetky tri sa na skutočných serveroch vyskytujú pravidelne.
Začiatok, pri ktorom sa nezamknete
Na poradí príkazov záleží. Najprv povoliť SSH, potom zapínať:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
ufw enable pred povolením SSH preruší vašu vlastnú reláciu a ďalej zostáva len konzola poskytovateľa. Ak je server už nastavený a nie ste si istí, držte otvorené druhé spojenie, prežije nevydarenú úpravu.
Pozerať sa treba na podrobný stav, krátky skrýva predvolenú politiku:
sudo ufw status verbose
Chyba prvá: pravidlo je, ale port je otvorený celému svetu
Najčastejší riadok v cudzích konfiguráciách:
sudo ufw allow 3306
Takto sa otvára MySQL „aby sa dalo pripojiť z domu“ — a otvorí sa celému internetu. Správne varianty sú dva a oba sú lepšie:
sudo ufw allow from 203.0.113.25 to any port 3306
alebo, čo je spoľahlivejšie, službu vôbec von nepúšťať: bind-address = 127.0.0.1 v konfigurácii MySQL a prístup zvonka cez SSH tunel. Firewall je druhá línia; prvá je to, aby služba nepočúvala na verejnej adrese. Pravidlo v UFW možno omylom zmazať, kým bind-address sa sám nezmení.
Chyba druhá: IPv6
Pravidlo typu ufw allow from 203.0.113.25 sa týka len IPv4. Ak má server adresu IPv6 — a väčšina VPS ju má a zapnutú — služba po nej zostáva dostupná. Poskytovateľ adresu pridelil, vy si na ňu nespomeniete, skener o nej vie.
Overte, že je filtrovanie v6 vôbec zapnuté (IPV6=yes v /etc/default/ufw) a že služba nepočúva na :: zbytočne:
ss -tulpn | grep ':::'
Pravidlá s výslovne uvedenou adresou treba zakladať pre obe verzie protokolu zvlášť.
Chyba tretia: Docker
Najmrzutejšia. Docker publikuje porty tak, že si dopisuje vlastné pravidlá do reťazcov iptables skôr než tam, kam zapisuje UFW. Výsledkom je, že kontajner spustený ako -p 5432:5432 je dostupný z internetu, aj keď UFW hlási Status: active a politiku deny incoming. Firewall pritom nie je pokazený — len naň nepríde rad.
Nelieči sa to v UFW, ale v spôsobe, akým sa port publikuje:
ports:
- "127.0.0.1:5432:5432"
Naviazanie na lokálnu adresu je najjednoduchšie a najspoľahlivejšie riešenie. Von má mieriť len to, čo skutočne obsluhuje návštevníkov: obvykle porty 80 a 443 reverznej proxy.
Poradie pravidiel
UFW použije prvé vyhovujúce pravidlo a tým končí. Preto zákaz pridaný po povolení nezaberie: naň už rad nepríde. Pozrieme sa na číslovanie a vložíme na správne miesto:
sudo ufw status numbered
sudo ufw insert 1 deny from 198.51.100.0/24
sudo ufw delete 7
Pravidlá sa mažú podľa čísla, ale čísla sa po každom zmazaní posúvajú — mažte po jednom a zoznam si znova načítajte.
Kontrola zvonka
Miestne príkazy ukazujú, čo je nastavené. Čo z toho skutočne vzišlo, je vidieť len z iného stroja:
nmap -Pn -p- 203.0.113.25
nc -zv 203.0.113.25 3306
Postačí akýkoľvek iný server alebo domáci počítač. Je to jediná kontrola, ktorá neklame, a oplatí sa ju robiť po každej výraznejšej zmene konfigurácie — najmä po inštalácii niečoho, čo si „samo nastaví sieť“: Docker, ovládacie panely, VPN.
Logy
V predvolenom stave UFW nezapisuje takmer nič. Zapína sa to takto:
sudo ufw logging low
Záznamy putujú do /var/log/ufw.log — ale len ak je v systéme rsyslog. Na Debiane 12 a Ubuntu 24.04 tam byť nemusí, a potom všetko ide do žurnálu systemd:
sudo journalctl -k | grep -i '\[UFW'
Prázdny /var/log/ufw.log sám osebe nič neznamená — pozrite sa najprv do žurnálu.
Čo od firewallu čakať
UFW zatvára to, čo nemá byť dostupné. Neskúma obsah požiadaviek na to, čo je otvorené: port 443 je otvorený všetkým a všetko, čo na web príde, príde bez prekážok. To je práca iných nástrojov — WAF na úrovni aplikácie, IDS na úrovni prevádzky. Úloha firewallu je skromnejšia a dôležitejšia: aby zoznam otvorených portov zodpovedal tomu, čo si o ňom myslíte. Ako tento zoznam vyzerá spolu s aktívnymi pravidlami na jednej stránke, ukazuje ukážka nižšie.