Domů arrow Začátečníci arrow Příkazový řádek arrow Nastavujeme firewall (1)

Nastavujeme firewall (1)

PDF Tisk E-mail
Zhlédnutí: 3069
Hodnocení čtenářů: / 5
SlabéVynikající 
Napsal filbar   
Pondělí, 29 říjen 2007
Aktualizováno ( Neděle, 28 říjen 2007 )

Když se v souvislosti s Linuxem objeví slovo firewall, tak se většině pokročilých uživatelů vybaví pojem iptables. A právě na ty se v tomto článku zaměříme.

Struktura

Jak jsou iptables uspořádány si nejlépe ukážeme na příkladu tabulkového kalkulátoru, který je vám jistě dobře znám. Tabulky, nebo-li listy jsou uspořádány do sešitů. U iptables sešitům odpovídají tabulky a listům tzv. chainy. Co to je se dozvíte za chvíli.

Tabulky existují celkem čtyři:filter, nat, mangle a raw. Obvykle se však používají pouze první dvě a na ty se v tomto článku také zaměříme. Tabulka filter se používá implicitně a slouží pro základní filtrování provozu procházejícího přes stroj. Jestliže však musíme použít tzv. nat, pak je nutné nakonfigurovat stejnojmennou tabulku. Pro ty co o pojmu NAT ještě neslyšeli dodám, že se jedná o překlad IP adres, který je zaveden z důvodů jejich nedostatku, kdy se za jednu veřejnou IP adresou může skrývat více strojů.

Tabulky filter a nat obsahují po třech chainech, nebo-li seznamech pravidel. Jako první se provádí pravidla zadaná v chainu PREROUTING tabulky nat. Následuje určení jestli se paket týká stroje, na kterém iptables běží. Pokud ne, začnou se provádět pravidla z chainu FORWARD tabulky filter. Jestliže se jej však týkají, je cesta paketu o něco málo delší a prochází chainem INPUT tabulky filter, následne chainem OUTPUT tabulky nat a chainem OUTPUT tabulky filter. Na závěr se obě cesty spojují a paket prochází přes chain POSTROUTING tabulky nat.

Z právě uvedeného vyplývá jedna velmi důležité upozornění, pakety které nejsou určeny pro lokální stroj procházejí pouze chainy PREROUTING/nat, FORWARD/filter a POSTROUTING/nat.

Syntaxe

Po nezbytném teoretickém úvodu se již můžeme pustit do praktické části. Pro začátek je vhodné se podívat jestli již nějaké distribuční pravidla ve firewallu neexistují. Toho dosáhneme příkazem iptables -L. Tímto vypíšeme základní tabulku filter. Vždy když totiž nezadáme jméno tabulky použije se tato. V případě distribuce Fedora 7 výpis výchozí konfigurace iptables vypadá takto:

 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
RH-Firewall-1-INPUT  all  --  anywhere             anywhere            
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
RH-Firewall-1-INPUT  all  --  anywhere             anywhere            
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            icmp any 
ACCEPT     esp  --  anywhere             anywhere            
ACCEPT     ah   --  anywhere             anywhere            
ACCEPT     udp  --  anywhere             224.0.0.251         udp dpt:mdns 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ipp 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp 
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:nfs 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW multiport dports sunrpc,nfs,32765:filenet-tms 
ACCEPT     udp  --  anywhere             anywhere            state NEW multiport dports sunrpc,nfs,32765:filenet-tms 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Jak si můžete všimnout existuje zde ještě jeden chain, oproti dříve jmenovaným, navíc. Jak je to možné se dozvíte za chvíli. Jednotlivé chainy jsou rozděleny do šesti sloupců.

První sloupec označuje co se má s definovanými pakety dít. Mezi obvyklé možnosti patří akceptovat paket(ACCEPT), zahodit paket(DROP) a zahození paketu při současném odeslání chybové zprávy jeho autorovi(REJECT). Mimo to existuje ještě velmi mnoho dalších, v uvedeném příkladu si můžeme všimnout u chainů INPUT a FORWARD cíle RH-Firewall-1-INPUT, který přesměrovává zpracování paketů právě do tohoto chainu. Výhoda tohoto tkví v přehlednějším zápisu pravidel a také, že se stejná pravidla nemusí pro oba dva chainy opakovat.

Druhý sloupec označuje typ protokolu. Běžně se zde setkáte se zápisem all(všechny protokoly), tcp, udp a nebo icmp, který je určen pro pakety obsahující různé informace a z běžnějšího používáni je známo z programu ping, který funguje právě na jeho principu

O třetí sloupec se nemusíme zajímat, zato sloupce čtyři a pět jsou velmi důležité. Určujeme v nich totiž zdrojovou(source) a cílovou(destination) adresu paketů, jichž se má dané pravidlo týkat. Poslední šestý sloupec určuje podrobnější informace o daném pravidle jako jsou zdrojový(sport), nebo cílový(dport) port, nebo zprávu z jakou mají být pakety navráceny v případě cíle REJECT.

Tvorba pravidel

Jelikož se nyní již trošku v iptables vyznáme je nejvyšší čas, abychom se pokusili nějaké to pravidlo vytvořit vlastními silami. Jelikož je nejlepší začínat s čistým štítem distribuční pravidla si vymažeme příkazem iptables -F. Když teď zadáme přikaz iptables -L, tak zjistíme, že nám všechna pravidla zmizela.

Dále řekněme, že chceme zablokovat všechna http spojení. Po nahlédnutí do souboru /etc/services zjišťujeme, že http komunikace probíhá na portu 80 již známe všechny potřebné informace a můžeme dané pravidlo napsat:

 
iptables -A INPUT -p tcp -d 192.168.2.155 --sport 80 -j DROP

Tímto přidáváme pravidlo na konec chainu INPUT(-A) ve výchozí tabulce filter, které zahodí(-j DROP) všechny pakety, které mají cílovou adresu(-d 192.168.2.155) a používají protokol tcp(-p tcp) a zdrojový port(--sport) 80, nebo-li http. Velmi doležité je to, že používáme zdrojový port 80 a ne cílový. Protože pro příjem spojení se použije vždy nějaký náhodný port, který nemůžeme ovlivnit. Toto pravidlo zahazuje veškeré pakety, až po prvním spojení na server. Pokud bychom chtěli zakázat i první spojení na server použijeme chain OUTPUT:

 
iptables -A OUTPUT -p tcp -s 192.168.2.155 --dport 80 -j DROP

Všimněte si, že teď je naše IP adresa uvedene jako zdrojová(-s) s zahazujeme spojení, které se odesílají na port(--dport) 80, na kterém obvykle naslouchá nějaký www server. Zde totiž můžeme použít cílový port, jelikož si spojení právě na tomto portu internetový prohlížeč žádá. To je rozdíl oproti předchozímu příkladu, kdy připojení pouze přijímáme. Když se teď podíváme do výpisu iptables uvidíme něco takového:

 
Chain INPUT (policy ACCEPT)
 
target     prot opt source               destination         
 
DROP       tcp  --  anywhere             linpro2             tcp spt:http 
 
 
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  linpro2              anywhere            tcp dpt:http

U chainu INPUT jsme neuvedli žadnou zdrojovou adresu, tak se použile jakákoliv(anywhere), totéž platí i pro adresu destination chainu OUTPUT. Ve výpisu iptables je automaticky převáděna IP adresa na DNS jméno, proto se zde místo adresy, kterou jsme zadávali objevilo linpro2, což je DNS jméno mého PC. Totéž platí i pro čísla portů, ty se také automaticky převádějí na jména. Jestli tomu chceme zabránit použijeme přepínač -n.

Časem se nám začne hromadit jistě velké množství pravidel v jednotlivých chainech a tak jistě oceníme i očíslování řádků, které zajistíme parametrem --line-numbers. Toto zjištění uplatníme hned v následujícím příkladu. Mazání pravidel pomocí přepínače -F, který vymaže všechna pravidla, jistě uznáte není příliš praktické, proto existuje přepínač -D, který dané pravidlo vymaže. Jako parametr přijímá samozřejmé jméno chainu a také buď definici daného pravidla, nebo právě číslo řádku, na kterém se dané pravidlo nachází. Jestliže budeme chtít vymazat naše pravidlo v chainu OUTPUT použijeme takový příkaz:

 
iptables -D OUTPUT 1

Když se teď podíváme do výpisu konfigurace iptables zjišťujeme, že chain OUTPUT je prázdný. Podobně lze odstranit i naše pravidlo z chainu INPUT. Stejně tak čísla řádku využijeme, pokud potřebujeme pravidlo vložit na přesně danou pozici. K tomu máme k dispozici přepínač -I do jehož parametrů uvedeme mezi název chainu a pravidlo číslo řádku, na které se má pravidlo vložit. Pokud číslo řádku neuvedeme pravidlo se vloží na začátek chainu.

Pro nezkušené možna nastane trošku problém, když by se mělo zakázat více portů, např.: http i ftp. Je možné to řešit více pravidly pod sebou, ale přehlednější to můžeme vyřešit přepínačem -m s parametrem multiport. Poté místo parametru --sport uvedeme --sports, obdobně to provedeme také i --dport:

 
 iptables -A INPUT -p tcp -d 192.168.2.155 -m multiport --sports 21,80 -j DROP

Jednotlivé porty od sebe oddělujeme pomocí čárky. Jestliže chceme nějakou podmínku negovat, není nic jednoduššího, stačí před ní uvést vykřičník. Předcházející příklad znegujeme velmi jenoduše:

 
 iptables -A INPUT -p tcp -d ! 192.168.2.155 -m multiport --sports ! 21,80 -j DROP

Zde se zahodí všechny pakety, které nesměřují na stroj 192.168.2.155 a nepocházejí s portů 21, nebo 80, takže jediná povolený spojení jsou ty směřující na 192.168.2.155 se zdrojovými porty 21, nebo 80. Někdy je lepši pakety nejenom zahazovat, je raději ještě poslat zpět i oddůvodnění. Toho dosáhneme, když jako cíl uvedeme REJECT s přepínačem --reject-with, který do parametru přebírá 1 z následujících 7 parametrů: icmp-admin-prohibited, icmp-net-prohibited, icmp-host-prohibited, icmp-proto-unreachable, icmp-host-unreachable, icmp-port-unreachable a icmp-net-unreachable.

Při tvorbě pravidel je rovněž nutné mít na vědomí, že je nutné nejprve psát povolovací pravidla a až poté zakazovat. Nejlépe si to ukážeme na příkladu. Řekněme, že chceme všem strojům zakázat přístup na ftp a pouze adrese 192.168.2.155 tento přístup povolit. Řešení je velmi jenoduché:

 
iptables -A FORWARD -p tcp -s 192.168.2.155 --dport 21 -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.2.155 --sport 21 -j ACCEPT
iptables -A FORWARD -p tcp --sport 21 --dport 21 -j DROP

 

Jedotlivá pravidla určitě chceme uchovat mezi restarty PC a proto je musíme uložit. V distribucích typu RedHat/Fedora to provedeme příkazem service iptables save, jinak je k dispozici i obecný příkaz iptables-save, který na standartní výstup vypíše seznam pravidel ve formátu pro jejich opětovné načtení příkazem iptables-restore. Uložení pravidel do souboru dosáhneme nejjednodušeji příkazem:

 
iptables-save > iptables-rules

Tím bychom tento díl ukončili. Příště se podíváme na to, jaké další možnosti nám skýtají další cíle, na stavový firewall a nezapomeneme aní na konfiguraci překladu adres, nebo-li natu.

Komentářů
Přidat Nový Hledat RSS
srnka  - super clanok   |91.127.119.xxx |2008-01-24 19:54:36
Velmi dobry clanok, takyto navod na iptables chybal. Dik, tesim sa na dalsi diel
mich  - poradie zadavania iptables   |78.99.11.xxx |2008-01-26 23:26:48
Nejde o to, zadat najprv povolovacie a az potom zakazovacie pravidla, ale o to,
ze akonahle paket vyhovie jednemu z pravidiel, dalsie su uz ignorovane. Cize ak
najprv povolim komunikaciu pre vsetky source ip http servrov a potom chcem
zakazat pristup k jednemu z nich, tento zakaz sa neuplatni a komunikacia so
servrom pobezi dalej.
Non_E   |77.48.127.xxx |2008-05-04 14:01:56
Tutoriálů o iptables je i v češtině k nalezení dostatek, co ale napsat
tutoriál, jak vytvořit firewall pro ipv6?
Přidat komentář
Jméno:
Email:
 
Website:
Název:
UBBKód:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Please input the anti-spam code that you can read in the image.

3.22 Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 
Další >

Zapomenuté heslo
Nemáte účet? Vytvořte jej!
ICQ: 226785996
Skype: My status bartfil
Jabber: filbar@jabber.cz
TOPlist

Dostupnost podle Monitoring-serverů.cz

Doporučujeme

tiberiumleu_4_.jpg
Příběhy psů z útulků