Prejsť na obsah
Aktuálny kupón:zľava 10 %Uplatniť v objednávke

Firewall vnútri VPS: UFW (a nftables pre pokročilých)

Nastavíte firewall UFW priamo vo VPS tak, aby ste sa neodrezali: predvolená politika, pravidlá pre služby, obmedzenie z IP adresy, limit, IPv6, logy. Prečo Docker UFW obchádza a ako na nftables.

  • pokročilý
  • ~20 min
  • Aktualizované 9. 10. 2026

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:

bash
ufw status

Výstup Status: inactive znamená, že firewall zatiaľ nič neblokuje.

Debian 13

Nainštalujte UFW:

bash
apt install ufw

Po 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:

bash
ufw default deny incoming
ufw default allow outgoing
  • ufw 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.

bash
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#

  1. Zapnite firewall:

    bash
    ufw enable
  2. UFW sa opýta Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Ak máte pravidlo pre SSH, napíšte y a stlačte Enter.

  3. Uvidíte Firewall is active and enabled on system startup. Firewall teraz beží a zapne sa aj po reštarte.

  4. V novom okne overte, že sa cez SSH pripojíte.

  5. Zobrazte podrobný stav:

    bash
    ufw status verbose
    Vý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
RiadokVýznam
Status: activeFirewall 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: skipNové aplikačné profily sa samy nepovolia.
22/tcp ALLOW IN AnywherePort 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 chcetePríkaz
Web (HTTP a HTTPS)ufw allow proto tcp from any to any port 80,443 comment 'Web'
Minecraft Javaufw 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 portovufw allow proto tcp from any to any port 25565:25600 comment 'Herne servery'
Port iba z jednej IP adresyufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB z kancelarie'
Zablokovať IP adresuufw 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 rozsah 198.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íkazom ufw prepend deny from 2001:db8::/64, ktorý pravidlo dá na začiatok IPv6 pravidiel.
  • deny – ticho zahodiť. Variant reject odosielateľovi oznámi odmietnutie.

V poznámkach (comment) používajte iba písmená bez diakritiky, číslice a medzery.

Obmedzenie počtu spojení (limit)#

bash
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#

bash
ufw status numbered
Výstuptext
     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)              # Minecraft

Zmazanie pravidla podľa čísla:

bash
ufw delete 2
  • ufw 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 reloadZnova načíta pravidlá (po ručnej úprave súborov v /etc/ufw/).
ufw disableVypne firewall, pravidlá zostanú uložené.
ufw --dry-run allow 80/tcpUkáže, čo by príkaz urobil, ale nič nezmení.
ufw resetVypne 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úť:

  1. 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.
  2. Databázy a interné služby nepublikujte vôbec. Kontajnery spolu komunikujú cez sieť Dockeru, port von nepotrebujú.

  3. 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#

bash
ufw logging low
  • low – 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 off logovanie vypne.

Kde záznamy nájdete:

Ubuntu 24.04

bash
tail -f /var/log/ufw.log
  • tail -f – vypisuje nové riadky súboru priebežne. Ukončíte Ctrl+C.

Debian 13

bash
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:

/etc/nftables.conftext
#!/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 rulesetZmaže všetky existujúce pravidlá, aby sa súbor načítal vždy načisto.
table inet filterTabuľka filter pre rodinu inet, teda IPv4 aj IPv6 naraz.
type filter hook input … policy dropReťazec pre prichádzajúcu prevádzku. Čo žiadne pravidlo nepovolí, sa zahodí.
ct state established,related acceptPrepustí odpovede na už nadviazané spojenia. Bez toho by nefungovalo nič, čo VPS sám otvorí.
ct state invalid dropZahodí poškodené alebo nezmyselné pakety.
iif "lo" acceptPovolí 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 } acceptPovolí ICMP: ping a správy nutné pre správnu funkciu siete. IPv6 bez ICMPv6 nefunguje (zisťovanie susedov).
tcp dport 22 acceptSSH. Ak máte iný port, upravte ho.
tcp dport { 80, 443 } acceptWeb. Množina portov v zložených zátvorkách. Pre UDP použite udp dport.
chain forward … policy dropVPS nebude preposielať prevádzku (nie je router).
chain output … policy acceptOdchádzajúca prevádzka bez obmedzenia.

Postup nasadenia (platí pre Debian 13 aj Ubuntu 24.04):

  1. Nainštalujte nástroj: apt install nftables.

  2. Vypnite UFW, ak beží: ufw disable.

  3. Uložte konfiguráciu do /etc/nftables.conf (nano /etc/nftables.conf).

  4. 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.
  5. Zapnite službu, ktorá pravidlá načíta hneď aj po každom štarte:

    bash
    systemctl enable --now nftables
    • enable – načítavať pravidlá pri štarte VPS (služba je v predvolenom stave vypnutá).
    • --now – a načítať ich hneď.
  6. V novom okne overte SSH. Aktuálne pravidlá vypíše nft list ruleset.

Overenie#

  • ufw status verbose ukazuje Status: active a 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 Linuxe nc -vz -w 5 <IP_ADRESA_VPS> 3306; zatvorený port skončí vypršaním času).

Keď sa odrežete#

  1. Otvorte konzolu v prehliadači a prihláste sa ako root.
  2. Povoľte SSH: ufw allow 22/tcp, alebo firewall dočasne vypnite: ufw disable.
  3. Pri nftables: systemctl stop nftables a potom nft flush ruleset (zmaže všetky pravidlá, prevádzka bude povolená).
  4. 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ť pravidlo deny, ktoré rovnakú prevádzku zahodí.
  • Overte, že aplikácia na porte počúva: ss -tulpn | grep <PORT>. Adresa 127.0.0.1 znamená, ž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ž potom ufw enable.
  • Predvolená politika: deny incoming, allow outgoing; pravidlá platia zhora, prvá zhoda vyhráva.
  • ufw status numbered a ufw delete <cislo> na správu, ufw status verbose na 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.

Hľadanie v návodoch