Linux E X P R E S

Facebook

Správa linuxového serveru: Linuxový firewall, základy iptables IV

debain_notext.png

V tomto díle se dozvíte o tabulkách v Netfiltru, o možnostech práce s NATem, o přesměrování portů či maškarádě a o některých dalších zajímavých modulech Netfiltru, které vám pomohou při stavbě pokročilejších firewallů.


Tabulky v Netfilteru

Už z názvu nástroje iptables lze odvodit, že paketový filtr v Linuxu pracuje s tabulkami. Tuto informaci jsem vám dosud tajil, abych vám pochopení základů příliš nekomplikoval. Nyní je ale čas, abych se podíval na jednotlivé tabulky v linuxovém paketovém filtru, a řekl vám, k čemu jsou.

Pokud v rámci použití nástroje iptables nezadáte název tabulky, se kterou chcete pracovat, využije se výchozí tabulka filter, v rámci které probíhá samotné filtrování paketů. Kromě tabulky filter existují ještě tři další - tabulka nat, tabulka mangle a tabulka raw. V každé z těchto tabulek jsou různé výchozí řetězy, se kterými můžete pracovat. Tabulka mangle slouží k modifikování nebo značkování paketů (užívá se např. v rámci QoS). Tabulka nat se používá pro překlad adres a tabulka raw se používá pro označení paketů, které se mají vyhnout sledování spojení (connection tracking).

Jelikož tento miniseriál je spíše orientován na základy linuxového paketového filtru, nebudu probírat všechny tabulky se všemi řetězy, které se v nich nachází. Místo toho se zaměřím na tabulku nat a dva řetězy v ní, které nám trošku rozšíří schéma procházení paketů Netfiltrem. Pokud se chcete o jednotlivých tabulkách dozvědět více, podívejte se na odkazy pod článkem.

Jak procházejí pakety linuxovým paketovým filtremJak procházejí pakety linuxovým paketovým filtrem

Na tomto obrázku jsou vidět dva další výchozí řetězce, které patří tabulce nat (vyznačené zeleně). Jsou jimi řetězy PREROUTING a POSTROUTING. Řetěz PREROUTING v tabulce nat zachytává pakety ještě před směrovacím rozhodnutím, a řetěz POSTROUTING zachytává pakety těsně před tím, než opustí daný počítač. Tyto dva řetězy využijete, pokud si chcete postavit nějakou formu NATu (viz níže).

Raději ještě doplním varování, abyste filtrování paketů neprováděli v tabulce NAT místo v řetězech INPUT a OUTPUT v tabulce filter, jelikož některé pakety tabulku nat "obchází".

Netfiltr a NAT

NAT znamená "Network address translation", tedy překlad adres. Existují dvě formy NATu, zdrojový NAT (SNAT), kde se u paketů mění zdrojová adresa, a cílový NAT (DNAT), v rámci kterého dochází k úpravě cílové adresy. Speciálním případem SNATu je maškaráda, která je vhodná pro připojení s dynamickou IP adresou.

Je jasné, že jednotlivé formy NATu se uplatní pouze v jednom z řetězců tabulky nat. Cílový NAT, tedy DNAT, uplatníte pouze v řetězci PREROUTING, zatímco zdrojový NAT v řetězci POSTROUTING. V těchto řetězcích pak můžete pro zpřesnění využít specifikaci vstupních nebo výstupních síťových rozhraní (parametry -o a -i). S tím ale pozor, v řetězci PREROUTING není možné se odkazovat na výstupní rozhraní (parametr -o), neboť ještě nebylo rozhodnuto, kam bude paket směřován. Stejně tak vstupní rozhraní (parametr -i) nelze použít v řetězci POSTROUTING.

Překlad adres využijete asi nejčastěji ve dvou podobách - přesměrování portů a maškaráda (za kterou "schováte" třeba domácí síť před svým poskytovatelem).

Přesměrování portů a DNAT

Přesměrování portů využijete v mnoha oblastech, ať už v případě domácího serveru, kde dostanete na routeru jednu veřejnou IP adresu, a budete chtít přesměrovat některé porty na server v domácí síti (nejlépe v demilitarizované zóně), nebo v případě, že máte na jednom počítači více virtuálních strojů, a chcete, aby některé jejich služby byly přístupné na IP adrese daného fyzického počítače. Ideální by samozřejmě bylo získat více IP adres a adresovat každý z počítačů ve vnitřní/virtuální síti a řídit přístup k nim prostřednictvím firewallu, ale toto není bohužel všude možné.

Podívejte se na následující příklad přesměrování portů:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.2.200:8080
iptables -A FORWARD -i eth1 -o eth2 -d 10.0.2.200 -p tcp --dport 8080 -j ACCEPT

Na prvním řádku je specifikováno pravidlo pro přesměrování portu. Toto pravidlo změní cílovou adresu a cílový port paketů směřujících na port 80 rozhraní eth1 na IP adresu 10.0.2.200 a port 8080. Všímněte si specifikace tabulky nat (-t nat). Výše zmíněné pravidlo změní pouze cílovou adresu paketu, který pravidlu vyhovuje, nic jiného s paketem nedělá. Takový paket pak projde směrovacím rozhodnutím a putuje do řetězce FORWARD, kde je třeba zajistit jeho průchod (viz druhé pravidlo, které umožní takovému paketu odcestovat rozhraním eth2). Nezapomeňte také na to, že je třeba povolit směrování paketů jako takové, viz minulý díl seriálu.

V rámci DNATu samozřejmě není nutné specifikovat cílový port, takže je možné přesměrovat veškerou komunikaci:

iptables -t nat -A PREROUTING -i eth1 -d 10.0.0.1 -j DNAT --to 10.0.2.200

Toto pravidlo přesměruje veškerý síťový provoz proudící na rozhraní eth1 a určený pro IP adresu 10.0.0.1 na IP adresu 10.0.2.200.

Maškaráda a SNAT

Pokud jste v situaci, kdy vám poskytovatel přidělí dynamicky IP adresu třeba na rozhraní modemu ppp0, a vy chcete za tento jeden počítač "schovat" celou vnitřní síť, použijete maškarádu. Ta zajistí, že se u všech odchozích paketů směřujících na dané rozhraní změní zdrojová IP adresa na IP adresu přidělenou danému rozhraní:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Maškaráda je podoblastí zdrojového NATu a oproti klasickému cíli SNAT v rámci iptables má dva zásadní rozdíly. Jedním je absence nutnosti specifikovat zdrojovou adresu (použije se IP adresa výstupního rozhraní), druhým je pak skutečnost, že při shození daného rozhraní Netfilter "zapomene" informace o všech relevantních spojeních. Pokud se adresa daného rozhraní nemění, pak místo maškarády použijte klasický SNAT:

iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to 10.0.5.15

Toto pravidlo změní zdrojovou IP adresu všech odchozích paketů směřujících na rozhraní eth2 na 10.0.5.15.

Některé další moduly Netfiltru

Netfilter nabízí celou řadu modulů, které umožňují filtrovat pakety dle řady doplňujících kritérií. Na závěr miniseriálu o Netfiltru ještě představím tři z nich.

Vlastník paketu (owner)

Na serveru nemusí být úplně od věci monitorovat nejenom příchozí komunikaci, ale i odchozí. V rámci této odchozí komunikace se vám může hodit filtrovat pakety na základě UID nebo GID procesu, který je generuje:

iptables -A OUTPUT -o eth0 -m owner --uid-owner podezrely-uzivatel -m limit --limit 1/s --limit-burst 10 -j LOG

Toto pravidlo bude logovat odchozí pakety generované procesy uživatele podezrely-uzivatel a směřující na síťové rozhraní eth0. Naznačil jsem zde i ochranu proti přeplnění logů, pokud by uživatel generoval příliš velký síťový traffic. Ta je zajištěna modulem limit. Pokud byste chtěli logovat provoz všech uživatelů (členů skupiny users), specifikovali byste příslušnou skupinu takto:

iptables -A OUTPUT -o eth0 -m owner --gid-owner users -m limit --limit 1/s --limit-burst 10 -j LOG

Počet spojení (connlimit)

V některých situacích se vám může hodit zaškrtit určitý provoz, pokud překoná určitý počet spojení:

iptables -A FORWARD -i eth2 -o eth0 -m connlimit --connlimit-above 10 -j REJECT

Toto pravidlo, použité na směrovači, omezí síťový provoz z rozhraní eth2 na eth0 tak, že povolí pouze 10 spojení. Ostatní pak bude odmítat.

Multiport

Pokud chcete v jednom pravidlu specifikovat více TCP/UDP portů, můžete použít modul multiport:

iptables -A INPUT -p tcp -m multiport --ports 22,80,40000:50000 -j ACCEPT

Zde je naznačeno jak specifikování několika portů za sebou (oddělovač je čárka), tak specifikování rozsahu (oddělovačem rozsahu je dvojtečka). Takto je možné specifikovat až 15 portů (rozsah je počítán jako dva porty).

Další moduly

Informace o modulech Netfiltru jsou dobře popsány v manuálových stránkách nástroje iptables, kam vám určitě doporučuji někdy zavítat.

Diskuze (0) Nahoru