Firewalld: přesměrování portů, překlad adres a filtrace podle zdroje

21. 2. 2023
Doba čtení: 4 minuty

Sdílet

 Autor: Depositphotos
V článku si ukážeme, jak používat různé zóny pro provoz přicházející z různých rozsahů adres či rozličných portů. Poté si předvedeme, jak překládat adresy na příchozím a odchozím provozu.

Příchozí provoz podle zdroje

Co se dozvíte v článku
  1. Příchozí provoz podle zdroje
  2. Překlad adres
  3. Příště

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:

bitcoin_skoleni

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

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