Linuxový firewall, základy iptables IV
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ů.
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 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ězechINPUT
a OUTPUT
v tabulce filter
, jelikož některé pakety tabulku nat
"obchází".
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ů 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é, vizminulý 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
.
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
na10.0.5.15
.
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.
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
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.
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).
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.