UFW (Uncomplicated Firewall) je firewall priamo vnútri VPS, ktorý sa ovláda zrozumiteľnými príkazmi. Nastavíte ho tak, aby zvonku bolo dostupné iba to, čo chcete, a pritom sa neodrezali od SSH. Na konci nájdete, prečo Docker UFW obchádza, a ukážkovú konfiguráciu nftables pre pokročilých.
Čo budete potrebovať
- VPS u StormHostu s Ubuntu 24.04 alebo Debianom 13
- Pripojenie cez SSH ako root (návod)
- Otvorenú konzolu v prehliadači pre istotu
- Zoznam portov, ktoré vaše služby používajú
- Približne 20 minút
UFW v kocke#
Linux filtruje pakety v jadre (subsystém netfilter, ovládaný cez nftables alebo iptables). Písať pravidlá priamo je zložité, UFW to robí za vás: príkaz ufw allow 22/tcp prevedie na správne pravidlá pre IPv4 aj IPv6.
UFW je jedna z dvoch možností. Druhou je firewall v zákazníckom účte, ktorý filtruje prevádzku ešte pred VPS. Ak používate oba, musí byť port otvorený v oboch.
Inštalácia a predvolená politika#
Ubuntu 24.04
UFW je nainštalovaný, ale vypnutý. Overte to:
ufw statusVýstup Status: inactive znamená, že firewall zatiaľ nič neblokuje.
Debian 13
Nainštalujte UFW:
apt install ufwPo inštalácii je vypnutý (ufw status vypíše Status: inactive).
Nastavte predvolenú politiku, teda čo sa stane s prevádzkou, ktorú žiadne pravidlo nespomína:
ufw default deny incoming
ufw default allow outgoingufw default deny incoming– nové prichádzajúce spojenia zakázať, ak ich nepovolí pravidlo.ufw default allow outgoing– odchádzajúce spojenia z VPS povoliť (aktualizácie, DNS, sťahovanie).
UFW je stavový: odpovede na spojenia, ktoré VPS sám otvoril, prejdú aj s deny incoming.
Povoľte SSH skôr, než firewall zapnete#
Bez pravidla pre SSH sa po zapnutí odrežete
ufw enable s politikou deny incoming okamžite zablokuje všetko, čo nie je povolené. Ak v tej chvíli nemáte pravidlo pre SSH, spojenie spadne. Do VPS sa potom dostanete iba cez konzolu v prehliadači. Ak máte SSH na inom porte než 22, povoľte ten.
ufw allow 22/tcp comment 'SSH'ufw allow– pridá povoľujúce pravidlo pre prichádzajúcu prevádzku.22/tcp– port 22, protokol TCP.comment 'SSH'– poznámka, ktorá sa ukáže vo výpise pravidiel.
Alternatívne môžete použiť profil aplikácie. Zoznam profilov vypíše ufw app list (napríklad OpenSSH, po inštalácii Nginx aj Nginx Full). Pravidlo potom pridáte príkazom ufw allow OpenSSH.
Zapnutie a kontrola#
Zapnite firewall:
bash ufw enableUFW sa opýta
Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Ak máte pravidlo pre SSH, napíšteya stlačte Enter.Uvidíte
Firewall is active and enabled on system startup. Firewall teraz beží a zapne sa aj po reštarte.V novom okne overte, že sa cez SSH pripojíte.
Zobrazte podrobný stav:
bash ufw status verboseVýstuptext Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere # SSH 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
| Riadok | Význam |
|---|---|
Status: active | Firewall beží. |
Logging: on (low) | Zapisuje zablokované pakety do logu, s obmedzením počtu záznamov. |
Default: deny (incoming) | Prichádzajúca prevádzka bez pravidla sa zahodí. |
allow (outgoing) | Odchádzajúca prevádzka je povolená. |
disabled (routed) | Preposielanie prevádzky (VPS ako router) UFW nerieši. |
New profiles: skip | Nové aplikačné profily sa samy nepovolia. |
22/tcp ALLOW IN Anywhere | Port 22/TCP je povolený odkiaľkoľvek cez IPv4. |
(v6) | To isté pravidlo pre IPv6. UFW ho vytvára automaticky. |
Pravidlá pre služby#
| Čo chcete | Príkaz |
|---|---|
| Web (HTTP a HTTPS) | ufw allow proto tcp from any to any port 80,443 comment 'Web' |
| Minecraft Java | ufw allow 25565/tcp comment 'Minecraft' |
| Bedrock (Geyser) | ufw allow 19132/udp comment 'Geyser' |
| FiveM (TCP aj UDP) | ufw allow 30120 comment 'FiveM' |
| Rust (hra a query) | ufw allow proto udp from any to any port 28015,28017 comment 'Rust' |
| Rozsah portov | ufw allow proto tcp from any to any port 25565:25600 comment 'Herne servery' |
| Port iba z jednej IP adresy | ufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB z kancelarie' |
| Zablokovať IP adresu | ufw insert 1 deny from 198.51.100.25 comment 'Utocnik' |
Ako čítať časti príkazov:
25565/tcp– port a protokol. Bez protokolu (ufw allow 30120) platí pravidlo pre TCP aj UDP.proto tcp– protokol v rozšírenom zápise. Rozsah a výpočet portov (80,443,25565:25600) protokol vyžadujú.from any/from 198.51.100.25– odkiaľ spojenie prichádza: odkiaľkoľvek, alebo z jednej adresy (môže byť aj rozsah198.51.100.0/24).to any port 3306– na akú adresu VPS a port.any= všetky adresy VPS.insert 1– vloží pravidlo na prvé miesto. UFW vyhodnocuje pravidlá zhora a platí prvá zhoda, takže blokácia adresy musí byť nad povoľujúcimi pravidlami. IPv6 adresu zablokujete príkazomufw prepend deny from 2001:db8::/64, ktorý pravidlo dá na začiatok IPv6 pravidiel.deny– ticho zahodiť. Variantrejectodosielateľovi oznámi odmietnutie.
V poznámkach (comment) používajte iba písmená bez diakritiky, číslice a medzery.
Obmedzenie počtu spojení (limit)#
ufw limit 22/tcp comment 'SSH'ufw limit– povolí port, ale zablokuje IP adresu, ktorá sa pokúsi nadviazať 6 a viac spojení počas 30 sekúnd. Spomalí tak hádanie hesiel.
Ak už máte pre port 22 pravidlo allow, najprv ho zmažte (pozri ďalšiu sekciu), inak by vyhralo staršie pravidlo. Limit sa nehodí pre služby s mnohými legitímnymi spojeniami (web, hry). Pre SSH je lepší fail2ban, ktorý reaguje na skutočne chybné prihlásenia.
Číslované pravidlá a mazanie#
ufw status numbered To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere # SSH
[ 2] 25565/tcp ALLOW IN Anywhere # Minecraft
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
[ 4] 25565/tcp (v6) ALLOW IN Anywhere (v6) # MinecraftZmazanie pravidla podľa čísla:
ufw delete 2ufw delete 2– zmaže pravidlo číslo 2. UFW sa opýta na potvrdenie (y).
Po každom zmazaní sa čísla posunú, preto pred ďalším mazaním spustite ufw status numbered znova. IPv4 a IPv6 variant sú dve pravidlá. Obe naraz zmažete zápisom pravidla: ufw delete allow 25565/tcp.
Ďalšie užitočné príkazy:
| Príkaz | Čo robí |
|---|---|
ufw reload | Znova načíta pravidlá (po ručnej úprave súborov v /etc/ufw/). |
ufw disable | Vypne firewall, pravidlá zostanú uložené. |
ufw --dry-run allow 80/tcp | Ukáže, čo by príkaz urobil, ale nič nezmení. |
ufw reset | Vypne firewall a zmaže všetky pravidlá. Používajte iba pri začiatku odznova. |
IPv6#
UFW má IPv6 zapnuté v predvolenom stave: v súbore /etc/default/ufw je riadok IPV6=yes. Každé pravidlo bez konkrétnej IPv4 adresy sa potom vytvorí aj pre IPv6 (riadky (v6)). Hodnotu IPV6=no nenastavujte. VPS má verejnú IPv6 adresu a bez IPv6 pravidiel by IPv6 prevádzka nebola filtrovaná podľa vašich pravidiel.
Docker obchádza UFW#
Keď v Dockeri publikujete port (-p 8080:80 alebo ports: v compose.yaml), bude dostupný z internetu aj v prípade, že ho UFW zakazuje. Docker presmeruje prevádzku do kontajnera skôr, než sa k nemu dostanú pravidlá UFW. Dokumentácia Dockeru to opisuje ako nekompatibilitu Dockeru a UFW.
Ako sa tomu vyhnúť:
Publikujte porty iba na
127.0.0.1. Potom sú dostupné iba vnútri VPS a von ich pustíte cez Nginx (pozri Nginx a HTTPS):compose.yamlYAML services: app: ports: - "127.0.0.1:8080:80"127.0.0.1:8080:80– port 8080 na VPS, ale iba na miestnej adrese, presmerovaný na port 80 v kontajneri.
Databázy a interné služby nepublikujte vôbec. Kontajnery spolu komunikujú cez sieť Dockeru, port von nepotrebujú.
Použite firewall v zákazníckom účte. Filtruje prevádzku ešte pred VPS, takže zachytí aj porty publikované Dockerom.
Nastavenie Dockeru "iptables": false nepoužívajte, rozbije sieť kontajnerov. Pokročilé filtrovanie prevádzky do kontajnerov (reťazec DOCKER-USER) opisuje dokumentácia Dockeru (otvorí sa v novom okne). Viac o Dockeri v návode Docker a Docker Compose.
Logovanie#
ufw logging lowlow– zapisuje zablokované pakety, s obmedzením počtu záznamov. Vyššie úrovne (medium,high,full) zapisujú viac a log rýchlo rastie.ufw logging offlogovanie vypne.
Kde záznamy nájdete:
Ubuntu 24.04
tail -f /var/log/ufw.logtail -f– vypisuje nové riadky súboru priebežne. Ukončíte Ctrl+C.
Debian 13
journalctl -k -f --grep "UFW"journalctl -k– správy jadra (Debian v predvolenom stave nemá samostatný súbor/var/log/ufw.log).-f– priebežne vypisovať nové záznamy.--grep "UFW"– iba riadky od UFW.
Príklad záznamu: [UFW BLOCK] IN=eth0 … SRC=198.51.100.25 DST=203.0.113.10 … PROTO=TCP SPT=51234 DPT=23. SRC je adresa odosielateľa, DST váš VPS, PROTO protokol a DPT port, na ktorý sa skúšal pripojiť.
Pre pokročilých: nftables#
nftables je moderný nástroj na pravidlá firewallu v jadre. Na Debiane je predvoleným rámcom a UFW ho sám používa pod kapotou (cez vrstvu iptables-nft). Písať pravidlá priamo v nftables sa hodí, keď potrebujete viac, než UFW dokáže.
Nemiešajte UFW a vlastné nftables
Používajte buď UFW, alebo vlastný /etc/nftables.conf. Pred prechodom na nftables UFW vypnite (ufw disable). Konfigurácia nižšie začína príkazom flush ruleset, ktorý zmaže všetky pravidlá v jadre, vrátane pravidiel Dockeru a fail2banu. Po každom reštarte služby nftables preto reštartujte aj Docker a fail2ban. S Dockerom na rovnakom VPS radšej zostaňte pri UFW alebo firewalle v zákazníckom účte.
Ukážkový súbor pre server so SSH a webom:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport 22 accept
tcp dport { 80, 443 } accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}| Riadok | Čo robí |
|---|---|
flush ruleset | Zmaže všetky existujúce pravidlá, aby sa súbor načítal vždy načisto. |
table inet filter | Tabuľka filter pre rodinu inet, teda IPv4 aj IPv6 naraz. |
type filter hook input … policy drop | Reťazec pre prichádzajúcu prevádzku. Čo žiadne pravidlo nepovolí, sa zahodí. |
ct state established,related accept | Prepustí odpovede na už nadviazané spojenia. Bez toho by nefungovalo nič, čo VPS sám otvorí. |
ct state invalid drop | Zahodí poškodené alebo nezmyselné pakety. |
iif "lo" accept | Povolí prevádzku vnútri VPS (miestna slučka, 127.0.0.1). Bez toho prestanú fungovať miestne databázy a služby. |
meta l4proto { icmp, ipv6-icmp } accept | Povolí ICMP: ping a správy nutné pre správnu funkciu siete. IPv6 bez ICMPv6 nefunguje (zisťovanie susedov). |
tcp dport 22 accept | SSH. Ak máte iný port, upravte ho. |
tcp dport { 80, 443 } accept | Web. Množina portov v zložených zátvorkách. Pre UDP použite udp dport. |
chain forward … policy drop | VPS nebude preposielať prevádzku (nie je router). |
chain output … policy accept | Odchádzajúca prevádzka bez obmedzenia. |
Postup nasadenia (platí pre Debian 13 aj Ubuntu 24.04):
Nainštalujte nástroj:
apt install nftables.Vypnite UFW, ak beží:
ufw disable.Uložte konfiguráciu do
/etc/nftables.conf(nano /etc/nftables.conf).Skontrolujte ju bez použitia:
bash nft -c -f /etc/nftables.conf-c– iba kontrola (check), nič sa nezmení. Keď je všetko v poriadku, nevypíše nič.-f– načítať pravidlá zo súboru.
Zapnite službu, ktorá pravidlá načíta hneď aj po každom štarte:
bash systemctl enable --now nftablesenable– načítavať pravidlá pri štarte VPS (služba je v predvolenom stave vypnutá).--now– a načítať ich hneď.
V novom okne overte SSH. Aktuálne pravidlá vypíše
nft list ruleset.
Overenie#
ufw status verboseukazujeStatus: activea pravidlá pre všetky vaše služby.- Zo svojho počítača sa pripojíte cez SSH a služby fungujú.
- Port, ktorý povolený nie je, zvonku neodpovedá (test z počítača: vo Windows
Test-NetConnection <IP_ADRESA_VPS> -Port 3306, na macOS a Linuxenc -vz -w 5 <IP_ADRESA_VPS> 3306; zatvorený port skončí vypršaním času).
Keď sa odrežete#
- Otvorte konzolu v prehliadači a prihláste sa ako root.
- Povoľte SSH:
ufw allow 22/tcp, alebo firewall dočasne vypnite:ufw disable. - Pri nftables:
systemctl stop nftablesa potomnft flush ruleset(zmaže všetky pravidlá, prevádzka bude povolená). - Opravte pravidlá a firewall znova zapnite.
Keď niečo nefunguje#
ERROR: Must specify 'tcp' or 'udp' with multiple ports#
Rozsah a výpočet portov vyžadujú protokol. Zapíšte pravidlo takto: ufw allow proto tcp from any to any port 25565:25600. Pre TCP aj UDP pridajte dve pravidlá.
Pravidlo je pridané, ale port je stále zatvorený#
- Skontrolujte poradie (
ufw status numbered). Vyššie nemôže byť pravidlodeny, ktoré rovnakú prevádzku zahodí. - Overte, že aplikácia na porte počúva:
ss -tulpn | grep <PORT>. Adresa127.0.0.1znamená, že je dostupná iba vnútri VPS. - Skontrolujte firewall v zákazníckom účte. Ak je v režime Blokovať všetko okrem povoleného, musí tam byť port povolený tiež.
Port z Dockeru je otvorený, hoci ho UFW zakazuje#
To je očakávané správanie, pozri sekciu Docker obchádza UFW.
ERROR: initcaps pri zapnutí#
UFW nemôže použiť moduly jadra. Typicky ste aktualizovali jadro a VPS ešte nebeží s novým. Reštartujte VPS a zapnite UFW znova.
Po reštarte služby nftables prestal fungovať Docker alebo fail2ban#
flush ruleset zmazal ich pravidlá. Reštartujte ich: systemctl restart docker fail2ban.
Zhrnutie
- Najprv
ufw allow 22/tcp, až potomufw enable. - Predvolená politika:
deny incoming,allow outgoing; pravidlá platia zhora, prvá zhoda vyhráva. ufw status numberedaufw delete <cislo>na správu,ufw status verbosena kontrolu.- IPv6 je zapnuté (
IPV6=yes), pravidlá sa tvoria pre obe verzie. - Porty publikované Dockerom UFW obchádzajú: publikujte na
127.0.0.1, alebo použite firewall v zákazníckom účte. - nftables iba pre pokročilých a nikdy súčasne s UFW.