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:
ufw statusVýstup Status: inactive znamená, že firewall zatím nic neblokuje.
Debian 13
Nainstalujte UFW:
apt install ufwPo instalaci je vypnutý (ufw status vypíše Status: inactive).
Nastavte výchozí politiku, tedy co se stane s provozem, který žádné pravidlo nezmíní:
ufw default deny incoming
ufw default allow outgoingufw 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.
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#
Zapněte firewall:
bash ufw enableUFW se zeptá
Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Máte-li pravidlo pro SSH, napišteya stiskněte Enter.Uvidíte
Firewall is active and enabled on system startup. Firewall teď běží a zapne se i po restartu.V novém okně ověřte, že se přes SSH připojí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
| Řádek | Význam |
|---|---|
Status: active | Firewall 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: skip | Nové aplikační profily se samy nepovolí. |
22/tcp ALLOW IN Anywhere | Port 22/TCP je povolený odkudkoli přes IPv4. |
(v6) | Totéž pravidlo pro IPv6. UFW ho vytváří automaticky. |
Pravidla pro služby#
| Co chcete | Pří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 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 adresy | ufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB z kancelare' |
| Zablokovat IP adresu | ufw 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 rozsah198.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říkazemufw prepend deny from 2001:db8::/64, který pravidlo dá na začátek IPv6 pravidel.deny– tiše zahodit. Variantarejectodesí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)#
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í#
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) # MinecraftSmazání pravidla podle čísla:
ufw delete 2ufw 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říkaz | Co dělá |
|---|---|
ufw reload | Znovu načte pravidla (po ruční úpravě souborů v /etc/ufw/). |
ufw disable | Vypne firewall, pravidla zůstanou uložená. |
ufw --dry-run allow 80/tcp | Ukáže, co by příkaz udělal, ale nic nezmění. |
ufw reset | Vypne 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:
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.
Databáze a interní služby nepublikujte vůbec. Kontejnery spolu mluví přes síť Dockeru, port ven nepotřebují.
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í#
ufw logging lowlow– zapisuje zablokované pakety, s omezením počtu záznamů. Vyšší úrovně (medium,high,full) zapisují víc a log rychle roste.ufw logging offlogování vypne.
Kde záznamy najdete:
Ubuntu 24.04
tail -f /var/log/ufw.logtail -f– vypisuje nové řádky souboru průběžně. Ukončíte Ctrl+C.
Debian 13
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:
#!/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;
}
}| Řádek | Co dělá |
|---|---|
flush ruleset | Smaže všechna stávající pravidla, ať se soubor načte vždy načisto. |
table inet filter | Tabulka 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 accept | Propustí odpovědi na už navázaná spojení. Bez toho by nefungovalo nic, co VPS sama otevře. |
ct state invalid drop | Zahodí poškozené nebo nesmyslné pakety. |
iif "lo" accept | Povolí 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 } accept | Povolí ICMP: ping a zprávy nutné pro správnou funkci sítě. IPv6 bez ICMPv6 nefunguje (zjišťování sousedů). |
tcp dport 22 accept | SSH. Pokud máte jiný port, upravte ho. |
tcp dport { 80, 443 } accept | Web. Množina portů ve složených závorkách. Pro UDP použijte udp dport. |
chain forward … policy drop | VPS nebude přeposílat provoz (není router). |
chain output … policy accept | Odchozí provoz bez omezení. |
Postup nasazení (platí pro Debian 13 i Ubuntu 24.04):
Nainstalujte nástroj:
apt install nftables.Vypněte UFW, pokud běží:
ufw disable.Uložte konfiguraci do
/etc/nftables.conf(nano /etc/nftables.conf).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.
Zapněte službu, která pravidla načte hned i po každém startu:
bash systemctl enable --now nftablesenable– načítat pravidla při startu VPS (služba je ve výchozím stavu vypnutá).--now– a načíst je hned.
V novém okně ověřte SSH. Aktuální pravidla vypíše
nft list ruleset.
Ověření#
ufw status verboseukazujeStatus: activea 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 Linuxunc -vz -w 5 <IP_ADRESA_VPS> 3306; zavřený port skončí vypršením času).
Když se odříznete#
- Otevřete konzoli v prohlížeči a přihlaste se jako root.
- Povolte SSH:
ufw allow 22/tcp, nebo firewall dočasně vypněte:ufw disable. - U nftables:
systemctl stop nftablesa paknft flush ruleset(smaže všechna pravidla, provoz bude povolený). - 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 pravidlodeny, které stejný provoz zahodí. - Ověřte, že aplikace na portu poslouchá:
ss -tulpn | grep <PORT>. Adresa127.0.0.1znamená, ž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 pakufw enable. - Výchozí politika:
deny incoming,allow outgoing; pravidla platí shora, první shoda vyhrává. ufw status numberedaufw delete <cislo>pro správu,ufw status verbosepro 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.