Modul 5 · 5.2
Slovenčina
Firewall s ufw a nftables
Modul 5: Ochrana siete · Čas čítania: 12 minút
Cieľ lekcie: Po tejto lekcii dokážete nastaviť firewall, ktorý povoľuje iba to, čo je potrebné, pre IPv4 aj IPv6, bez toho, aby ste sa zablokovali. Budete tiež vedieť, pred čím vás firewall na serveri nechráni.
Kľúčové pojmy: paketový filter, netfilter, nftables, iptables-nft, ufw, predvolená politika, allow, deny, reject, limit, IPv6 v ufw, firewall poskytovateľa, firewalld, Docker a firewall
Čo robí firewall
Firewall na vašom serveri je paketový filter: pri každom prichádzajúcom sieťovom pakete prejde zoznam pravidiel a rozhodne, či paket pustí ďalej. V Linuxe je tento filter súčasťou jadra a volá sa netfilter. Nastavuje sa pomocou programu:
- nftables (príkaz
nft) je súčasný nástroj. Debian ho štandardne používa od verzie Debian 10. - iptables je starší nástroj. Na moderných systémoch je
iptableszvyčajne prekladom do nftables (iptables-nft), takže staré návody stále fungujú. - ufw (Uncomplicated Firewall) je jednoduchá vrstva nad tým, štandardne prítomná v Ubuntu a v Debiane sa dá nainštalovať jedným príkazom. Pre jeden server je ufw najjednoduchšou voľbou. Táto lekcia používa ufw a potom ukáže, ako vyzerajú rovnaké pravidlá v nftables.
Firewall je vaša druhá obranná vrstva. Prvou je to, že služby počúvajú iba na správnej adrese (lekcia 5.1). Spolu zabezpečia, že chyba v jednej vrstve neznamená hneď otvorené dvere.
Najprv: ako sa dostanete späť, keď sa niečo pokazí?
Klasická chyba: zapnete firewall, zabudnete povoliť SSH a spojenie sa preruší. Cez SSH sa potom už na server nedostanete. Skôr než začnete:
- Zistite, ako otvoriť konzolu vášho poskytovateľa (lekcia 1.2). Funguje mimo siete, teda aj vtedy, keď firewall všetko zablokuje. Tam sa prihlásite a zadáte
ufw disable. - Ak máte pochybnosti, vytvorte snapshot.
- Nechajte aktuálnu reláciu SSH otvorenú a testujte v druhej relácii.
ufw v piatich krokoch
Krok 1: inštalácia a výber predvolených 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'Predvolená politika platí pre všetko, pre čo neexistuje pravidlo. "Deny incoming" znamená: všetko prichádzajúce je zakázané okrem toho, čo následne povolíte. To je jediný bezpečný základ. Odchádzajúcu prevádzku (server, ktorý sťahuje aktualizácie) povolíte.
Krok 2: povolenie SSH ešte pred zapnutím firewallu.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH je aplikačný profil, ktorý ufw pozná (zodpovedá portu 22/tcp). Ak SSH beží na inom porte, použite jeho číslo: sudo ufw allow 2222/tcp. Všimnite si "Rules updated (v6)": ufw vytvorí pravidlo aj pre IPv6. Robí to preto, lebo v /etc/default/ufw je riadok IPV6=yes, čo je predvolené nastavenie. Overte si to; ak je tam no, váš firewall platí iba pre IPv4.
Krok 3: čo ďalšie potrebujete.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # iba ak používate HTTP/3Pravidlo môžete obmedziť na jednu zdrojovú adresu, napríklad pre správcovský port, ktorý má byť dostupný iba z vašej kancelárie:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpKrok 4: zapnutie.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupKrok 5: kontrola. Otvorte druhé okno a prihláste sa znova. Ak sa to podarí, SSH je nastavené správne. Potom si pozrite pravidlá:
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 odstránite pomocou čísel: sudo ufw status numbered a potom sudo ufw delete 3.
deny, reject a limit
- deny paket potichu zahodí: zvonku vidíte "filtrovaný" (lekcia 5.1).
- reject pošle späť odmietnutie: zvonku vidíte "zatvorený". Pre vlastné služby je to korektnejšie, ale prezrádza to, že tam je server.
- limit spojenie povolí, ale zablokuje adresu, ktorá sa v priebehu 30 sekúnd pokúsi pripojiť šesťkrát alebo viackrát. Hodí sa pre SSH:
sudo ufw limit OpenSSHnamiestoallow. Je to hrubé opatrenie (počíta spojenia, nie neúspešné prihlásenia); fail2ban (lekcia 5.3) je presnejší.
Rovnaké pravidlá v nftables
ufw na pozadí zapisuje pravidlá do netfiltra. Ak chcete pracovať bez ufw, napíšete si vlastný súbor nftables. V Debiane je uložený v /etc/nftables.conf a načítava 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;
}
}Čítajte ho takto. Tabuľka sa volá filter a patrí do rodiny inet: jedna tabuľka pre IPv4 aj IPv6 súčasne, takže na IPv6 nemôžete zabudnúť. V reťazci input je politika drop. Ďalej: odpovede na už existujúce spojenia môžu prejsť späť (established,related), všetko na loopbacku je povolené, ICMP je povolené (potrebné okrem iného pre IPv6 a chybové hlásenia o veľkosti paketov) a povolené sú porty 22, 80 a 443.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # skontrolovať bez načítania
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetPoužívajte buď ufw, alebo vlastný súbor nftables, nie oboje: obe zapisujú do toho istého netfiltra a ich pravidlá si môžu navzájom prekážať.
Pred čím vás firewall nechráni
- Služby, ktoré sami povolíte. Port 443 je otvorený pre váš web; zraniteľnosť vo vašom webe je teda normálne dostupná. Firewall chráni iba porty, ktoré sú zatvorené.
- Docker. Keď v Dockeri zverejníte port (
-p 5432:5432), Docker nastaví vlastné pravidlá netfiltra, ktoré presmerujú prevádzku skôr, než sa uplatnia pravidlá ufw. Dokumentácia Dockeru doslova uvádza, že Docker a ufw spolu dobre nefungujú. Port kontajnera teda môže byť zvonku otvorený, hoci houfw statusnezobrazuje. Riešenie (zverejnenie na127.0.0.1) sa naučíte v lekcii 9.3. - Odchádzajúca prevádzka. Pri "allow outgoing" sa napadnutý program môže pripojiť kamkoľvek. Pre väčšinu malých serverov je to prijateľná voľba; prísne prostredia obmedzujú aj odchádzajúcu prevádzku.
Firewall vášho poskytovateľa
Mnohí poskytovatelia majú aj firewall v sieti, pred vaším serverom, ktorý nastavíte v klientskom paneli (niekedy sa nazýva "cloud firewall" alebo "security group"). Je to výborná dodatočná vrstva a funguje aj vtedy, keď na samotnom serveri niečo nastavíte nesprávne. Firewall na serveri však nenahrádza: ak server presťahujete alebo zmeníte poskytovateľa, nepresunie sa s ním, a nie každý poskytovateľ ho ponúka. Preto majte vždy firewall aj priamo na serveri.
Na AlmaLinux a Rocky Linux
Tam je štandardne zapnutý firewalld so zónami. Najdôležitejšie príkazy:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadBez --permanent platí zmena iba do najbližšieho reštartu; s --permanent začne platiť až po --reload. SSH je v predvolenej zóne už otvorené.
V praxi
Ak sa vám napriek tomu stane, že sa na VPS vo WebOké zablokujete, otvorte v obrazovke VPS konzolu, prihláste sa a vypnite firewall (ufw disable) alebo vráťte posledné pravidlo. U iných poskytovateľov sa tento núdzový vstup nazýva tiež konzola, VNC alebo rescue. Zistite si, kde je toto tlačidlo, skôr než ho budete potrebovať.
Zhrnutie
- Firewall je vaša druhá vrstva po zásade "počúvať iba tam, kde je to potrebné"; nftables je nástroj v jadre, ufw jednoduchá vrstva nad ním.
- Začnite s
default deny incoming, povoľte SSH predufw enable, testujte v druhej relácii a poznajte konzolu svojho poskytovateľa. - Overte, že ufw pokrýva aj IPv6 (
IPV6=yes); v nftables to naraz zabezpečí rodinainet. denydáva zvonku "filtrovaný",rejectdáva "zatvorený";limitbrzdí opakované spojenia.- Porty Dockeru obchádzajú ufw (lekcia 9.3); firewall poskytovateľa je dodatočná vrstva, nie náhrada.
Kvíz
Úloha
Úloha O5.2: Nastavenie firewallu. Zapnite na svojom serveri firewall pomocou ufw (alebo nftables, prípadne firewalld na AlmaLinux/Rocky): predvolene všetko prichádzajúce zatvorené, SSH a to, čo ďalšie skutočne potrebujete. Otestujte to v druhej relácii, overte, či je pokryté IPv6, a zvonku pomocou nc skontrolujte, či je nepovolený port zatvorený alebo filtrovaný. Vyplňte kontrolný zoznam a vložte výstup ufw status verbose (alebo nft list ruleset); pri každom otvorenom porte uveďte, na čo slúži.
Úloha O5.2: Nastavenie firewallu
Túto úlohu vykonávate sami, nikto ju nekontroluje. Odškrtnite, čo ste urobili, a označte úlohu ako splnenú.
Pre webový server iba 22 (alebo váš port SSH), 80 a 443, pre IPv4 aj IPv6. Administračné porty iba z pevnej adresy alebo cez tunel SSH. Cez konzolu: ufw disable (alebo vyprázdniť pravidlá nftables).
Vaše zaškrtnutia a poznámky zostávajú iba v tomto prehliadači, nikam ich neposielame. Po prihlásení si v sekcii Moje kurzy uchovávame iba to, že ste úlohu splnili.
Ďalšie čítanie
- Zabezpečenie VPS: prvých päť minút
- Žiadny prístup k VPS: čo teraz?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Dokumentácia Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Dokumentácia Dockeru, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
