Přejít na obsah
Aktuální kupón:sleva 10 %Uplatnit v objednávce

Firewall uvnitř VPS: UFW (a nftables pro pokročilé)

Nastavíte firewall UFW přímo ve VPS tak, abyste se neodřízli: výchozí politika, pravidla pro služby, omezení z IP adresy, limit, IPv6, logy. Proč Docker UFW obchází a jak na nftables.

  • pokročilý
  • ~20 min
  • Aktualizováno 1. 10. 2026

UFW (Uncomplicated Firewall) je firewall přímo uvnitř VPS, který se ovládá srozumitelnými příkazy. Nastavíte ho tak, aby zvenku bylo dostupné jen to, co chcete, a přitom se neodřízli od SSH. Na konci najdete, proč Docker UFW obchází, a ukázkovou konfiguraci nftables pro pokročilé.

Co budete potřebovat

  • VPS u StormHostu s Ubuntu 24.04 nebo Debianem 13
  • Připojení přes SSH jako root (návod)
  • Otevřená konzole v prohlížeči pro jistotu
  • Seznam portů, které vaše služby používají
  • Asi 20 minut

UFW v kostce#

Linux filtruje pakety v jádře (subsystém netfilter, ovládaný přes nftables nebo iptables). Psát pravidla přímo je složité, UFW to dělá za vás: příkaz ufw allow 22/tcp převede na správná pravidla pro IPv4 i IPv6.

UFW je jedna ze dvou možností. Druhou je firewall v zákaznické zóně, který filtruje provoz ještě před VPS. Pokud používáte oba, musí být port otevřený v obou.

Instalace a výchozí politika#

Ubuntu 24.04

UFW je nainstalovaný, ale vypnutý. Ověřte to:

bash
ufw status

Výstup Status: inactive znamená, že firewall zatím nic neblokuje.

Debian 13

Nainstalujte UFW:

bash
apt install ufw

Po instalaci je vypnutý (ufw status vypíše Status: inactive).

Nastavte výchozí politiku, tedy co se stane s provozem, který žádné pravidlo nezmíní:

bash
ufw default deny incoming
ufw default allow outgoing
  • ufw default deny incoming – nová příchozí spojení zakázat, pokud je nepovolí pravidlo.
  • ufw default allow outgoing – odchozí spojení z VPS povolit (aktualizace, DNS, stahování).

UFW je stavový: odpovědi na spojení, která VPS sama otevřela, projdou i s deny incoming.

Povolte SSH dřív, než firewall zapnete#

Bez pravidla pro SSH se po zapnutí odříznete

ufw enable s politikou deny incoming okamžitě zablokuje všechno, co není povolené. Pokud v tu chvíli nemáte pravidlo pro SSH, spojení spadne. Do VPS se pak dostanete jen přes konzoli v prohlížeči. Pokud máte SSH na jiném portu než 22, povolte ten.

bash
ufw allow 22/tcp comment 'SSH'
  • ufw allow – přidá povolující pravidlo pro příchozí provoz.
  • 22/tcp – port 22, protokol TCP.
  • comment 'SSH' – poznámka, která se ukáže ve výpisu pravidel.

Alternativně můžete použít profil aplikace. Seznam profilů vypíše ufw app list (například OpenSSH, po instalaci Nginx i Nginx Full). Pravidlo pak přidáte příkazem ufw allow OpenSSH.

Zapnutí a kontrola#

  1. Zapněte firewall:

    bash
    ufw enable
  2. UFW se zeptá Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Máte-li pravidlo pro SSH, napište y a stiskněte Enter.

  3. Uvidíte Firewall is active and enabled on system startup. Firewall teď běží a zapne se i po restartu.

  4. V novém okně ověřte, že se přes SSH připojí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
ŘádekVýznam
Status: activeFirewall běží.
Logging: on (low)Zapisuje zablokované pakety do logu, s omezením počtu záznamů.
Default: deny (incoming)Příchozí provoz bez pravidla se zahodí.
allow (outgoing)Odchozí provoz je povolený.
disabled (routed)Přeposílání provozu (VPS jako router) UFW neřeší.
New profiles: skipNové aplikační profily se samy nepovolí.
22/tcp ALLOW IN AnywherePort 22/TCP je povolený odkudkoli přes IPv4.
(v6)Totéž pravidlo pro IPv6. UFW ho vytváří automaticky.

Pravidla pro služby#

Co chcetePří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 i UDP)ufw allow 30120 comment 'FiveM'
Rust (hra a query)ufw allow proto udp from any to any port 28015,28017 comment 'Rust'
Rozsah portůufw allow proto tcp from any to any port 25565:25600 comment 'Herni servery'
Port jen z jedné IP adresyufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB z kancelare'
Zablokovat IP adresuufw insert 1 deny from 198.51.100.25 comment 'Utocnik'

Jak číst části příkazů:

  • 25565/tcp – port a protokol. Bez protokolu (ufw allow 30120) platí pravidlo pro TCP i UDP.
  • proto tcp – protokol v rozšířeném zápisu. Rozsah a výčet portů (80,443, 25565:25600) protokol vyžadují.
  • from any / from 198.51.100.25 – odkud spojení přichází: odkudkoli, nebo z jedné adresy (může být i rozsah 198.51.100.0/24).
  • to any port 3306 – na jakou adresu VPS a port. any = všechny adresy VPS.
  • insert 1 – vloží pravidlo na první místo. UFW vyhodnocuje pravidla shora a platí první shoda, takže blokace adresy musí být nad povolujícími pravidly. IPv6 adresu zablokujete příkazem ufw prepend deny from 2001:db8::/64, který pravidlo dá na začátek IPv6 pravidel.
  • deny – tiše zahodit. Varianta reject odesílateli oznámí odmítnutí.

V poznámkách (comment) používejte jen písmena bez diakritiky, číslice a mezery.

Omezení počtu spojení (limit)#

bash
ufw limit 22/tcp comment 'SSH'
  • ufw limit – povolí port, ale zablokuje IP adresu, která se pokusí navázat 6 a více spojení během 30 sekund. Zpomalí tak hádání hesel.

Pokud už máte pro port 22 pravidlo allow, nejdřív ho smažte (viz další sekce), jinak by vyhrálo starší pravidlo. Limit se nehodí pro služby s mnoha legitimními spojeními (web, hry). Pro SSH je lepší fail2ban, který reaguje na skutečně chybná přihlášení.

Číslovaná pravidla a mazání#

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

Smazání pravidla podle čísla:

bash
ufw delete 2
  • ufw delete 2 – smaže pravidlo číslo 2. UFW se zeptá na potvrzení (y).

Po každém smazání se čísla posunou, proto před dalším mazáním spusťte ufw status numbered znovu. IPv4 a IPv6 varianta jsou dvě pravidla. Obě najednou smažete zápisem pravidla: ufw delete allow 25565/tcp.

Další užitečné příkazy:

PříkazCo dělá
ufw reloadZnovu načte pravidla (po ruční úpravě souborů v /etc/ufw/).
ufw disableVypne firewall, pravidla zůstanou uložená.
ufw --dry-run allow 80/tcpUkáže, co by příkaz udělal, ale nic nezmění.
ufw resetVypne firewall a smaže všechna pravidla. Používejte jen při začátku znovu.

IPv6#

UFW má IPv6 zapnuté ve výchozím stavu: v souboru /etc/default/ufw je řádek IPV6=yes. Každé pravidlo bez konkrétní IPv4 adresy se pak vytvoří i pro IPv6 (řádky (v6)). Hodnotu IPV6=no nenastavujte. VPS má veřejnou IPv6 adresu a bez IPv6 pravidel by IPv6 provoz nebyl filtrovaný podle vašich pravidel.

Docker obchází UFW#

Když v Dockeru publikujete port (-p 8080:80 nebo ports: v compose.yaml), bude dostupný z internetu i v případě, že ho UFW zakazuje. Docker přesměruje provoz do kontejneru dřív, než se k němu dostanou pravidla UFW. Dokumentace Dockeru to popisuje jako nekompatibilitu Dockeru a UFW.

Jak se tomu vyhnout:

  1. Publikujte porty jen na 127.0.0.1. Pak jsou dostupné jen uvnitř VPS a ven je pustíte přes Nginx (viz 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 jen na místní adrese, přesměrovaný na port 80 v kontejneru.
  2. Databáze a interní služby nepublikujte vůbec. Kontejnery spolu mluví přes síť Dockeru, port ven nepotřebují.

  3. Použijte firewall v zákaznické zóně. Filtruje provoz ještě před VPS, takže zachytí i porty publikované Dockerem.

Nastavení Dockeru "iptables": false nepoužívejte, rozbije síť kontejnerů. Pokročilé filtrování provozu do kontejnerů (řetězec DOCKER-USER) popisuje dokumentace Dockeru (otevře se v novém okně). Víc o Dockeru v návodu Docker a Docker Compose.

Logování#

bash
ufw logging low
  • low – zapisuje zablokované pakety, s omezením počtu záznamů. Vyšší úrovně (medium, high, full) zapisují víc a log rychle roste. ufw logging off logování vypne.

Kde záznamy najdete:

Ubuntu 24.04

bash
tail -f /var/log/ufw.log
  • tail -f – vypisuje nové řádky souboru průběžně. Ukončíte Ctrl+C.

Debian 13

bash
journalctl -k -f --grep "UFW"
  • journalctl -k – zprávy jádra (Debian ve výchozím stavu nemá samostatný soubor /var/log/ufw.log).
  • -f – průběžně vypisovat nové záznamy.
  • --grep "UFW" – jen řádky od UFW.

Pří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 odesílatele, DST vaše VPS, PROTO protokol a DPT port, na který se zkoušel připojit.

Pro pokročilé: nftables#

nftables je moderní nástroj pro pravidla firewallu v jádře. Na Debianu je výchozím rámcem a UFW ho sám používá pod kapotou (přes vrstvu iptables-nft). Psát pravidla přímo v nftables se hodí, když potřebujete víc, než UFW umí.

Nemíchejte UFW a vlastní nftables

Používejte buď UFW, nebo vlastní /etc/nftables.conf. Před přechodem na nftables UFW vypněte (ufw disable). Konfigurace níže začíná příkazem flush ruleset, který smaže všechna pravidla v jádře, včetně pravidel Dockeru a fail2banu. Po každém restartu služby nftables proto restartujte i Docker a fail2ban. S Dockerem na stejné VPS raději zůstaňte u UFW nebo firewallu v zákaznické zóně.

Ukázkový soubor pro server se SSH a webem:

/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;
    }
}
ŘádekCo dělá
flush rulesetSmaže všechna stávající pravidla, ať se soubor načte vždy načisto.
table inet filterTabulka filter pro rodinu inet, tedy IPv4 i IPv6 najednou.
type filter hook input … policy dropŘetězec pro příchozí provoz. Co žádné pravidlo nepovolí, se zahodí.
ct state established,related acceptPropustí odpovědi na už navázaná spojení. Bez toho by nefungovalo nic, co VPS sama otevře.
ct state invalid dropZahodí poškozené nebo nesmyslné pakety.
iif "lo" acceptPovolí provoz uvnitř VPS (místní smyčka, 127.0.0.1). Bez toho přestanou fungovat místní databáze a služby.
meta l4proto { icmp, ipv6-icmp } acceptPovolí ICMP: ping a zprávy nutné pro správnou funkci sítě. IPv6 bez ICMPv6 nefunguje (zjišťování sousedů).
tcp dport 22 acceptSSH. Pokud máte jiný port, upravte ho.
tcp dport { 80, 443 } acceptWeb. Množina portů ve složených závorkách. Pro UDP použijte udp dport.
chain forward … policy dropVPS nebude přeposílat provoz (není router).
chain output … policy acceptOdchozí provoz bez omezení.

Postup nasazení (platí pro Debian 13 i Ubuntu 24.04):

  1. Nainstalujte nástroj: apt install nftables.

  2. Vypněte UFW, pokud běží: ufw disable.

  3. Uložte konfiguraci do /etc/nftables.conf (nano /etc/nftables.conf).

  4. Zkontrolujte ji bez použití:

    bash
    nft -c -f /etc/nftables.conf
    • -c – jen kontrola (check), nic se nezmění. Když je vše v pořádku, nevypíše nic.
    • -f – načíst pravidla ze souboru.
  5. Zapněte službu, která pravidla načte hned i po každém startu:

    bash
    systemctl enable --now nftables
    • enable – načítat pravidla při startu VPS (služba je ve výchozím stavu vypnutá).
    • --now – a načíst je hned.
  6. V novém okně ověřte SSH. Aktuální pravidla vypíše nft list ruleset.

Ověření#

  • ufw status verbose ukazuje Status: active a pravidla pro všechny vaše služby.
  • Ze svého počítače se připojíte přes SSH a služby fungují.
  • Port, který povolený není, zvenku neodpovídá (test z počítače: ve Windows Test-NetConnection <IP_ADRESA_VPS> -Port 3306, na macOS a Linuxu nc -vz -w 5 <IP_ADRESA_VPS> 3306; zavřený port skončí vypršením času).

Když se odříznete#

  1. Otevřete konzoli v prohlížeči a přihlaste se jako root.
  2. Povolte SSH: ufw allow 22/tcp, nebo firewall dočasně vypněte: ufw disable.
  3. U nftables: systemctl stop nftables a pak nft flush ruleset (smaže všechna pravidla, provoz bude povolený).
  4. Opravte pravidla a firewall znovu zapněte.

Když něco nefunguje#

ERROR: Must specify 'tcp' or 'udp' with multiple ports#

Rozsah a výčet portů vyžadují protokol. Zapište pravidlo takto: ufw allow proto tcp from any to any port 25565:25600. Pro TCP i UDP přidejte dvě pravidla.

Pravidlo je přidané, ale port je pořád zavřený#

  • Zkontrolujte pořadí (ufw status numbered). Výš nemůže být pravidlo deny, které stejný provoz zahodí.
  • Ověřte, že aplikace na portu poslouchá: ss -tulpn | grep <PORT>. Adresa 127.0.0.1 znamená, že je dostupná jen uvnitř VPS.
  • Zkontrolujte firewall v zákaznické zóně. Pokud je v režimu Blokovat vše kromě povoleného, musí tam port být povolený také.

Port z Dockeru je otevřený, přestože ho UFW zakazuje#

To je očekávané chování, viz sekce Docker obchází UFW.

ERROR: initcaps při zapnutí#

UFW nemůže použít moduly jádra. Typicky jste aktualizovali jádro a VPS ještě neběží s novým. Restartujte VPS a zapněte UFW znovu.

Po restartu služby nftables přestal fungovat Docker nebo fail2ban#

flush ruleset smazal jejich pravidla. Restartujte je: systemctl restart docker fail2ban.

Shrnutí

  • Nejdřív ufw allow 22/tcp, teprve pak ufw enable.
  • Výchozí politika: deny incoming, allow outgoing; pravidla platí shora, první shoda vyhrává.
  • ufw status numbered a ufw delete <cislo> pro správu, ufw status verbose pro kontrolu.
  • IPv6 je zapnuté (IPV6=yes), pravidla se tvoří pro obě verze.
  • Porty publikované Dockerem UFW obcházejí: publikujte na 127.0.0.1, nebo použijte firewall v zákaznické zóně.
  • nftables jen pro pokročilé a nikdy současně s UFW.

Hledání v návodech