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.