Přejít na obsah

Nastavení cookies

Zvolte, které druhy cookies povolíte. Svou volbu můžete kdykoli změnit přes Nastavení cookies v dolní části každé stránky. Prohlášení o ochraně osobních údajů

Nezbytné

Vždy zapnuté

Potřebné pro přihlášení, uchování košíku a zapamatování vašich voleb. Jsou vždy zapnuté.

Které cookies?
  • weboke_sessie, weboke_klant, weboke_remember: vaše relace a trvalé přihlášení
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazení cen s DPH nebo bez DPH
  • wok_cookies: vaše volba cookies, 12 měsíců

Měří, která reklama vede k návštěvě nebo objednávce, abychom neplatili za reklamy, které nic nepřinášejí.

Které cookies?
  • Google Ads přes Google Tag Manager (_gcl_au, _gcl_aw), až 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: partner, který vás k nám doporučil (partnerský program), 60 dní

4,6

Země a jazyk

Každá země má vlastní web s cenami a DPH dané země.

Zobrazit

Firewall s ufw a nftables

Modul 5: Zabezpečení sítě · Doba čtení: 12 min.

Cíl lekce: Po této lekci budete umět nastavit firewall, který povoluje jen to, co je nutné, pro IPv4 i IPv6, aniž byste se sami zablokovali, a budete vědět, před čím Vás firewall na serveru nechrání.

Klíčové pojmy: paketový filtr, netfilter, nftables, iptables-nft, ufw, výchozí politika, allow, deny, reject, limit, IPv6 v ufw, firewall poskytovatele, firewalld, Docker a firewall

Co dělá firewall

Firewall na Vašem serveru je paketový filtr: u každého příchozího síťového paketu se podívá do seznamu pravidel a rozhodne, zda smí projít. V Linuxu je tento filtr součástí jádra a jmenuje se netfilter. Nastavujete ho pomocí programu:

  • nftables (příkaz nft) je současný nástroj. Debian ho standardně používá od verze Debian 10.
  • iptables je starší nástroj. Na moderních systémech je iptables obvykle jen překlad do nftables (iptables-nft), aby staré návody stále fungovaly.
  • ufw (Uncomplicated Firewall) je jednoduchá vrstva nad tím, standardně přítomná v Ubuntu a v Debianu instalovatelná jedním příkazem. Pro jeden server je ufw nejsnazší volba. Tato lekce používá ufw a potom ukazuje, jak vypadají stejná pravidla v nftables.

Firewall je Vaše druhá obranná vrstva. První spočívá v tom, že služby naslouchají jen na správné adrese (lekce 5.1). Společně zajišťují, že chyba v jedné vrstvě hned neznamená otevřené dveře.

Nejdříve: jak se dostanete zpět, když se něco pokazí?

Klasická chyba: zapnete firewall, zapomenete povolit SSH a spojení se přeruší. Přes SSH se pak už nedostanete. Než začnete:

  1. Zjistěte, jak otevřít konzoli u svého poskytovatele (lekce 1.2). Funguje mimo síť, tedy i tehdy, když firewall vše zablokuje. Tam se přihlásíte a zadáte ufw disable.
  2. Pokud si nejste jistí, vytvořte snapshot.
  3. Nechte aktuální SSH relaci otevřenou a testujte ve druhé relaci.

ufw v pěti krocích

Krok 1: instalace a volba výchozího nastavení.

anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'

Výchozí politika platí pro vše, pro co neexistuje žádné pravidlo. "Deny incoming" znamená: vše příchozí je zakázáno, kromě toho, co následně povolíte. To je jediný bezpečný základ. Odchozí provoz (Váš server stahuje aktualizace) povolíte.

Krok 2: povolit SSH, ještě než firewall zapnete.

anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)

OpenSSH je aplikační profil, který ufw zná (odpovídá portu 22/tcp). Pokud SSH běží na jiném portu, použijte číslo: sudo ufw allow 2222/tcp. Všimněte si hlášení "Rules updated (v6)": ufw vytvoří pravidlo také pro IPv6. Dělá to proto, že v /etc/default/ufw je řádek IPV6=yes, což je výchozí stav. Raději to zkontrolujte; pokud je nastaveno no, platí Váš firewall jen pro IPv4.

Krok 3: co dalšího potřebujete.

anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp       # pouze pokud používáte HTTP/3

Pravidlo můžete omezit na jednu zdrojovou adresu, například pro administrační port, který smí být dostupný jen z Vaší kanceláře:

anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcp

Krok 4: zapnutí.

anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Krok 5: kontrola. Otevřete druhé okno a přihlaste se znovu. Pokud to funguje, je SSH nastavené správně. Potom si prohlédněte pravidla:

anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

Pravidlo odstraníte podle čísla: sudo ufw status numbered a pak sudo ufw delete 3.

deny, reject a limit

  • deny paket tiše zahodí: zvenku uvidíte "filtrováno" (lekce 5.1).
  • reject pošle zpět odmítnutí: zvenku uvidíte "zavřeno". Je to korektnější pro Vaše vlastní služby, ale prozradí to, že tam server je.
  • limit spojení povolí, ale zablokuje adresu, která se během 30 sekund pokusí připojit šestkrát nebo vícekrát. Hodí se pro SSH: sudo ufw limit OpenSSH místo allow. Je to hrubé opatření (počítá spojení, ne neúspěšná přihlášení); fail2ban (lekce 5.3) je přesnější.

Stejná pravidla v nftables

ufw na pozadí zapisuje pravidla do netfilteru. Pokud chcete pracovat bez ufw, napíšete si soubor pro nftables sami. V Debianu je uložen v /etc/nftables.conf a načítá ho služba nftables:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif "lo" accept
        meta l4proto { icmp, ipv6-icmp } accept
        tcp dport { 22, 80, 443 } accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Čtěte ho takto. Tabulka se jmenuje filter a patří do rodiny inet: jedna tabulka pro IPv4 i IPv6 zároveň, takže na IPv6 nemůžete zapomenout. V řetězci input je politika drop. Dále: odpovědi na již existující spojení smějí projít zpět (established,related), vše na loopbacku je povoleno, ICMP je povoleno (potřebné mimo jiné pro IPv6 a chybová hlášení o velikosti paketů) a povoleny jsou porty 22, 80 a 443.

anna@web1:~$ sudo nft -c -f /etc/nftables.conf    # zkontrolovat bez načtení
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list ruleset

Používejte buď ufw, nebo vlastní soubor nftables, ne obojí: oba zapisují do stejného netfilteru a mohou si navzájem překážet v pravidlech.

Před čím Vás firewall nechrání

  • Služby, které sami povolíte. Port 443 je otevřený pro Váš web; zranitelnost ve Vašem webu je tedy normálně dostupná. Firewall chrání jen porty, které jsou zavřené.
  • Docker. Když v Dockeru publikujete port (-p 5432:5432), Docker nastaví vlastní pravidla netfilteru, která přesměrují provoz dříve, než se uplatní pravidla ufw. Dokumentace Dockeru doslova uvádí, že Docker a ufw spolu dobře nefungují. Port kontejneru tak může být zvenku otevřený, i když ho ufw status nezobrazuje. Řešení (publikovat na 127.0.0.1) se naučíte v lekci 9.3.
  • Odchozí provoz. S "allow outgoing" se napadený program může připojit kamkoli. Pro většinu malých serverů je to přijatelná volba; přísná prostředí omezují i odchozí provoz.

Firewall Vašeho poskytovatele

Mnoho poskytovatelů má také firewall v síti, před Vaším serverem, který nastavujete v zákaznickém panelu (někdy se mu říká "cloud firewall" nebo "security group"). Je to výborná vrstva navíc a funguje i tehdy, když na samotném serveru něco nastavíte špatně. Firewall na serveru ale nenahrazuje: když server přesunete nebo změníte poskytovatele, nepřejde s ním, a ne každý poskytovatel ho nabízí. Proto mějte vždy firewall i přímo na serveru.

V AlmaLinuxu a Rocky Linuxu

Tam je standardně zapnutý firewalld se zónami. Nejdůležitější příkazy:

[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reload

Bez --permanent platí změna jen do příštího restartu; s --permanent platí až po --reload. SSH je ve výchozí zóně již otevřené.

V praxi

Pokud se přesto zablokujete na VPS u WebOké, otevřete na obrazovce VPS konzoli, přihlásíte se a firewall vypnete (ufw disable) nebo vrátíte poslední pravidlo. U jiných poskytovatelů se tento nouzový vstup jmenuje také konzole, VNC nebo rescue. Zjistěte si, kde to tlačítko je, dříve než ho budete potřebovat.

Shrnutí

  • Firewall je Vaše druhá vrstva po zásadě "naslouchat jen tam, kde je to nutné"; nftables je nástroj v jádře, ufw jednoduchá vrstva nad ním.
  • Začněte s default deny incoming, povolte SSH před ufw enable, testujte ve druhé relaci a znejte konzoli svého poskytovatele.
  • Zkontrolujte, že ufw pokrývá i IPv6 (IPV6=yes); v nftables to rodina inet zajistí najednou.
  • deny dává zvenku "filtrováno", reject dává "zavřeno"; limit brzdí opakovaná spojení.
  • Porty Dockeru obcházejí ufw (lekce 9.3); firewall poskytovatele je vrstva navíc, ne náhrada.

Kvíz

1. V jakém pořadí poprvé zapnete ufw na serveru, ke kterému jste přihlášeni přes SSH?



2. Po ufw enable přestane Váš web fungovat přes IPv4, ale SSH funguje. Co je nejpravděpodobnější příčina?



3. Pomocí Dockeru publikujete port 5432 databázového kontejneru. ufw status nezobrazuje žádné pravidlo pro 5432. Je databáze dostupná zvenku?



4. Proč příklad pro nftables používá tabulku z rodiny inet?



5. Váš poskytovatel má síťový firewall v zákaznickém panelu. Potřebujete pak ještě firewall na serveru?



Úkol

Úkol O5.2: Nastavení firewallu. Zapněte na svém serveru firewall pomocí ufw (nebo nftables, případně firewalld na AlmaLinux/Rocky): ve výchozím stavu vše příchozí zavřené, povolené SSH a to, co skutečně potřebujete. Otestujte to ve druhé relaci, zkontrolujte, zda je pokryto IPv6, a zvenku pomocí nc ověřte, že nepovolený port je zavřený nebo filtrovaný. Vyplňte kontrolní seznam a vložte výstup ufw status verbose (nebo nft list ruleset); u každého otevřeného portu uveďte, k čemu slouží.

Úkol O5.2: Nastavení firewallu

Tento úkol provádíte sami; nikdo ho nekontroluje. Odškrtněte, co jste udělali, a označte úkol jako splněný.



Vaše zaškrtnutí a poznámky zůstávají pouze v tomto prohlížeči; nikam je neposíláme. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol splnili.

Doporučujeme k přečtení

Chvíli strpení…

Nastavení vašich domén

U každé domény nastavte jmenné servery, propojení s hostingem a to, kdo bude držitelem.

Načítání vašich domén…