Příchozí provoz podle zdroje
Co se dozvíte v článku
Zatím jsme si v našem seriálu ukazovali jen zpracování provozu v zónách rozdělených podle síťových rozhraní. Do zón můžeme posílat provoz vybraný také podle jiných kritérií. Typickým příkladem je rozlišení zdrojové IP adresy. Můžeme se tak rozhodnout, že na provoz pocházející z důvěryhodných adres budeme aplikovat pravidla v konkrétní zóně.
# firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24 # firewall-cmd --reload
Takto můžeme samozřejmě uvést více zdrojů. Všechny pak budou vidět ve výpisu dané zóny:
# firewall-cmd --zone=trusted --list-all trusted (active) target: ACCEPT icmp-block-inversion: no interfaces: sources: 192.168.1.0/24 10.1.2.0/24 …
Dále máme možnost přidat mezi zdroje konkrétní port, včetně použitého protokolu. Opět je možné zvolit více portů:
# firewall-cmd --permanent --zone=trusted --add-source-port=443/tcp # firewall-cmd --reload
Porty se objeví v příslušné položce ve výpisu zóny:
# firewall-cmd --zone=trusted --list-all trusted (active) target: ACCEPT … source-ports: 443/tcp 80/tcp …
Položky můžeme zase odebírat pomocí parametrů --remove-source
a --remove-source-port
. Tímto způsobem můžeme například vytvořit zónu s výchozí politikou default, do této zóny zařadíme konkrétní IP adresu či rozsah a pro tyto zdroje povolíme jen vybrané služby.
Pokud potřebujeme takto označit větší množství různých zdrojů, budou se nám hodit sady adres, které jsme si v seriálu už popisovali dříve. Ty mohou být několika typů a mohou obsahovat velké množství rychle prohledávatelných položek.
Překlad adres
Firewalld nabízí několik různých režimů překladu adres: maškaráda (masquerade), cílový překlad (DNAT) a přesměrování. Zatímco maškaráda a SNAT se používají pro odchozí provoz, přesměrování a DNAT slouží pro příchozí provoz.
V odchozím směru obvykle potřebujeme přeložit privátní adresy na veřejnou (či veřejné) na vnějším rozhraní. Naopak u příchozího směru nás zajímá přepis cílové adresy, jímž zajistíme přesměrování provozu na jiný cílový port nebo adresu, na které služba skutečně běží.
Následující příklady předpokládají, že nasazujeme Firewalld na směrovač (router), který propojuje vnější a vnitřní síť. Řekněme, že náš směrovač používá dvě síťová rozhraní, vnitřní síti je přiřazena zóna internal
, vnější pak external
. Aby nám předávání provozu mezi rozhraními fungovalo, musíme ještě zapnout forwarding:
# sysctl -w net.ipv4.ip_forward=1
Maškaráda (NAT)
Tento režim má za úkol v odchozím směru přepsat zdrojovou adresu na adresu vnějšího rozhraní. Pokud tedy ve své vnitřní síti přidělujete adresy z privátního rozsahu, musíte je před předáním provozu poskytovateli připojení přepsat na adresu přidělenou vnějšímu rozhraní.
Maškaráda sama zjišťuje IP adresu odchozího rozhraní, na kterou má přepisovat hlavičky jednotlivých paketů. Tím je její konfigurace jednodušší, protože nemusíme adresu explicitně uvádět. V tomto režimu navíc není problémem to, že se adresa na vnějším rozhraní změní, protože maškaráda si ji sama zjistí a přizpůsobí se.
Zapnutí maškarády pro vnější zónu je velmi jednoduché:
# firewall-cmd --permanent --zone=external --add-masquerade # firewall-cmd --reload
Můžeme se Firewalld vždycky zeptat na stav maškarády pomocí --query-masquerade
nebo ji zase vypnout s --remove-masquerade
.
Destination NAT (DNAT)
Překlad cílových adres (DNAT) je obvykle to, co se míní pojmem přesměrování portů. Zajišťuje přepis hlaviček příchozích paketů tak, aby pakety následně mířily na jiný cíl (adresu a/nebo port). Používá se to v případě, že služba ve skutečnosti neběží na vnějším rozhraní našeho hraničního směrovače, ale někde uvnitř sítě v DMZ například na privátní adrese.
V takovém případě musíme zajistit přepis hlaviček v obou směrech, aby provoz doputoval do správného cíle a odpovědi aby byly vysílány z původní adresy a portu, na které se klient dotazoval. Ve skutečnosti tedy jde opět o překlad, ačkoliv to tak v běžné komunikaci nenazýváme.
Pokud tedy máme spuštěný překlad adres a potřebujeme z vnějšího rozhraní dostat provoz do vnitřní sítě, postupujeme takto:
# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.1.2.20 # firewall-cmd --reload
Provoz, který dorazí do této zóny na TCP port 80 bude přesměrován na stroj s IP adresou 10.1.2.20 a cílový port 8080. Pravidlo je pak opět vidět ve výpisu zóny:
# firewall-cmd --zone=external --list-all external … forward: yes masquerade: yes forward-ports: port=80:proto=tcp:toport=8080:toaddr=10.1.2.20 …
Můžeme se na ně i přímo zeptat:
# firewall-cmd --zone=external --list-forward-ports port=80:proto=tcp:toport=8080:toaddr=10.1.2.20
Přesměrování (redirect)
Redirect je jednodušší případ výše uvedeného, kdy přepisujeme pouze cílový port. To se hodí v případě, že klienti přicházejí na standardní port, ale služba ve skutečnosti běží na jiném. Nepotřebujeme pak vůbec přepisovat cílovou adresu, stačí nám jen změnit u dotazů port:
# firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=2265 # firewall-cmd --reload
Příště
Příště seriál zakončíme ukázkou modelového příkladu konfigurace konkrétního firewallu, který by mohl sloužit na naší síti.