Hlavní navigace

Firewalld: vlastní zóna a práce se sadami adres

31. 1. 2023
Doba čtení: 5 minut

Sdílet

 Autor: Depositphotos
Firewalld rozděluje svět na takzvané zóny, které popisují různá síťová prostředí podle jejich důvěryhodnosti. Kromě zón se nám ale budou hodit také sady adres, které dovolují do zón různé části sítě zařazovat.

předchozím článku z našeho seriálu o Firewalld jsme si ukázali, jak vytvořit svou vlastní službu nebo upravit už existující. To se nám hodí, pokud chceme provozovat nějakou méně obvyklou službu nebo službu s nestandardní konfigurací. Dnes se podíváme na další komponenty, které ve Firewalld rozhodují o osudu různých síťových provozů.

Co se dozvíte v článku
  1. Připravené zóny
  2. Vlastní zóna
  3. Sady adres
  4. Příště

Připravené zóny

Už jsme si ukázali koncept zón i jejich přiřazování jednotlivým rozhraním. S Firewalld už přichází sada připravených zón, které mají předvolený název a připravenou konfiguraci. Liší se svou otevřeností, tedy předvolenými službami a otevřenými porty. Na svém systému si můžeme zóny prohlédnout:

# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

Ve výchozím stavu je jich devět a my si je můžeme seřadit a popsat právě podle zmíněné otevřenosti. Začneme nejpřísněji nastavenou zónou a skončíme tou nejotevřenější.

drop
Je zahazován veškerý příchozí provoz, nejsou na něj odesílány žádné odpovědi. Možná jsou pouze odchozí spojení.
block
Veškerý příchozí provoz je odmítán zprávami icmp-host-prohibited (IPv4) a icmp6-adm-prohibited (IPv6). Povolená jsou pouze spojení iniciovaná zevnitř systému.
public
Pro použití ve veřejných oblastech, kde není možné důvěřovat ostatním počítačům v místní síti. Jsou povolena jen vybraná příchozí spojení.
external
Pro použití ve vnější síti, kde opět nedůvěřujeme ostatním počítačům. Zóna je určena pro routery, protože má zapnutou maškarádu. Povolena jsou jen vybraná příchozí spojení.
dmz
Pro počítače v demilitarizované zóně, které jsou dostupné zvenčí a mají omezený přístup do vnitřní sítě. Jsou povolena vybraná příchozí spojení.
work
Pro pracovní prostředí, kde obvykle důvěřujete ostatním počítačům. Vybraná příchozí spojení jsou povolena.
home
Pro domácí prostředí, kde obvykle důvěřujete ostatním počítačům. Vybraná příchozí spojení jsou povolena.
internal
Pro vnitřní prostředí, kde obvykle důvěřujete ostatním počítačům. Vybraná příchozí spojení jsou povolena.
trusted
Pro důvěryhodná prostředí, kde nehrozí napadení od okolních počítačů. Veškerá síťová spojení jsou přijata.

Podobně jako u služeb, jsou i zóny uloženy v /usr/lib/firewalld/zones/  a případné uživatelské úpravy se provádějí v adresáři  /etc/firewalld/zones/, který má při načítání konfigurace přednost. Informace o konkrétní zóně si můžeme nechat jednoduše vypsat:

# firewall-cmd --info-zone=external

Vlastní zóna

V běžných situacích si vystačíme s předem připravenými zónami, pokud ale chceme konfiguraci rozšířit, můžeme si vytvořit vlastní oblasti zájmu. Můžeme to udělat ruční editací souborů ve formátu XML ve zmíněném adresáři, ale připravena je na to samozřejmě i utilita  firewall-cmd.

Můžeme si například vytvořit zónu s názvem web, kterou budeme používat na naší farmě webových serverů. Naše servery budou umět HTTP, HTTPS a SSH pro další konfiguraci. Vytvoříme si tedy novou zónu, přidáme jí popis a nakonfigurujeme její vlastnosti.

# firewall-cmd --permanent --new-zone=web
# firewall-cmd --permanent --zone=web --set-description="Zona pro webovy server"

Nejprve je potřeba rozhodnout, jaká bude výchozí politika naší zóny. Ta se nazývá target a říká, co se má stát s provozem, který nebyl explicitně povolen žádnou službou ani explicitním pravidlem. Varianty jsou: ACCEPT, DROP, REJECT a default. Tedy: povol, zahoď a odmítni. Poslední varianta default se chová stejně jako odmítnutí, ale zajistí povolení provozu ICMP.

V našem případě chceme nepovolený provoz prostě odmítat, proto nastavíme target na REJECT.

# firewall-cmd --permanent --zone=web --set-target=REJECT

Zbývá nám přidat do zóny vybrané služby. 

# firewall-cmd --permanent --zone=web --add-service=http
# firewall-cmd --permanent --zone=web --add-service=https
# firewall-cmd --permanent --zone=web --add-service=ssh

Nakonec nesmíme zapomenout znovu načíst konfiguraci firewallu a pak už si můžeme novou zónu prohlédnout.

# firewall-cmd --reload
# firewall-cmd --info-zone=web

Teď už stačí jen zónu přiřadit ke konkrétnímu síťovému rozhraní a ona se začne uplatňovat. Jak na to jsme si už dříve popsali.

Sady adres

Součástí firewallů v linuxovém jádře jsou už poměrně dlouho takzvané sady adres, kterým se anglicky říká IPSet. O jejich použití přímo v IPtables si můžete přečíst v samostatném článku. V zásadě jde ale o to, že se při konfiguraci snažíme šetřit počtem pravidel, protože jejich procházení nás stojí výkon.

Proto existují tyto sady, které dovolují uložit větší množství různých záznamů do hašovacích tabulek, takže práce s nimi je velmi rychlá. Dokážeme pak místo sekvenčního procházení pravidel položit otázku, zda se adresa nachází v dané sadě. Podle výsledku pak už jen rozhodneme o osudu daného provozu.

Tento koncept přebírá také Firewalld, který umožňuje ve své konfiguraci se sadami adres pracovat. Ty se opět ukládají do už zmíněných konfiguračních adresářů, které jsou ale ve výchozím stavu prázdné. Vytvoření sad je tedy na nás a jejich použití závisí na naší konkrétní situaci. Ukážeme si příklad s vytvořením IPSetu a jeho naplněním adresami.

Každá sada ve Firewalld může obsahovat různé druhy informací a jejich kombinace. Jednotlivé varianty si můžeme nechat vypsat:

# firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net

Jeden z typů musíme zvolit při zakládání nové sady. IP adresy tu máme dvojího typu: výchozím typem je IPv4, můžeme ale zvolit sadu adres IPv6. K tomu bychom museli vytvořit sadu s volbou --option=family=inet6. My si teď připravíme sadu IP adres z privátních rozsahů, definovaných v RFC 1918.

# firewall-cmd --permanent --new-ipset=privatni --type=hash:net

Nyní můžeme do sady průběžně přidávat adresy nebo jejich rozsahy.

# firewall-cmd --permanent --ipset=privatni --add-entry=192.168.0.0/24

Druhou možností je uložit jednotlivé záznamy do textového souboru, na každý řádek jednu adresu nebo rozsah. Poté můžeme do sady tyto informace načíst naráz jedním příkazem.

# firewall-cmd --permanent --ipset=privatni --add-entries-from-file=adresy.txt

Informace uložené v dané sadě si pak můžeme zobrazit. Pokud bychom je chtěli mazat, můžeme použít podobné parametry --remove-entry nebo  --remove-entries-from-file.

root_podpora

# firewall-cmd --permanent --ipset=privatni --get-entries
10.0.0.0/8
172.16.0.0/12
192.168.0.0/24

Použití IPsetů

Takto vytvořenou sadu můžeme použít k označení zdroje provozu, který pak bude odbaven v dané zóně bez ohledu na rozhraní. Můžeme například k zóně trusted přidat svou novou sadu privátních adres, kterým ve své síti věříme. Takto je možné přidávat jednotlivé adresy či rozsahy, ale pokud k volbě přidáme ipset:, firewall pochopí, že nejde o jednu položku, ale hledat se bude v celé sadě.

# firewall-cmd --permanent --zone=trusted --add-source=ipset:privatni
# firewall-cmd --reload
# firewall-cmd --info-zone=trusted
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: ipset:privatni
…

Příště

V dalším díle našeho seriálu se budeme se zabývat typy ICMP, helpery (pomocníky) a zápisem takzvaných bohatých (rich) pravidel.

Byl pro vás článek přínosný?

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í.