Hlavní navigace

Firewalld: vytvoření své vlastní služby či úprava té stávající

24. 1. 2023
Doba čtení: 4 minuty

Sdílet

 Autor: Depositphotos
Těžiště Firewalld je v principu takzvaných služeb, tedy jakýchsi připravených šablon k okamžitému použití. Ty umožňují snadno propustit vybraný provoz. Ukážeme si, jak se službami pracovat a vytvořit vlastní.

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.

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.

ICTS23

# 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. Budeme se zabývat typy ICMP, helpery (pomocníky), IPsety a nízkoúrovňovým přístupem k podkladovému firewallu v jádře.

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.