Konfigurace firewallu bývá pro mnoho začátečníků neřešitelným problémem. Všechna ta pravidla, řetězce a složitá syntaxe působí jako neprostupná džungle. Pokud se takový začínající uživatel ponoří do pravidel klasických IPtables nebo moderních Nftables, rychle se ztratí a neví si rady. Existují ale řešení, která se umí o práci s pravidly postarat a ulehčit tím správci život.
Co se dozvíte v článku
Jedním z těchto řešení je i Firewalld, což je nástroj pro správu firewallu, který je postavený na zónách. To jsou logické oblasti našeho zájmu, které se liší úrovní důvěry síťového rozhraní nebo spojení. Dovoluje to přemýšlet nad firewallem přirozeným způsobem dle rozdělení sítě: tady mám sítě A a B a potřebuji mezi nimi povolit tento typ provozu.
Poznámka: Přes svůj název není projekt Firewalld nijak přímo spojen se Systemd, není na něm závislý a ke svému běhu ho nepotřebuje. Poběží vám tudíž bez potíží i s jiným init systémem. Písmeno d na konci odkazuje na to, že jde o démona běžícího v uživatelském prostoru.
Firewalld stojí z hlediska uživatele před skutečným firewallem v linuxovém jádře, který stále zůstává výkonným prvkem. Uživatelský démon jen nabízí jednodušší způsob konfigurace, automatické vytváření pravidel, dynamickou správu firewallu a integraci s dalšími službami. Je tedy vlastně abstrakcí nad nízkoúrovňovými firewallovými pravidly. V pozadí ale stále stojí tradiční firewall, což byl dříve IPtables, od verze 0.6.0 z roku 2018 je výchozím používaným firewallem Nftables.
Požadavky na provoz
Firewalld je výchozím rozhraním pro správu firewallu v distribucích používajících balíčkovací systém RPM. Najdeme jej tedy v RHEL od verze 7, stejně jako CentOS 7, Fedora 18, (open)SUSE 15 a podobně. Do ostatních distribucí není problém ho doinstalovat, obvykle je připraven balíček v příslušném repozitáři.
Nemá žádné zásadní požadavky na provoz, vyžaduje jen DBus, Python 3 a některé jeho moduly pro práci s firewallem. Instalace je tedy velmi jednoduchá i v distribucích, které ho nemají ve výchozím stavu nainstalované. Všechny následující ukázky budou probíhat v Rocky Linuxu aktuální verze 9.1, což je klon Red Hat Enterprise Linuxu. V něm je Firewalld ve výchozím stavu nainstalován.
Poznámka: Firewalld se ujme vlády a nikdo další by mu do toho neměl mluvit. Proto je nutné deaktivovat všechna ostatní konkurenční řešení (třeba v Ubuntu je to UFW) a upustit od snah manuálně zasahovat do konfigurace firewallu v jádře. Výsledky takové míchanice by byly nepředvídatelné.
Základní koncepty
Firewalld dělí celé síťové prostředí na jednotlivé logické zóny. Do každé zóny je přiděleno alespoň jedno síťové rozhraní. Pomocí pravidel je pak určeno, který typ provozu může procházet mezi těmito zónami. Ovlivňovat je možné všechny typy provozu, tedy vstup, výstup nebo třeba překlad adres (NAT).
Pro provoz platí, že vždy vystupuje právě z jedné zóny a vždy vstupuje právě do jedné zóny. Každá zóna představuje určitou úroveň důvěry a pravidla pak rozhodují o povolených interakcích mezi těmito zónami. Některé zóny jsou předdefinované a najdeme je v /usr/lib/firewalld/zones/.
Konfigurace probíhá pomocí příkazu firewall-cmd a pokud je firewall právě vypnutý (démon neběží), můžeme pravidla definovat pomocí firewall-offline-cmd. Firewalld totiž rozlišuje mezi perzistentním stavem uloženým na disku a právě zavedenými a používanými pravidly. Pokud je démon neaktivní, stále můžeme zasahovat do jeho konfigurace.
Uložená vs. běžící pravidla
Firewalld rozlišuje mezi tím, která pravidla jsou právě nasazená (dočasná) a která jsou uložená v konfiguraci (perzistentní). Většina příkazů mění jen právě běžící sadu pravidel, takže provedené změny nepřežijí restart systému. Máme ovšem možnost to změnit jedním ze dvou způsobů.
Můžeme příkazy zapisovat s parametrem --permanent a tím je ukládat do konfigurace. Nezmění to ovšem aktuální rozpoložení firewallu, pro to pak musíme dodatečně zavolat parametr --reload. Tím se změny uložené na disku načtou také do paměti a použjí.
Druhou variantou je naopak měnit běžným způsobem jen aktuální stav a pokud nám v určitou chvíli vyhovuje a chceme ho zachovat, můžeme se postarat o jeho uložení pomocí parametru --runtime-to-permanent. Tím se změny z paměti uloží natrvalo na disk a po restartu se znovu zavedou.
Prohlídka aktuálního stavu
Nastal čas si prohlédnout výchozí stav našeho systému. Na začátku se můžeme podívat, jaké zóny máme v systému aktivní:
# firewall-cmd --get-active-zones public interfaces: enp0s3
Zatím toho příliš mnoho není, máme jen jedno síťové rozhraní a to je zařazeno do jedné zóny. Můžeme se podívat, která zóna je výchozí. Do té jsou zařazována nově přidaná rozhraní, pokud neřekneme jinak:
# firewall-cmd --get-default-zone public
Není překvapením, že je to zóna public. Velmi užitečný je následující příkaz, který nám vypíše všechny informace o zóně. Tu můžeme explicitně určit pomocí parametru --zone= a pokud tak neučiníme, uvidíme výstup pro výchozí zónu:
# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s3 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Vidíme kompletní výpis informací o zóně, ve kterém můžeme vyčíst zařazená rozhraní, vložené služby a další detaily, ke kterým se postupně také dostaneme. Pokud bychom chtěli vidět úplně všechny zóny (včetně neaktivních), můžeme použít parametr --list-all-zones.
Ve výpisu je vidět seznam služeb, které jsou v dané zóně povolené. Pro přímé použití je jich připravených poměrně hodně, v čisté instalaci systému jich mám 192. Můžeme si je opět nechat vypsat, tentokrát v seznamu abecedně seřazených položek oddělených mezerami:
# firewall-cmd --get-services RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client…
Asi nás bude zajímat, co je obsahem nastavení pro danou službu. Na podrobnosti se můžeme opět podívat:
# firewall-cmd --info-service ssh ssh ports: 22/tcp protocols: source-ports: modules: destination: includes: helpers:
Z těchto výpisů je jasné, že naše jediné síťové rozhraní je v zóně public, ve které máme otevřené jen tři služby, mezi nimi například ssh. Jsme tedy schopni se teď k serveru přihlásit pomocí SSH, protože máme otevřený příslušný port.
Příště
V následujícím článku se naučíme měnit nastavení firewallu, přidat síťové rozhraní do zóny a ovlivňovat povolené služby. Začneme tak stavět svůj vlastní firewall pomocí Firewalld.