Modul 2 — Sítě a protokoly
11. Firewally a základní síťová bezpečnost (iptables/ufw)
Princip firewallů na Linuxu, filtrování provozu podle pravidel a praktická konfigurace pomocí ufw a iptables/nftables.
Úvod a kontext
Server, který naslouchá na síti, je potenciálním cílem útoku — čím víc
otevřených portů a služeb, tím větší tzv. útočná plocha (attack
surface). Firewall (síťová brána firewall) je základní nástroj, kterým
DevOps inženýr omezuje síťovou komunikaci jen na to, co je skutečně
potřeba: povolí SSH správcům, HTTP/HTTPS veřejnosti, ale zablokuje
přístup k interní databázi zvenčí. Tato lekce navazuje na lekce o
TCP/IP a portech a ukáže, jak firewall na Linuxu nakonfigurovat pomocí
ufw (jednoduché rozhraní vhodné pro většinu serverů) i pomocí
nižšího iptables/nftables.
Teorie
Co firewall dělá
Linuxový firewall pracuje na úrovni jádra (subsystém netfilter) a
rozhoduje o každém síťovém paketu podle sady pravidel — pustit
(ACCEPT), zahodit potichu (DROP), nebo zahodit s oznámením odesílateli
(REJECT). Pravidla se typicky vyhodnocují v pořadí shora dolů a první
shoda rozhoduje (přesné chování závisí na konkrétním nástroji a
řetězci pravidel).
Směry provozu: INPUT, OUTPUT, FORWARD
Klasický model iptables rozlišuje tři základní řetězce (chains):
- INPUT — provoz směřující do tohoto stroje (např. příchozí
SSH spojení). - OUTPUT — provoz odcházející z tohoto stroje (např. server
volající externí API). - FORWARD — provoz, který tímto strojem jen prochází — relevantní
pro stroje fungující jako router/brána mezi sítěmi (typicky ne pro
běžný aplikační server).
Většina konfigurace serveru se soustředí na řetězec INPUT — kontrolu
toho, kdo se k serveru smí připojit a na jaký port.
Princip výchozí politiky (default deny)
Doporučená bezpečnostní praxe je default deny: výchozí politika
je "zamítnout vše" a explicitně se povolí jen porty/služby, které mají
být dostupné. Opačný přístup ("povolit vše, blokovat jen známé
problémy") je mnohem náchylnější k tomu, že se omylem nechá otevřená
zbytečná služba.
Stavová filtrace (stateful firewall)
Moderní firewally jsou stavové — sledují stav TCP spojení (nové,
navázané, související) a umožňují snadno vyjádřit pravidlo typu "povol
odpovědi na spojení, která jsme sami navázali, i když příchozí port
není explicitně otevřený". To umožňuje třeba serveru dělat odchozí
HTTPS požadavky (např. stahovat balíčky), aniž byste museli ručně
povolovat každý možný odpovědní port.
ufw vs. iptables/nftables
- iptables (a jeho nástupce nftables) je nízkoúrovňové
rozhraní přímo k netfilter — velmi flexibilní, ale syntakticky
neforgivingí a snadné je udělat chybu. - ufw (Uncomplicated Firewall) je zjednodušená nadstavba nad
iptables/nftables, běžná na Ubuntu/Debianu — pro typický server
(povolit SSH, HTTP, HTTPS, zbytek zakázat) je rychlejší a méně
chybová volba. - Cloudové platformy navíc často mají vlastní vrstvu firewallu na
úrovni infrastruktury (AWS Security Groups, GCP Firewall Rules) —
ty fungují nezávisle na firewallu uvnitř operačního systému a v
praxi se často kombinují (firewall na úrovni cloudu jako první
obranná linie,ufw/iptablesna serveru jako druhá).
Praktický příklad
Základní nastavení ufw na čerstvém serveru — nejdřív se musí
povolit SSH, jinak si administrátor po zapnutí firewallu sám zablokuje
přístup:
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
$ sudo ufw allow OpenSSH # nebo: sudo ufw allow 22/tcp
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw enable
Firewall is active and enabled on system startup
$ sudo ufw status verbose
Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
Omezení přístupu jen z konkrétní IP adresy (typicky pro administrativní
porty nebo interní služby, např. databázi dostupnou jen z aplikačního
serveru):
$ sudo ufw allow from 203.0.113.5 to any port 5432 proto tcp
Odebrání pravidla a vypnutí konkrétního portu:
$ sudo ufw delete allow 8080/tcp
Ekvivalentní logika přímo v iptables (pro srovnání, jak vypadá na
nižší úrovni) — nastavení výchozí politiky deny a povolení SSH, HTTP,
HTTPS a už navázaných spojení:
$ sudo iptables -P INPUT DROP
$ sudo iptables -A INPUT -i lo -j ACCEPT
$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Uložení pravidel, aby přežila restart (na Debian/Ubuntu)
$ sudo apt install iptables-persistent
$ sudo netfilter-persistent save
Řádek -i lo -j ACCEPT je důležitý — povoluje veškerý provoz na
loopback rozhraní (127.0.0.1), který používají lokální služby mezi
sebou (např. aplikace připojující se k databázi na localhost) a
neměl by být blokován.
Rychlá diagnostika, jestli je problém "port zablokovaný firewallem" vs.
"služba vůbec neběží": pokud ss -tulpn na serveru ukazuje, že služba
naslouchá, ale nc -zv zvenčí selže, je vysoce pravděpodobné, že
firewall (na serveru nebo v cloudové vrstvě) daný port blokuje.
Shrnutí
Firewall filtruje síťový provoz podle pravidel na úrovni portů,
protokolů a zdrojových/cílových adres a je základní obrannou linií
serveru. Doporučená praxe je výchozí politika "deny" s explicitním
povolením jen potřebných služeb, přičemž stavová filtrace umožňuje
bez komplikací povolit odpovědi na spojení navázaná samotným serverem.
Nástroj ufw nabízí jednoduché rozhraní nad iptables/nftables pro
běžné případy; cloudové platformy navíc přidávají vlastní vrstvu
firewallu na úrovni infrastruktury.
Kontrolní otázky
- Co znamená princip "default deny" a proč je bezpečnější než
"default allow"? - Jaké tři standardní řetězce rozlišuje iptables a který z nich je
nejrelevantnější pro běžný aplikační server? - Proč je nutné povolit provoz na rozhraní
lo(loopback) i při
striktním firewallu? - Server má
ss -tulpnukazuje naslouchající službu na portu 443, ale
klient zvenčí se přesnc -zv server 443nemůže připojit. Jaké je
nejpravděpodobnější vysvětlení a jak byste to ověřili?
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.