V dávných dobách, kdy jsem ještě začínal na konzolovém linuxu, jsem se si chtěl postavit server jakožto bránu do internetu. A asi jako většina začátečníků jsem poctivě googlil, až jsem narazil na sérii článků na Root.cz Linux jako internetová gateway nebo Stavíme firewall a tak dále … Poctivě jsem opisoval každý řádek z iptables (bez logiky, proč tomu tak je) a čirou náhodou mi to napoprvé i fungovalo.
Ptal jsem se známých, jestli neví o jiných článcích, které se iptables zaobírají trochu hlouběji, ale většinou jsem dostal záporné odpovědi. Ať si to přečtu v man iptables
, ale že to prý nemá cenu, je to neuvěřitelně rozsáhlé, a jiné bláboly. Samozřejmě že tomu tak ve skutečnosti není, jenom já jakožto začínající uživatel jsem v tom měl více či méně problémy. Proto jsem se rozhodl napsat kompletní seriál o všech vymoženostech iptables i s některými praktickými ukázkami. Dnešní díl je jen jakýmsi lehkým úvodem do problematiky.
Co je to vlastně iptables a k čemu slouží?
Iptables je mocný nástroj, který umožňuje linuxovému nebo unixovému systému plně pracovat se síťovou komunikací. Pomocí něj si můžeme snadno postavit různé druhy firewallů (stavový, transparentní …) nebo sdílení internetu, zkrátka snadno řídit velkou síťovou dopravní křižovatku na serveru.
Tak konec úvodu a pusťme se do základní syntaxe:
iptables [tabulka] [akce] [chain] [ip_část] [match] [target] [target_info]
Všemi těmito částmi se do detailů budeme zabývat v tomto seriálu. Jak je vidět, zas tak mnoho parametrů to není a začátečníci by se neměli lekat tohoto zdánlivě složitého příkazu. A aby se nám psala pravidla dobře, zkusme při jejich psaní trochu myslet jako paket. Kam letím? Co mám potom udělat? Mějte na paměti, že zde velice záleží na pořadí, neboť paket, který vyhoví (ať už zahozením či povolením) prvnímu možnému pravidlu, už nepokračuje dál a není kontrolován ostatními pravidly.
Dnes bychom začali první částí, a tou jsou tabulky. Existují pouze 3 základní: filter (výchozí), nat a mangle. Poznáme je podle přepínače -t
v příkazu. Tabulky si můžeme představit jako 3 katalogy, každý z nich má svoje položky – řetězce (anglicky chain, ale o nich si povíme trošku později.)
Pokud nedefinujeme žádnou tabulku, tak se automaticky použije filter. Takže v této tabulce se defaultně nachází řetězce INPUT, FORWARD a OUTPUT. Jak již jejich názvy napovídají, pokud paket letí dovnitř, aplikují se na něj pravidla z řetězce INPUT. Pokud mají být pravidla pro odchozí pakety, použije se OUTPUT. A nakonec je zde FORWARD, ten použijeme, když náš server funguje jako router a přeposílá pakety mezi sítěmi. Důležité upozornění: To, co jde přes FORWARD, neprochází pravidly INPUT ani OUTPUT!.
Tabulka nat má opět výchozí 3 položky, a to PREROUTING, POSTROUTING a OUTPUT. První je řetěz pravidel, které se použijí na příchozí pakety, pomocí nich můžeme modifikovat cílovou adresu Destination NAT (DNAT). To se hodí hlavně tehdy, když chceme forwardovat porty (nebo celý rozsah) do neveřejné místní sítě. Opakem je POSTROUTING, s ním modifikujeme odchozí spojení Source NAT (SNAT),masquerade. Toho zase můžeme využít, pokud máme například jednu veřejnou IP adresu a chceme za ní skrýt více počítačů. Poslední položkou je OUTPUT, to je řetěz pravidel, které se uplatňují ještě před modifikací odchozích paketů (než je předáme dále).
Poslední tabulkou je mangle, ta má všech pět položek, které mají filter i nat. (INPUT, OUTPUT, FORWARD, PREROUTING a POSTROUTING). V nich jsou řetěze pravidel, které slouží pro úpravy hlavičky paketů, manipulace s TTL, TOS, značkování …
Akce:
Akcí, které můžeme dělat, je poměrně dost. Toto je počeštěný výtažek z manuálu některých nejpoužívanějších:
-A, --append - Přidání nového pravidla na konec řetězce
-D, --delete - Smaže pravidlo (buď ho zadáte ve tvaru, v němž jste ho přidávali, nebo
použijete jeho číslo, to získáte rozšířenou volbou --lin. Viz. dole).
-R, --replace - Nahradí číslo pravidla jiným pravidlem
-I, --insert - Vložení nového pravidla na začátek řetězce
-L, --list - Vypsání všech pravidel v řetězci. Pokud není zadán řetězec, vypíšou se všechny řetězce + jejich pravidla
-F, --flush - Vyprázdní všechna pravidla v řetězci (to samé, jako kdybyste to dělali po
jednom)
-N, --new-chain - Vytvoříme si vlastní řetěz
-X, --delete-chain - Smažeme si vlastní řetěz (nejde smazat výchozí)
-P, --policy - Výchozí politika řetězce
-E, --rename-chain - Přejmenování vlastního řetězce
Rozšířené volby:
-v, --verbose - Podrobnější výpis (více ukecaný)
--lin, --line-numbers - Zobrazí čísla pravidel
-n, --numeric - u IP adres nebude zjišťovat reverzní DNS, ale vypíše ji číselně
(vhodné, když máte mnoho pravidel, abyste měli rychlejší výpis)
Výchozí politika (policy) v iptables při výchozí konfiguraci je „povolit všechno“. Je to pochopitelné, pokud bychom totiž neměli žádný firewall a implicitně by se zahodilo všechno, tak bychom si v síti moc neužili. Ale pokud chceme dělat FW, měli bychom se řídit pravidlem „co vysloveně není povoleno, to je zakázáno“. Jak je již zmíněno výše, používá se přepínače -P
. A volby jsou buď povolit (ACCEPT) nebo zahodit (DROP).
Příklad výchozího zahození všech příchozích paketů:
iptables -P INPUT DROP
Toto je prozatím z dnešního dílu vše, příště bychom se podívali IP část a match (rozšíření).