Začátečníci
Příkazový řádek
Nastavujeme firewall (1) Nastavujeme firewall (1) |
|
|
|
| Zhlédnutí: 3069 | ||||||||||||||||||||||||||||||||||||||||||||
| 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. StrukturaJak 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. SyntaxePo 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 pravidelJelikož 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.
Powered by !JoomlaComment 3.22
3.22 Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved." |
||||||||||||||||||||||||||||||||||||||||||||
| Další > |
|---|