V předchozím článku z našeho seriálu o Firewalld jsme si ukázali, jak spravovat jednotlivá zařízení, přiřazovat je do zón a stanovovat pravidla pro průchod komunikace mezi nimi. K tomu můžeme použít pravidla pro otevření konkrétních portů, ale systémovější a příjemnější je použití takzvaných služeb.
Co se dozvíte v článku
To jsou předem připravené šablony, které obsahují všechny potřebné informace pro otevření cesty konkrétnímu typu provozu. Služby pro celou řadu běžně používaných protokolů máme už v systému nainstalované. Stačí je tedy přiřadit k vybraným zónám a máme vyhráno. Co ale dělat, když chceme provozovat něco s méně obvyklým nasazením nebo dokonce něco úplně nestandardního?
O adresářích
Služby je tvořeny soubory ve formátu XML, které jsou uloženy v adresáři /usr/lib/firewalld/services/
. Tam je uložil při instalaci balíčkovací systém a budou se tu také případně aktualizovat. V tomto adresáři tedy neprovádějte změny, protože by byly přepsány příští aktualizací. Můžeme se tu ale krásně inspirovat při vytváření či úpravách služeb.
Obsah tohoto adresáře je také používán jako záloha původního stavu. Pokud budete ve svých službách později provádět nějaké změny a rozhodněte se vrátit k původnímu stavu, stačí vlastní úpravy odstranit a Firewalld se poslušně vrátí na začátek. Je proto ale potřeba mu původní konfiguraci v tomto adresáři zachovat.
Uživatelská konfigurace služeb se nachází v adresáři /etc/firewalld/services/
a má přednost před výše zmíněným systémovým úložištěm. Pokud sem uložíme službu se stejným názvem, jaký už systém zná, bude původní podoba ignorována a do hry vstoupí naše konfigurace. Pokud následně svou podobu služby odstraníme, utilita ji přidá příponu .xml.old
a Firewalld začne soubor ignorovat. Tím se vrátí k původnímu systémovému konfiguračnímu souboru.
Vytvoření nové služby
Služba vznikne tak, že založíme nový soubor v adresáři /etc/firewalld/services/
. Můžeme to samozřejmě udělat i manuálně, pokud nám někdo například dodá hotovou podobu služby nebo už jsme ji udělali jinde a chceme ji přenést na další stroje.
Utilita firewall-cmd
k tomu také má příslušné parametry, takže to můžeme udělat pohodlně přímo na řádce, aniž bychom se museli přímo zajímat o formát souboru samotného. Základem je vytvoření souboru, který musíme nějak rozumně pojmenovat. Jméno souboru je pak použito i jako název služby, takže jej uvidíme například ve výpisech informací o rozhraní.
Ukážeme si konkrétní příklad vytvoření nové služby. Takovou službou může být například Home Assistant, který používá TCP port 8123. Vytvoříme mu tedy službu otevírající daný port. Začneme založením nové služby.
# firewall-cmd --permanent --new-service=home-assistant success
Založení souboru proběhlo úspěšně, což je nám proti unixovým zvyklostem také oznámeno. Stejnou hlášku vypíšou i další podobné příkazy, proto ji už nebudu v článku opakovat.
Soubor se službou je v tuto chvíli téměř prázdný a pro správnou funkci jej potřebujeme naplnit:
# cat /etc/firewalld/services/home-assistant.xml <?xml version="1.0" encoding="utf-8"?> <service> </service>
Můžeme použít všechny vlastnosti, které jsme si popsali v předchozím článku. Nám bude stačit jen doplnit popis a povolený port.
# firewall-cmd --permanent --service=home-assistant --set-description="Home Assistant" # firewall-cmd --permanent --service=home-assistant --set-short=ha # firewall-cmd --permanent --service=home-assistant --add-port=8123/tcp
Nyní je soubor naplněný základními vlastnostmi a můžeme službu začít používat.
# cat /etc/firewalld/services/home-assistant.xml <?xml version="1.0" encoding="utf-8"?> <service> <short>ha</short> <description>Home Assistant</description> <port port="8123" protocol="tcp"/> </service>Ú
Úprava stávající služby
Máme samozřejmě možnost také upravit stávající službu tak, že ji zkopírujeme z původního umístění do uživatelsky editovatelného adresáře.
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
Jak už bylo řečeno, druhý jmenovaný adresář má přednost, takže změny v kopii souboru ssh.xml
se nám v systému projeví. Pokud se budeme chtít vrátit k původní verzi, stačí soubor z /etc/firewalld/services/
jednoduše smazat nebo můžeme použít příkaz, který ho deaktivuje přidáním přípony .old
.
# firewall-cmd --permanent --delete-service=ssh
Pozor na reload
Pokud jste průběžně zkoušeli vypisovat například seznam existujících služeb, narazili jste na to, že naše nová služba ještě není v systému zavedena. To proto, že jsme zatím pracovali pouze na disku a Firewalld nemá naši novou službu v paměti. Popisovali jsme to hned v úvodním článku.
Abychom službu dostali do aktivního stavu, musíme ještě načíst konfiguraci. To provedeme jednoduše příkazem pro reload:
# firewall-cmd --reload
V tuto chvíli už je vše zavedeno a připraveno k použití. Přesvědčíme se, že je home-assistant
mezi zavedenými službami.
# firewall-cmd --get-services|grep -o home-assistant home-assistant
Můžeme se teď také zeptat na nastavení dané služby, jak jsme už zvyklí.
# firewall-cmd --info-service=home-assistant home-assistant ports: 8123/tcp protocols: source-ports: modules: destination: includes: helpers:
Přidání nové služby do zóny
Nyní máme možnost přidat novou službu do zóny. Řekněme, že nechceme otevírat službu do veřejné sítě (zóna public
), ale chceme ji otevřít jen do domácí sítě (zóna home
). Protože už z minula máme vytvořené domácí síťové rozhraní a přiřadili jsme si k němu i zónu, stačí teď už jen jeden jednoduchý příkaz pro zapsání změny a poté znovu reload.
# firewall-cmd --permanent --zone=home --add-service=home-assistant # firewall-cmd --reload
Můžeme se přesvědčit, že se vše povedlo a příslušná zóna obsahuje novou službu:
# firewall-cmd --info-zone=home home (active) target: default icmp-block-inversion: no interfaces: enp0s8 sources: services: cockpit dhcpv6-client home-assistant mdns samba-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Příště
Příště si povíme o dalších užitečných komponentách Firewalld. Ukážeme si, jak se spravují zóny, jak si vytvořit svou vlastní a jak používat sady pravidel nazvané IPSet. Ty dovolují ukládat do firewallu například skupiny IP či MAC adres.