<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog despre resurse educaţionale din IT &#187; kernel</title>
	<atom:link href="http://resurse-educationale.uv.ro/?feed=rss2&#038;tag=kernel" rel="self" type="application/rss+xml" />
	<link>http://resurse-educationale.uv.ro</link>
	<description>Cu informatii pentru dezvoltare personala, dar şi pentru studentţi, elevi, profesori, webmasteri, programatori</description>
	<lastBuildDate>Fri, 27 Jan 2012 01:12:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Cum sa realizezi masquerading, transparent proxy,  forwardare de porturi, si alte forme de NAT pentru kernelurile Linux ver 2.4.</title>
		<link>http://resurse-educationale.uv.ro/?p=173</link>
		<comments>http://resurse-educationale.uv.ro/?p=173#comments</comments>
		<pubDate>Wed, 06 Apr 2011 12:50:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Servers]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[dnat]]></category>
		<category><![CDATA[forward]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[mapare]]></category>
		<category><![CDATA[masquerading]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[porturi]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[redirectare]]></category>
		<category><![CDATA[snat]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=173</guid>
		<description><![CDATA[traducere ver. 0.2 de catre Riddl Multumiri tuturor celor care m-au ajutat, in special lui Gushterul. Observatie f importanta: probabil ca exista unele greseli in acest document. Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de &#8230; <a href="http://resurse-educationale.uv.ro/?p=173">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>traducere ver. 0.2 de catre Riddl</p>
<p>Multumiri tuturor celor care m-au ajutat,  in special lui Gushterul.<br />
Observatie f importanta: probabil ca exista unele greseli in acest document.<br />
Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de<br />
traducere si pentru observatii pertinente trimiteti-mi mail pentru Riddl la<br />
&#8220;discutzii at gmx dot net&#8221;. Nu uitati sa precizati numele documentului.<br />
Multumesc anticipat.<br />
Aceasta versiune este  putin modificata fata de original, deorece unii termeni<br />
sunau foarte ciudat in ro.<br />
Pentru ultima versiune a acestui document verifica<br />
&lt;http://www.securityorg.net/docs/&gt;.</p>
<p>Lecturare placuta!<br />
______________________________________________________________________<br />
Linux 2.4 NAT HOWTO<br />
Rusty Russell, lista de discutii netfilter@lists.samba.org<br />
$Revision: 1.3 $ $Date: 2002/06/05 13:21:56 $</p>
<p>Acest document descrie cum sa realizezi masquerading, transparent proxy,<br />
forwardare de porturi, si alte forme de NAT pentru kernelurile Linux ver 2.4.</p>
<p>______________________________________________________________________</p>
<p>Cuprins</p>
<p>1. Introducere<br />
2. Care este site-ul oficial si care sunt listele de discutii?<br />
2.1. Ce inseamna NAT?<br />
2.2. De ce as dori sa realizez NAT?<br />
3. Doua tipuri de NAT<br />
4. Trecere rapida de la kernelurile 2.0 si 2.2<br />
4.1. Doresc sa realizez doar masquerading! Help!<br />
4.2. Dar despre ipmasqadm?<br />
5. Controlul a ceea ce dorim sa facem cu NAT?<br />
5.1 Selectare simpla folosind iptables<br />
5.2 Aspecte delicate in privinta selectarii pachetelor ce le dorim<br />
modificate<br />
6. Cum sa modificam pachetele<br />
6.1 Folosirea NAT pentru modificarea adresei sursa (SNAT)<br />
6.1.1 Masquerading<br />
6.2 Folosirea NAT pentru modificarea adresei destinatie (DNAT)<br />
6.2.2 Redirectare<br />
6.3 Mapare complexa<br />
6.3.1. Selectarea de adrese multiple dintr-un sir<br />
6.3.2. Realizarea de mapare NAT nula<br />
6.3.3. Comportamentul NAT standard<br />
6.3.4. Mapare implicita a porturilor sursa<br />
6.3.5. Ce se intampla cand NAT-area nu reuseste<br />
6.3.6. Mapari multiple, Suprapuneri si Conflicte<br />
6.3.7. Schimbarea destinatiei conexiunilor generate local<br />
7. Protocoale speciale<br />
8. Avertizmente privind folosirea NAT<br />
9. Folosirea SNAT si rutarea<br />
10. Folosirea DNAT pentru adrese aflate in aceeasi retea.<br />
11. Multumiri</p>
<p><span id="more-173"></span></p>
<p>______________________________________________________________________</p>
<p>1. Introducere</p>
<p>Bine ai venit!</p>
<p>Esti pe cale sa incepi sa inveti fascinanta (si uneori inspaimantatoare)<br />
lume a NAT-ului: traducerea adreselor de retea. Acest Howto iti va fi<br />
oarecum un ghid precis pentru kernelurile din linux ver. 2.4 si peste.</p>
<p>In kernelul de linux ver. 2.4, a fost introdus suport pentru modificarea<br />
pachetelor, numit &#8220;netfilter&#8221;. Un nivel deasupra acestuia pune la dispozitie<br />
NAT (translatarea adreselor de retea), complet rescris fata de versiunile din<br />
kernelurile anterioare.</p>
<p>(C) 2000 Paul &#8220;Rusty&#8221; Russell.  Sub licenta GNU GPL.</p>
<p>2. Care este site-ul oficial si care sunt listele de discutii?</p>
<p>Sunt trei site-uri oficiale:</p>
<p>o       Multumiri lui Filewatcher &lt;http://netfilter.filewatcher.org/&gt;.<br />
o       Multumiri Echipei Samba si SGI &lt;http://netfilter.samba.org/&gt;.<br />
o       Multumiri lui Harald Welte &lt;http://netfilter.gnumonks.org/&gt;.</p>
<p>Le poti accesa pe toate folosind round-robin DNS la:<br />
&lt;http://www.netfilter.org/&gt; si  &lt;http://www.iptables.org/&gt;</p>
<p>Pentru lista de discutii oficiala de la netfilter, vezi:<br />
&lt;http://www.netfilter.org/contact.html#list&gt;.</p>
<p>2.1. Ce inseamna NAT?</p>
<p>In mod normal, pachetele intr-o retea se deplaseaza de la sursa  (cum ar fi<br />
computerul tau) la destinatia  (cum ar fi www.securityorg.net) prin mai<br />
multe legaturi de retea diferite: de exemplu cam 19 de la locatia in care ma<br />
aflu eu. Nici una din aceste legaturi nu iti modifica pachetul, pur si simplu<br />
este trimis mai departe.</p>
<p>Daca una din aceste legaturi ar fi facut NAT, atunci ar fi modificat sursa sau<br />
destinatia pachetului ce intra. Dupa cum iti imaginezi nu asa a fost conceput<br />
sistemul sa functioneze, si din aceasta cauza NAT este intodeauna ceva<br />
in genul unui infirm. Deobicei legatura care a facut NAT va tine minte cum a<br />
modificat pachetul, si cand un pachet replica vine din cealalta parte, va<br />
realiza modificarea inversa a pachetului replica, asa ca totul va functiona.</p>
<p>2.2. De ce as dori sa realizez NAT?</p>
<p>Intr-o lume perfecta nu ai avea nevoie. Intre timp, principale motive sunt:</p>
<p>Conexiunile prin modem la internet<br />
Cele mai multe ISP-uri iti dau doar o singura adresa IP cand te<br />
conectezi la ei. Poti trimite pachete cu orice adresa sursa pe care o<br />
doresti, dar doar pachetele cu aceasta adresa IP se vor intoarce la<br />
tine. Daca doresti sa folosesti mai multe sisteme (cum ar fi reteaua<br />
de acasa) pentru a le conecta la internet prin aceasta singura<br />
legatura vei avea nevoie de NAT.<br />
Aceasta este de departe cel mai raspandit mod de folosire al NAT-ului<br />
din zilele noastre, cunoscut si sub numele de &#8220;masquerading&#8221; in lumea<br />
Linuxului. Eu numesc aceasta SNAT, deoarece modifici adresa sursa a<br />
primului pachet.</p>
<p>Servere multiple<br />
Uneori doresti sa modifici directia in care sa se indrepte pachetele<br />
ce intra in reteaua ta. In mod frecvent aceasta este (ca si mai sus)<br />
deoarece ai doar o singura adresa IP, dar doresti ca oameni sa poata<br />
sa ajunga la computerele din spatele sistemului cu adresa IP &#8220;reala&#8221;.<br />
Daca rescrii adresa destinatie a pachetelor care intra, poti realiza<br />
acest lucru. Acest tip de NAT a fost numit forwardare (inaintare) de<br />
porturi in versiunile anterioare de Linux.<br />
O variatie des intalnita a acestei aplicatii al NAT-ului este<br />
load-sharing-ul (incarcare partajata), unde se mapeaza mai multe<br />
sisteme, permitand sistemelor sa ajung la aceste sisteme. Daca<br />
realizezi acest lucru la o scara mare, ar fi bine sa te uiti pe<br />
Linux Virtual Server &lt;http://linuxvirtualserver.org/&gt;.</p>
<p>Proxy transparent<br />
Uneori doresti sa para ca fiecare pachet care trece prin sistemul tau<br />
Linux este destinat pentru un program ruland chiar pe sistemul tau.<br />
Acest lucru este folosit pentru a realiza proxy-uri transparente: un<br />
proxy este un program care se interpune intre reteaua ta si lumea<br />
exterioara, mediand comunicarea intre ele. Se numeste transparent<br />
deoarece reteaua ta nici nu va realiza ca foloseste un proxy, doar daca<br />
bineinteles, proxy-ul nu functioneaza.<br />
Squid-ul poate fi configurat sa ruleze in acest mod, si aceasta era<br />
numita redirectare sau realizare de proxy transparent in versiunile<br />
anterioare de linux.</p>
<p>3. Doua tipuri de NAT</p>
<p>Am impartit NAT-ul in doua tipuri: NAT pentru sursa (SNAT) si NAT pentru<br />
destinatie (DNAT).</p>
<p>SNAT este realizat atunci cand modifici adresa sursa al primului pachet:<br />
schimbi sursa de unde porneste conexiunea. SNAT este intodeauna realizat dupa<br />
procesul de rutare al pachetelor, chiar inainte de a pleca pe conexiune<br />
pachetul. Masquerading este o forma particulara de SNAT.</p>
<p>DNAT este realizat cand modifici adresa destinatie al primului pachet: schimbi<br />
destinatia unde va fi facuta conexiunea. DNAT este intodeauna realizat<br />
inainte de rutarea pachetelor, cand pachetul tocmai a venit prin interfata.<br />
Forwardare de porturi, load-sharing-ul, si proxy-ul transparent sunt toate<br />
forme de DNAT.</p>
<p>4. Trecere rapida de la kernelurile 2.0 si 2.2</p>
<p>Imi pare rau pentru aceia dintre dumneavastra socati de trecerea de la<br />
versiunea 2.0 (ipfwadm) la 2.2 (ipchains). Exista vesti bune si vesti proaste.</p>
<p>In primul rand, poti in mod simplu sa folosesti ipchains si ipfwadm ca mai<br />
inainte. Pentru aceasta trebuie sa incarci (insmod) modulele pentru kernel<br />
&#8220;ipchains.o&#8221; sau &#8220;ipfwadm.o&#8221; ce se gasesc in ultima distributie netfilter.<br />
Acestea se exclud reciproc (ai fost avertizat), si nu ar trebui folosite cu<br />
nici un alt modul din netfilter.</p>
<p>Odata ce unul din aceste module a fost incarcat, vei putea folos ipchains si<br />
ipfwadm in mod normal, insa cu unele diferente:</p>
<p>- Setarea de timeout-uri pentru masquerading cu ipchains  -M -S, sau ipfwadm<br />
-M -s nu rezolva nimic. Cum timeout-urile sunt mai mari pentru noua<br />
infrastructura NAT, acest lucru nu ar trebui sa conteze.</p>
<p>- Campurile init_seq, delta si previous_delta in listarea detaliata a<br />
masqueradarii sunt intodeauna zero.</p>
<p>- Resetarea si listarea counter-elor simultana &#8220;-Z -L&#8221; nu mai este posibila:<br />
countere-le nu vor fi resetate.</p>
<p>- Nivelul de compatibilitate nu este foarte bun pentru un numar de conexiuni<br />
foarte mare: nu il folosi pentru gateway-ul corporatiei.</p>
<p>Hackerii pot deasemenea sa observe:</p>
<p>- Acum te poti lega si pe porturile 61000-65095 chiar daca realizezi<br />
masquerading. Codul pentru masqueradare obisnuia sa considere ca nimic in<br />
aceasta raza ar fi fost ceva corect, asa ca programele nu puteau sa o<br />
foloseasca.</p>
<p>- &#8220;Hack-ul&#8221; (nedocumentat) &#8220;getsockname&#8221;, pe care programele ce realizau proxy<br />
transparent il puteau folosi pentru a afla adresa reala a conexiunilor nu<br />
mai este disponibil.</p>
<p>- &#8220;Hack-ul&#8221; (nedocumentat) bind-to-foreign-address (atasare pe o adresa<br />
straina) nu mai este deasemnea implementat; acesta era folosit pentru a<br />
completa iluzia de proxy transparent.</p>
<p>4.1. Doresc sa realizez doar masquerading! Help!</p>
<p>Aceasta este ce vor majoritatea oamenilor. Daca ai o adresa PPP IP dinamica,<br />
vrei in mod simplu sa spui sistemului tau ca toate pachetele ce vin din<br />
reteaua interna ar trebui sa fie modificate astfel incat sa para ca vin de la<br />
sistemul tau.</p>
<p># Incarca modulul NAT (acesta introduce toate modulele necesare)<br />
modprobe iptable_nat</p>
<p># In tabela NAT (-t nat) in chain-ul POSTROUTING adauga o regula<br />
# pentru toate pachetele care ies prin ppp0 (-p ppp0) care precizeaza<br />
# sa masqueradeze conexiunea (-j MASQUERADE).<br />
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</p>
<p># Da drumul la forwardarea IP<br />
echo 1 &gt; /proc/sys/net/ipv4/ip_forward</p>
<p>Observatie: aici nu faci nici un fel de filtrare a pachetelor: pentru aceasta<br />
citeste Packet Filtering HOWTO: capitolul &#8220;Folosirea impreuna a NAT-ului si a<br />
filtrarii de pachete&#8221;.</p>
<p>4.2. Dar despre ipmasqadm?</p>
<p>Nu este cazul sa ne facem probleme prea mari pentru compatibilitate. Poti<br />
folosi in mod simplu  &#8220;iptables -t nat&#8221; pentru a realiza forwardare de<br />
porturi. De exemplu, in Linux 2.2 ai fi facut:</p>
<p># Linux 2.2<br />
# Forwardeaza pachetele TCP catre portul 8080, adresa 1.2.3.4, spre<br />
# portul 80, adresa 192.168.1.1<br />
ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80</p>
<p>Acum ar trebui sa faci:</p>
<p># Linux 2.4<br />
# Adauga o regula inainte de procesul rutarii in chain-ul PREROUTING<br />
# (-A PREROUTING) in tabela NAT (-t nat) pentru ca pachetele TCP<br />
# (-p tcp) care vin spre adresa 1.2.3.4 (-d 1.2.3.4), portul 8080<br />
# (&#8211;dport 8080) sa aiba destinatia mapata (-j DNAT) catre<br />
# 192.168.1.1, portul 80 (&#8211;to 192.168.1.1:80)<br />
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 &#8211;dport 8080 \<br />
-j DNAT &#8211;to 192.168.1.1:80</p>
<p>5. Controlul a ceea ce dorim sa facem cu NAT?</p>
<p>Ai nevoie sa scrii reguli NAT pentru a spune kernelului ce conexiuni sa<br />
schimbe, si cum sa le schimbe. Pentru a realiza aceasta folosim comanda<br />
iptables, si precizam ca dorim a schimba tabela NAT prin specificarea optiunii<br />
&#8220;-t nat&#8221;.</p>
<p>Tabela regulilor NAT cuprinde trei liste numite &#8220;chain-uri&#8221;: fiecare regula<br />
este examinata in chain pana cand una se potriveste. Doua chain-uri sunt<br />
numite PREROUTING (pentru DNAT, pentru pachetele care tocmai au intrat) si<br />
POSTROUTING (pentru SNAT, pentru pachetele care sunt pe cale sa iasa). Al<br />
treilea chain (OUTPUT) va fi ignorat in cele ce urmeaza.</p>
<p>Urmatoarea diagrama ilustreaza destul de bine cum stau lucrurile:</p>
<p>_____                                     _____<br />
/     \                                   /     \<br />
PREROUTING &#8211;&gt;[Routing ]&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&gt;POSTROUTING&#8212;&#8211;&gt;<br />
\D-NAT/     [Decision]                    \S-NAT/<br />
|                            ^<br />
|                            |<br />
|                            |<br />
|                            |<br />
|                            |<br />
|                            |<br />
|                            |<br />
&#8212;&#8212;&#8211;&gt; Local Process &#8212;&#8212;</p>
<p>La fiecare dintre punctele de mai sus, cand un pachet trece este determinat<br />
carei conexiuni ii este asociat. Daca este o conexiune noua, este determinat<br />
chain-ul corespunzator in tabela NAT pentru a determina ce sa facem cu acel<br />
pachet. Raspunsul determinat va fi aplicat pentru toate pachetele viitoare<br />
apartinand acelei conexiuni.</p>
<p>5.1 Selectare simpla folosind iptables</p>
<p>iptables admite un numar de optiuni standard dupa cum sunt listate mai jos.<br />
Toate optiunile care incep cu &#8220;&#8211;&#8221; pot fi prescurtate, atat timp cat iptables<br />
poate sa le deosebeasca de alte optiuni. Daca kernelul tau are iptables<br />
compilat ca modul, este necesar sa incarci intai modulul iptables: &#8220;insmod<br />
ip_tables&#8221;.</p>
<p>Cea mai importanta optiune in acest caz este optiunea de selectare a tabelei,<br />
&#8220;-t&#8221;. Pentru toate actiune NAT, vei dori sa folosesti &#8220;-t nat&#8221; pentru tabela<br />
NAT. A doua cea mai importanta optiune este &#8220;-A&#8221; pentru a adauga o noua regula<br />
la sfarsitul unui chain (&#8220;-A POSTROUTING&#8221;), sau &#8220;-I&#8221; pentru a insera o regula<br />
la inceputul unui chain (&#8220;-I PREROUTING&#8221;).</p>
<p>Poti specifia sursa (&#8220;-s&#8221; sau &#8220;&#8211;source&#8221;) si destinatia (&#8220;-d&#8221; sau<br />
&#8220;&#8211;destination&#8221;) pachetelor pe care le doresti sa le prelucrezi prin NAT.<br />
Aceste optiuni pot fi urmate de o singura adresa IP (192.168.1.1), un nume<br />
(www.securityorg.net), sau o adresa de retea (192.168.1.0/24 sau<br />
192.168.1.0/255.255.255.0).</p>
<p>Poti specifica interfata cu care sa se potriveasca regula, de intrare (&#8220;-i&#8221;<br />
sau &#8220;&#8211;in-interface&#8221;) sau de iesire (&#8220;-o&#8221; sau &#8220;&#8211;out-interface&#8221;), dar ceea ce<br />
poti specifica depinde si de chain-ul in care introduci regula: pentru<br />
chain-ul PREROUTING poti selecta numai interfete prin care intra pachetele,<br />
si in chain-ul POSTROUTING poti selecta numai interfete de iesire. Daca<br />
folosesti o interfata gresita iptables iti va da eroare.</p>
<p>5.2 Aspecte delicate in privinta selectarii pachetelor ce le dorim modificate</p>
<p>Am spus mai sus ca poti preciza o adresa sursa si destinatie. Daca vei omite<br />
optiunea privitoare la adresa sursa, atunci regula se va potrivi pentru<br />
orice adresa sursa. Analog, daca omiti optiunea pentru adresa destinatie, atunci<br />
regula se va potrivi pentru orice adresa destinatie.</p>
<p>Poti deasemenea indica un protocol specific (&#8220;-p&#8221; sau &#8220;&#8211;protocol&#8221;), cum ar fi<br />
TCP sau UDP; doar pachetele de acest tip se vor potrivi cu regula. Principalul<br />
motiv pentru a preciza unul dintre aceste protocoale permite apoi folosirea de<br />
noi optiuni: in special optiunile &#8220;&#8211;source-port&#8221; si &#8220;&#8211;destination-port&#8221;<br />
(prescurtate &#8220;&#8211;sport&#8221; si &#8220;&#8211;dport&#8221;).</p>
<p>Aceste optiuni iti permite sa specifici ca numai pachetele cu anumite porturi<br />
destinatie sau porturi sursa se vor potrivi cu regulii. Aceste optiuni sunt<br />
folositoare, de exemplu, pentru redirectarea cererilor web (porturile TCP 80<br />
sau 8080) si nemodificarea celorlalte pachete.</p>
<p>Aceste optiuni trebuie sa fie puse dupa optiunea &#8220;-p&#8221; (care are ca alt efect<br />
incarcarea optiunilor extinse pentru acel protocol). Poti folosi pentru<br />
porturi numere, sau nume cum sunt scrise in fisierul /etc/services.</p>
<p>Toate caracteristicile dupa care poti selecta un pachet sunt detaliate in<br />
pagina de manual pentru iptables (man iptables).</p>
<p>6. Cum sa modificam pachetele</p>
<p>In concluzie, acum stim cum sa selectam pachetele pe care le dorim modificate.<br />
Pentru a scrie regulile complete trebuie sa spunem kernelului cu exactitate<br />
ceea ce dorim sa facem pachetelor.</p>
<p>6.1 Folosirea NAT pentru modificarea adresei sursa</p>
<p>Doresti sa faci SNAT; sa schimbi adresa sursa a conexiunilor cu ceva diferit.<br />
Acesta este realizat in chain-ul POSTROUTING, chiar inainte de a fi trimis<br />
pachetul; acesta este un detaliu important, deoarece inseamna ca orice alceva<br />
in sistemul Linux (rutare, filtrare de pachete) va vedea doar pachetul<br />
neschimbat. Mai inseamna deasemenea ca optiunea &#8220;-o&#8221; (interfata de iesire)<br />
poate fi folosita.</p>
<p>SNAT este specificat folosind optiunea &#8220;-j SNAT&#8221;; si optiunea &#8220;&#8211;to-source&#8221;<br />
specifica o adresa IP, un sir de adrese IP, si un port optional sau un sir de<br />
porturi (doar in cazul protocoalelor UDP si TCP).</p>
<p>## Schimba adresa sursa cu 1.2.3.4<br />
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT &#8211;to 1.2.3.4</p>
<p>## Schimba adresa sursa cu 1.2.3.4, 1.2.3.5 sau 1.2.3.6<br />
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT &#8211;to 1.2.3.4-1.2.3.6</p>
<p>## Schimba adresa sursa cu 1.2.3.4, si porturile intre 1-1023<br />
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT &#8211;to 1.2.3.4:1-1023</p>
<p>6.1.1 Masquerading</p>
<p>Exista un caz particular de SNAT numit masquerading: ar trebui sa fie folosit<br />
numai pentru adrese IP asignate dinamic, cum ar fi in cazul celor ce se<br />
conecteaza prin dial-up (pentru adrese IP statice, foloseste SNAT ca mai sus).</p>
<p>Nu este necesar cand faci masquerading sa specifici adresa sursa: deoarece va<br />
folosi adresa sursa a interfetei prin care va iesi pachetul. Dar ce este mai<br />
importat, daca legatura cu ISP-ul cade, conexiunile (care acum sunt pierdute<br />
oricum) sunt uitate, acest lucru inseamnand mai putine probleme tehnice cand<br />
legatura cu ISP-ul revine cu o noua adresa IP.</p>
<p>## masqueradare pentru ppp0<br />
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</p>
<p>6.2 Folosirea NAT pentru modificarea adresei destinatie (DNAT)</p>
<p>Aceasta se realizeaza  in chain-ul PREROUTING, exact  dupa primirea<br />
pachetului, aceasta insemna ca orice in sistemul Linux (rutare, filtrare de<br />
pachete) va vedea pachetul cu noua adresa destinatie. Mai inseamna ca optiunea<br />
&#8220;-i&#8221; (interfata de intrare) poate fi folosita.</p>
<p>Se specifica folosirea DNAT cu ajutorul optiunii &#8220;-j DNAT&#8221;, iar optiunea<br />
&#8220;&#8211;to-detination&#8221; specifica o adresa IP, un sir de adrese IP, si un port<br />
optional sau un sir de porturi (acest lucru fiind valabil doar pentru<br />
protocoalele UPD si TCP).</p>
<p>## Schimba adresa destinatie cu 5.6.7.8<br />
# iptables -t nat -A PREROUTING -i eth0 -j DNAT &#8211;to 5.6.7.8</p>
<p>## Schimba adresa destinatie cu  5.6.7.8, 5.6.7.9 sau 5.6.7.10.<br />
# iptables -t nat -A PREROUTING -i eth0 -j DNAT &#8211;to 5.6.7.8-5.6.7.10</p>
<p>##Schimba adresa destinatie a traficului spre portul 80 cu 5.6.7.8, port 8080.<br />
# iptables -t nat -A PREROUTING -p tcp &#8211;dport 80 -i eth0 \<br />
-j DNAT &#8211;to 5.6.7.8:8080</p>
<p>6.2.2 Redirectare</p>
<p>Exista un caz particular de DNAT numita redirectare: este o simpla conventie<br />
care este echivalenta cu a realiza DNAT catre adresa interfetei prin care<br />
intra pachetele.</p>
<p>## Trimite traficul care vine pe portul 80 catre squid (proxy-ul<br />
transparent<br />
# iptables -t nat -A PREROUTING -i eth1 -p tcp &#8211;dport 80 \<br />
-j REDIRECT &#8211;to-port 3128</p>
<p>Observatie: squid-ul trebuie sa fie configurat pentru a putea fi folosit ca<br />
proxy transparent!</p>
<p>6.3 Mapare complexa</p>
<p>Sunt cateva lucruri rafinate in folosirea NAT pe care majoritatea oamenilor nu<br />
vor avea nevoie sa le foloseasca. Aceste lucruri sunt documentate mai jos<br />
pentru curiosi.</p>
<p>6.3.1. Selectarea de adrese multiple dintr-un sir</p>
<p>Daca un sir de adrese IP este specificat, adresa IP care va fi folosita este<br />
bazata pe cea mai putin folosita la conexiuni adresa IP de care sistemul stie.<br />
Acest comportament furnizeaza load-balancing primar.</p>
<p>6.3.2. Realizarea de mapare NAT nula</p>
<p>Poti folosi tinta &#8220;-j ACCEPT&#8221; pentru a permite realizarea conexiunii fara sa<br />
fie realizat deloc NAT.</p>
<p>6.3.3. Comportamentul NAT standard</p>
<p>Comportamentul obisnuit este sa modifice conexiunea cat mai putin posibil, cu<br />
exceptia regulilor date de catre utilizator. Aceasta inseamna ca nu vor fi<br />
remapate porturile decat daca suntem obligati sa realizam acest lucru.</p>
<p>6.3.4. Mapare implicita a porturilor sursa</p>
<p>Chiar daca folosirea NAT nu este ceruta pentru o conexiune, translatarea<br />
portului sursa poate fi facut automat, daca o alta conexiune a fost mapata<br />
peste una noua. De exemplu considerati un caz care este comun in masquerading:</p>
<p>1. O conexiune web este realizata de la un sistem cu IP-ul 192.1.1.1 cu portul<br />
sursa 1024 catre www.securityorg.net portul 80.</p>
<p>2. Aceasta conexiune este masqueradata de un sistem care se ocupa cu acest<br />
lucru, pentru a folosi IP-ul sursa al sistemului ce realizeaza masqueradarea<br />
(1.2.3.4)</p>
<p>3. Insusi sistemul ce realizeaza masquerading initiaza o conexiune catre<br />
www.securityorg.net, portul 80, de la 1.2.3.4 (adresa interfetei externe)<br />
portul 1024</p>
<p>4. Codul NAT va modifica portul sursa al celei de-a doua conexiuni cu 1025,<br />
astfel ca sa nu existe conflict intre cele doua conexiuni.</p>
<p>Cand se realizeaza aceasta mapare automata a sursei, porturile sunt impartite<br />
in trei clase:</p>
<p>o Porturile sub 512<br />
o Porturile intre 512 si 1023<br />
o Porturile de la 1024, inclusiv, in sus</p>
<p>Un port nu va fi niciodata mapat automat intr-o clasa diferita.</p>
<p>6.3.5. Ce se intampla cand NAT-area nu reuseste</p>
<p>Daca nu mai este disponibil nici un mod in care sa se relizeze maparea unica a<br />
conexiunii cerute de catre utilizator, conexiunea va fi abandonata. Acest<br />
comportament se aplica ai in cazurile in care pachetele nu au putut fi<br />
clasificate ca parte a unei conexiuni, deoarece sunt malformate, sau sistemul<br />
nu mai are memorie libera, etc.</p>
<p>6.3.6. Mapari multiple, Suprapuneri si Conflicte</p>
<p>Daca ai reguli care folosesc NAT pentru mapare de porturi aflate intr-o raza<br />
comuna; codul NAT este destul de inteligent pentru a evita conflicte. Aceasta<br />
pentru ca, avand doua reguli, este corecta maparea adresei sursa pentru<br />
192.168.1.1 si respectiv 192.168.1.2 in adresa 1.2.3.4.</p>
<p>Mai mult, poti face mapare peste adrese IP reale folosite, atat timp cat<br />
aceste adrese trec deasemenea prin masina care realizeaza maparea. Asa ca daca<br />
ai o retea asignata (1.2.3.0/24), dar ai o retea interna care foloseste<br />
aceasta clasa de IP-uri si inca o retea care foloseste o clasa de adrese IP<br />
private 192.168.1.0/24, poti sa realizezi SNAT pentru adresele cu sursa IP<br />
192.168.1.0/24 peste adresele din reteaua 1.2.3.0, fara sa iti fie teama de<br />
conflicte:</p>
<p># iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \<br />
-j SNAT &#8211;to 1.2.3.0/24</p>
<p>Aceeasi logica se aplica adreselor folosite de insusi sistemul ce realizeaza<br />
NAT: in acest fel functioneaza si masquerading-ul (prin folosirea impreuna a<br />
adresei interfatei de catre pachetele masqueradate si pachetele &#8220;reale&#8221;<br />
venite de la insusi sistemul ca realizeaza masquerading-ul).</p>
<p>De altfel, poti mapa aceleasi pachete pe mai multe sisteme diferite, si<br />
acestea vor fi folosite in comun. De exemplu, daca nu doresti sa mappezi nimic<br />
peste adresa 1.2.3.5, ai putea sa dai urmatoarea comanda:</p>
<p># iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \<br />
-j SNAT &#8211;to 1.2.3.0-1.2.3.4 &#8211;to 1.2.3.6-1.2.3.254</p>
<p>6.3.7. Schimbarea destinatiei conexiunilor generate local</p>
<p>Codul NAT iti permite sa introduce reguli in chainul OUTPUT avand ca tinta<br />
DNAT, dar acest lucru nu este in intregime suportat in kernelurile 2.4 (poate<br />
fi programat dar are nevoie de noi optiuni, testari, si putina programare,<br />
asa ca daca nimeni nu il contacteaza pe Rusty pentru al scrie, nu o sa fie<br />
disponibil prea devreme).</p>
<p>Limitarea curenta este faptul ca poti sa schimbi destinatia pachetelor doar<br />
catre sistemul local ( &#8220;-j DNAT &#8211;to 127.0.0.1&#8243;), nu si catre alte sisteme, in<br />
caz contrar replicile nu vor fi primite in mod corect inapoi.</p>
<p>7. Protocoale speciale</p>
<p>Unele protocoale nu accepta sa fie NAT-uite. Pentru fiecare dintre aceste<br />
protocoale, doua module speciale trebuiesc scrie; unul pentru urmarirea<br />
conexiunilor si al doilea pentru operatia de NAT-are propriu-zisa.</p>
<p>In cadrul distributiei netfilter, exista module pentru ftp: ip_conntrack_ftp.o<br />
si ip_nat_ftp.o. Daca le inserezi in kernel (insmod) sau le compilezi in<br />
kernel, atunci realizarea oricarui tip de NAT pentru conexiuni ftp ar trebui<br />
sa functioneze. Daca nu, atunci poti folosi ftp pasiv, si chiar si atunci s-ar<br />
putea sa nu functioneze foarte sigur daca vrei sa realizezi alceva decat SNAT.</p>
<p>8. Avertizmente privind folosirea NAT</p>
<p>Daca realizezi NAT pentru o conexiune, pachetele venind din ambele sensuri<br />
(din afara si din inauntrul retelei) trebuie sa treaca prin sistemul care<br />
realizeaza NAT-area, in caz contrar lucrurile nu vor functiona sigur. In<br />
special, codul urmarii conexiunilor reansambleaza fragmentele, care inseamna<br />
ca nu numai depistarea conexiunilor nu va fi sigura, dar chiar si pachetele<br />
s-ar putea sa nu treaca deloc, ca fragmente fiind retinute.</p>
<p>9. Folosirea SNAT si rutarea</p>
<p>Daca doresti sa realizezi SNAT, vei dori sa fii sigur ca fiecare masina la<br />
care ajung pachete care sunt parte a unei conexiuni SNAT, vor trimite<br />
pachetele replica inapoi la sistemul care realizeaza SNAT-ul.<br />
De exemplu, daca mapezi niste pachete ce ies, cu adresa sursa 1.2.3.4, atunci<br />
ruterul extern trebuie sa stie ca trebuie sa trimita pachetele replica inapoi<br />
(care vor avea adresa destinatie 1.2.3.4) catre acest sistem.<br />
Acest lucru poate fi realizat in urmatoarele moduri:</p>
<p>1. Daca realizezi SNAT peste adresa propriului sistem (pentru care rutarea si<br />
toate celelalte merg deja), nu trebuie sa faci nimic</p>
<p>2. Daca realizezi SNAT peste o adresa nefolosita din propriul LAN (de exemplu,<br />
mappezi peste 1.2.3.99, o adresa IP nefolosita din reteaua ta  1.2.3.0/24),<br />
sistemul ce realizeaza NAT va trebui sa raspunda la cereri ARP pentru aceea<br />
adresa ca si pentru propria sa adresa: cea mai simpla metoda de a rezolva<br />
acest lucru este sa creezi un alias pentru adresa IP, de exemplu:</p>
<p># ip address add 1.2.3.99 dev eth0</p>
<p>3. Daca realizezi SNAT peste o adresa complet diferita, va trebui sa te asiguri<br />
ca masinile la care vor ajunge pachetele SNAT-atate vor ruta aceasta adresa<br />
inapoi catre sistemul pe care se realizeaza SNAT-ul. Aceasta este realizata<br />
deja daca sistemul care realizeaza SNAT-ul este gateway-ul lor default, in caz<br />
contrar va trebui sa adaugi o ruta pe fiecare sistem prin care trec pachetele<br />
modificate.</p>
<p>10. Folosirea DNAT pentru adrese aflate in aceeasi retea.</p>
<p>Daca realizezi forwardare de porturi inapoi in aceeasi retea, trebuie sa fii<br />
sigur ca atat pachetele viitoare cat si pachetele ce vin in replica vor trece<br />
prin sistemul ce realizeaza DNAT-ul (pentru ca acestea sa fie modificate).<br />
Codul NAT va bloca (inca din ver. 2.4.0-test6) pachetele ICMP de redirectare<br />
care rezulta atunci cand pachetele NAT-ate se indreapta catre aceeasi interfata<br />
spre care au venit, dar serverul care primeste acele pachete va incerca in<br />
continuare sa raspunda direct catre client (care nu va recunoaste pachetele<br />
replica).</p>
<p>Cazul clasic este cand un sistem din reteaua interna incearca sa acceseze<br />
serverul www &#8220;public&#8221;, care este defapt DNAT-at de la adresa publica (1.2.3.4)<br />
catre un sistem din reteaua interna (192.168.1.1), astfel:</p>
<p># iptables -t nat -A PREROUTING -d 1.2.3.4 \<br />
-p tcp &#8211;dport 80 -j DNAT &#8211;to 192.168.1.1</p>
<p>O cale este sa rulezi un server de DNS intern care sa stie adresa IP reala<br />
(interna) al site-ului public de web, si sa inainteze toate celelate cereri<br />
catre un server DNS extern. Aceasta inseamna ca va fi folosita o conexiune<br />
directa catre server-ul de web, fara sa mai fie nevoie de a trece prin<br />
sistemul care realizeaza NAT.</p>
<p>Cealalta cale este sa realizezi, pe sistemul care face DNAT, mapparea adresei<br />
sursa spre propria lui adresa pentru conexiunile venind din reteaua interna,<br />
pacalind serverul de web sa trimita pachetele replica spre masina ce se ocupa<br />
cu NAT-area. Pentru acest exemplu vom proceda astfel (presupunem ca adresa IP<br />
al sistemului care realizeaza NAT este 192.168.1.250):</p>
<p># iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24 \<br />
-p tcp &#8211;dport 80 -j SNAT &#8211;to 192.168.1.250</p>
<p>Deoarece regula din chain-ul PREROUTING este executata prima, pachetele vor fi<br />
deja destinate pentru server-ul de web intern: putem preciza care din pachete<br />
sunt din reteaua interna dupa adresa IP sursa.</p>
<p>11. Multumiri</p>
<p>Multumirile sunt in primul rand pentru WatchGuard, si David Bonn, care a<br />
crezut in ideea netfilter destul pentru a ma sustine sa o tranform in<br />
realitate. Si pentru toti ceilalti, care m-au suportat cand faceam pe grozavul<br />
cand am invatat despre uratenia NAT-ului, in special celor ce mi-au citit<br />
jurnalul.</p>
<p>Rusty.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=173</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Folosirea lui iptables pentru filtrarea pachetelor in kernelurile versiunea 2.4</title>
		<link>http://resurse-educationale.uv.ro/?p=171</link>
		<comments>http://resurse-educationale.uv.ro/?p=171#comments</comments>
		<pubDate>Wed, 06 Apr 2011 12:47:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Servers]]></category>
		<category><![CDATA[filtru de pachete]]></category>
		<category><![CDATA[icmp]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[ipchains]]></category>
		<category><![CDATA[ipfwadm]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[protocol]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[udp]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=171</guid>
		<description><![CDATA[traducere ver. 0.6 de catre Riddl Multumiri tuturor celor care m-au ajutat. Lui Gushterul in special. Deasemenea multumiri si lui Little Dragon. Observatie f importanta: probabil ca exista unele greseli in acest document. Am tradus si eu cum m-am priceput &#8230; <a href="http://resurse-educationale.uv.ro/?p=171">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>traducere ver. 0.6 de catre Riddl</p>
<p>Multumiri tuturor celor care m-au ajutat. Lui Gushterul in special.<br />
Deasemenea multumiri si lui Little Dragon.<br />
Observatie f importanta: probabil ca exista unele greseli in acest document.<br />
Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de<br />
traducere si pentru observatii pertinente mail me (Riddl) at<br />
&#8220;discutzii at gmx dot net&#8221;. Nu uitati sa precizati numele documentului.<br />
Multumesc anticipat.<br />
Aceasta versiune este putin modificata fata de original, deorece unii termeni<br />
sunau foarte aiurea in ro.<br />
Pentru ultima versiune a acestui document verifica<br />
&lt;http://www.securityorg.net/docs/&gt;.</p>
<p>Lecturare placuta!</p>
<p>______________________________________________________________________</p>
<p>Linux 2.4 Packet Filtering HOWTO<br />
Rusty Russel, lista de discutii netfilter@lists.samba.org<br />
$Revision: 1.2 $ $Date: 2002/02/19 11:33:43 $</p>
<p>Acest document descrie folosirea lui iptables pentru filtrarea pachetelor in<br />
kernelurile versiunea 2.4.<br />
______________________________________________________________________</p>
<p>Cuprins</p>
<p>1. Introducere<br />
2. Care este site-ul oficial? Exista vreo lista de discutii?<br />
3. Deci, ce inseamna filtru de pachete?<br />
3.1 De ce as vrea sa filtrez pachetele?<br />
3.2 Cum filtrez pachetele sub linux?<br />
3.2.1 iptables<br />
3.2.2 Crearea regulilor permanente<br />
4. Cine dracu esti tu, si de ce te joci cu kernelul meu?<br />
5. Ghidul intr-adevar rapid al lui Rusty pentru filtrarea de pachete<br />
6. Cum traverseaza pachetele filtrele?<br />
7. Folosirea iptables<br />
7.1 Ce vei vedea cand porneste calculatorul<br />
7.2 Operatii pentru o singura regula<br />
7.3 Optiuni de filtrare<br />
7.3.1 Specificarea IP-ului sursa si destinatie<br />
7.3.2 Specificarea inversa<br />
7.3.3 Specificarea protocolului<br />
7.3.4 Specificarea unei interfete<br />
7.3.5 Specificarea fragmentelor<br />
7.3.6 Optiuni extinse la iptables: Noi potriviri<br />
7.3.6.1 Optiuni extinse TCP<br />
7.3.6.1.1 O explicatie pentru flag-urile TCP<br />
7.3.6.2 Optiuni extinse UDP<br />
7.3.6.3 Optiuni extinse ICMP<br />
7.3.6.4 Alte optiuni extinse pentru potrivire<br />
7.3.6.5 Potrivirea dupa stare<br />
7.4 Argumente asupra tintei<br />
7.4.1 Chain-uri definite de utilizator<br />
7.4.2 Optiuni extinse la iptables: Noi tinte<br />
7.4.3 Tinte speciale construite default<br />
7.5 Operatii asupra unui intreg chain<br />
7.5.1 Creearea unui nou chain<br />
7.5.2 Stergerea unui chain<br />
7.5.3 Stergerea tuturor regulilor unui chain<br />
7.5.4 Listarea unui chain<br />
7.5.5 Resetarea counter-elor<br />
7.5.6 Setarea policy-ului</p>
<p>8. Folosirea ipchains si ipfwadm<br />
9. Folosirea impreuna a NAT-ului si a filtrarii de pachete<br />
10. Diferente intre iptables si ipchains<br />
11. Sfaturi asupra designului filtrului de pachete</p>
<p><span id="more-171"></span></p>
<p>______________________________________________________________________</p>
<p>1. Introducere</p>
<p>Bine ai venit, cititorule. (:))</p>
<p>Se presupune ca stii ce este aceea o adresa IP, adresa de retea, netmask,<br />
routare si DNS. Daca nu, se recomanda sa citesti Network Concepts Howto.<br />
Acest HOWTO loveste intre o introducere draguta (care te poate lasa<br />
increzator pentru moment, dar neprotejat in lumea reala) si o dezvaluire<br />
total neprelucrata (care ii vor lasa pe toti, mai putin caracterele tari,<br />
in confuzie, paranoici si in cautarea de arme grele).</p>
<p>Reteaua ta nu este sigura. Problema permiterii comunicarii rapide si<br />
comode, in acelasi timp cu restrictia acesteia numai pentru bine si nu in<br />
mod malefic, este asemanatoare cu alte probleme opuse  cum ar fi permiterea<br />
vorbirii libere in acelasi timp cu refuzarea unui strigat de &#8220;FOC!!&#8221; intr-un<br />
teatru aglomerat. Nu va fi rezolvata aceasta problema in spatiul acestui<br />
HOWTO.</p>
<p>Asa ca doar tu poti sa decizi unde va fi compromisul. Voi incerca sa te<br />
instruiesc in folosirea unor comenzi disponibile si a unor vulnerabilitati<br />
de care sa fii constient, in speranta ca vei folosi aceasta in mod pozitiv<br />
si nu in scopuri malefice. Aceasta este o alta problema asemanatoare.</p>
<p>(C) 2000 Paul &#8220;Rusty&#8221; Russell.  Cu licenta sub  GNU GPL.</p>
<p>2. Care este site-ul oficial? Exista vreo lista de discutii?</p>
<p>Sunt trei site-uri oficiale:</p>
<p>o 	Multumiri lui Filewatcher &lt;http://netfilter.filewatcher.org/&gt;.<br />
o 	Multumiri Echipei Samba si SGI &lt;http://netfilter.samba.org/&gt;.<br />
o 	Multumiri lui Harald Welte &lt;http://netfilter.gnumonks.org/&gt;.</p>
<p>Le poti accesa pe toate folosind round-robin DNS la:<br />
&lt;http://www.netfilter.org/&gt; si  &lt;http://www.iptables.org/&gt;</p>
<p>Pentru lista de discutii oficiala de la netfilter, vezi:<br />
&lt;http://www.netfilter.org/contact.html#list&gt;.</p>
<p>3. Deci, ce inseamna filtru de pachete?</p>
<p>Un filtru de pachete este o bucatica de software care se uita la header-ul<br />
pachetelor pe masura ce ele intra, si decid soarta intregului pachet. Acest<br />
filtru poate decide sa ignore pachetul (DROP) (respinge pachetul ca si cum<br />
nu l-ar fi primit niciodata), accepta (ACCEPT) pachetul (lasa pachetul sa<br />
intre), sau alte decizii mai complicate.</p>
<p>Sub linux, filtrarea de pachete este construita in kernel (ca modul sau<br />
construita in el), si sunt cateva lucruri complicate pe care le putem face cu<br />
pachetele, dar principiul general de examinare al header-ului pachetului si<br />
decidere asupra sortii pachetului este inca acolo.</p>
<p>3.1 De ce as vrea sa filtrez pachetele?</p>
<p>Control. Securitate. Vigilenta.</p>
<p>Control:<br />
cand folosesti un sistem Linux pentru a-ti conecta reteaua interna<br />
la o alta retea (sa spunem, Internet) ai posibilitatea de a permite<br />
un anumit tip de trafic, si sa refuzi pe altele. De exemplu,<br />
header-ul contine adresa destinatie a unui pachet, asa ca poti<br />
preveni pachetele sa se duca spre o anumita parte a retelei<br />
exterioare. Ca un alt exemplu, folosesc Netscape pentru accesarea<br />
arhivelor Dilbert. Sunt reclame pe pagina de la doubleclick.net, si<br />
Netscape imi pierde timpul incarcandu-le. Spunand filtrului de pachete<br />
sa nu permita pachete de la sau spre nici una din adresele detinute<br />
de catre doubleclick.net, rezolva aceasta problema (cu toate acestea<br />
sunt modalitati mai bune pentru aceasta: vezi Junkbuster).</p>
<p>Securitate:<br />
cand sistemul tau Linux este singurul intre haosul Internetului<br />
si reteaua ta ordonata si delicata, este placut sa stii ca poti<br />
sa restrictionezi ceea ce vine tropaind la usa. De exemplu, poti sa<br />
permiti la tot sa iasa din retea, dar ai putea fi ingrijorat de<br />
binecunoscutul &#8220;Ping al Mortii&#8221; venind de la persoanele din afara rau<br />
intentionate. Ca un alt exemplu, s-ar putea sa nu doresti ca<br />
persoanele din afara sa se telnet-uiasca pe sistemul tau Linux, chiar<br />
daca toate conturile tale au parole. Poate doresti (ca multi oameni)<br />
sa fii un observator  al Internet-ului, si nu server (de voie, sau in<br />
alt mod). Pur si simplu nu lasa pe nimeni sa se conecteze, punand<br />
fitrul de pachete sa respinga pachetele folosite la initierea de<br />
conexiuni.</p>
<p>Vigilenta:<br />
uneori o masina prost configurata in reteaua locala va decide sa<br />
arunce pachete spre lumea din afara. Este dragut sa-i spui filtrului de<br />
pachete sa te anunte daca se intampla ceva anormal; poate poti face<br />
ceva cu privire la acel lucru, sau poate esti doar curios.</p>
<p>3.2 Cum filtrez pachetele sub linux?</p>
<p>Kernelurile Linux au avut filtrare de pachete inca de la versiunile 1.1.<br />
Prima generatie, bazata pe ipfw de la BSD, a fost portata de catre Alan Cox<br />
spre sfarsitului anului 1994. Aceasta a fost dezvoltata de catre Jos Vos si<br />
altii pentru Linux 2.0; comanda pentru utilizatori &#8220;ipfwadm&#8221; controla<br />
regulile de filtrare ale kernelului. La mijlocului anului 1998, pentru Linux<br />
2.2, am rescris puternic kernelul cu ajutorul lui Michael Neuling, si am<br />
introdus comanda pentru utilizatori &#8220;ipchains&#8221;. In sfarsit, a patra generatie<br />
de comenzi, &#8220;iptables&#8221;, si o noua rescriere a kernelului s-a intamplat la<br />
mijlocul anului 1999 pentru Linux 2.4. Acest HOWTO este centrat pe iptables.</p>
<p>Ai nevoie de un kernel care are infrastructura netfilter in el: netfilter este<br />
un cadru in interiorul kernelului Linux in care alte lucruri (cum ar fi<br />
modulul de iptables) se pot introduce. Asta inseamna ca ai nevoie de kernel<br />
versiune 2.3.15 sau peste, si sa raspunzi &#8220;Y&#8221; la CONFIG_NETFILTER in<br />
configurarea kernelului.</p>
<p>Comanda iptables comunica kernelului si ii spune ce pachete sa filtreze.</p>
<p>3.2.1 iptables</p>
<p>Comanda iptables insereaza si sterge reguli din tabela de filtrare a<br />
pachetelor din kernel. Asta inseamna ca orice vei seta, va fi pierdut dupa<br />
rebootare; vezi &#8220;Crearea regulilor permanente&#8221; pentru cum sa fii sigur ca vor<br />
fi restaurate data urmatoare cand va boota Linuxul.</p>
<p>iptables este un inlocuitor pentru ipfwadm si ipchains: vezi &#8220;Folosirea<br />
ipchains si ipfwadm&#8221; pentru a afla cum poti evita fara probleme folosirea<br />
iptables daca folosesti una din aceste comenzi.</p>
<p>3.2.2 Crearea regulilor permanente</p>
<p>Setarile firewall-ului tau curent sunt pastrate in kernel, si de aceea vor fi<br />
pierdute la rebootare. Poti folosi scripturile iptables-save si<br />
iptables-restore sa le salvezi, sau restaurezi dintr-un fisier.</p>
<p>O alte cale este sa pui comenzile cerute sa iti setezi regulile intr-un<br />
script de initializare. Ai grija sa faci ceva inteligent in caz ca una din<br />
comenzi nu ar reusi (de obicei &#8220;exec /sbin/sulogin&#8221;).</p>
<p>4. Cine dracu esti tu, si de ce te joci cu kernelul meu?</p>
<p>Sunt Rusty Russel; cel ce mentine Linux IP Firewall si doar un alt<br />
programator care s-a intamplat sa fie in locul potrivit la momentul potrivit.<br />
Am scris ipchains (vezi mai sus &#8220;Cum filtrez pachetele sub linux?&#8221; pentru a da<br />
credit celor care au facut de fapt munca), si am invatat suficient sa fac<br />
cum trebuie de data asta filtrarea de pachete. Sper.</p>
<p>WatchGuard &lt;http://www.watchguard.com&gt;, o compania excelenta de firewall-uri<br />
care vinde chiar simpaticul plug-in Firebox, s-a oferit sa ma plateasca sa nu<br />
fac nimic, pentru a-mi petrece tot timpul meu sa scriu asta, si sa imi<br />
mentin munca anterioara. Am preconizat 6 luni, si mi-au luat 12, dar la<br />
sfarsit am simtit ca l-am facut cum trebuie. Multe rescrieri, o cedare a<br />
unui hardisk, un laptop furat, doua sisteme de fisiere corupte si un<br />
monitor spart mai tarziu, asta este.</p>
<p>Cat sunt aici, vreau sa indrept niste idei gresite ale unor oameni: nu sunt<br />
un guru al kernelului. Stiu asta, pentru ca munca mea pe partea din kernel<br />
m-a adus in contact cu unii din acestia: David S. Miller, Alexey Kuznetsov,<br />
Andi Kleen, Alan Cox. Oricum, sunt cu totii ocupati sa faca magia din<br />
interior,  lasandu-ma sa avansez cu greu prin superficialitate unde este<br />
sigur.</p>
<p>5. Ghidul intr-adevar rapid al lui Rusty pentru filtrarea de pachete</p>
<p>Cei mai multi oameni au o singura conexiune PPP spre Internet, si nu vor ca<br />
cineva sa intre inapoi in reteaua lor, iata firewall-ul:</p>
<p>## Se insereaza modulele pentru connection-tracking (nu este necesar<br />
## daca sunt compilate in kernel)<br />
# insmod ip_conntrack<br />
# insmod ip_conntrack_ftp</p>
<p>## Se creeaza chain-ul care blocheaza conexiunile noi, cu exceptia celor<br />
## venite din interior.</p>
<p># iptables -N block<br />
# iptables -A block -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
# iptables -A block -m state &#8211;state NEW -i ! ppp0 -j ACCEPT<br />
# iptables -A block -j DROP</p>
<p>## Se sare la acest chain din chain-urile INPUT si FORWARD<br />
# iptables -A INPUT -j block<br />
# iptables -A FORWARD -j block</p>
<p>6. Cum traverseaza pachetele filtrele?</p>
<p>Kernelul porneste cu trei liste de reguli in tabela de &#8220;filtrare&#8221;; aceste<br />
liste sunt numite chain-uri ale firewall-ului sau pur si simplu chain-uri<br />
(lanturi). Cele trei chain-uri se numesc INPUT, OUTPUT si FORWARD.</p>
<p>Pentru fanii ASCII, chain-urile sunt aranjate cam in felul urmator: (Nota:<br />
acesta este un aranjament foarte diferit fata de cel din kernelurile ver.<br />
2.0 si 2.2 !)</p>
<p>_____<br />
Incoming                 /     \         Outgoing<br />
&#8211;&gt;[Routing ]&#8212;&gt;|FORWARD|&#8212;&#8212;-&gt;<br />
[Decision]     \_____/        ^<br />
|                        |<br />
v                       ____<br />
___                     /    \<br />
/   \                   |OUTPUT|<br />
|INPUT|                   \____/<br />
\___/                       ^<br />
|                        |<br />
&#8212;-&gt; Local Process &#8212;-</p>
<p>Cele trei cercuri reprezinta cele trei chain-uri despre care am vorbit<br />
anterior. Cand un pachet ajunge la un cerc din diagrama, acel chain este<br />
examinat pentru a decide soarta pachetului. In cazul in care chain-ul spune sa<br />
ignore pachetul (DROP), este taiat acolo, daca insa chain-ul spune sa accepte<br />
pachetul (ACCEPT), atunci pachetul continua sa parcurga diagrama.</p>
<p>Un chain este o lista de verificare cu reguli. Fiecare regula spune &#8220;daca<br />
headerul pachetului arata asa, atunci iata ce sa faci cu pachetul&#8221;. Daca<br />
regula nu se potriveste cu pachetul, atunci urmatoarea regula din chain<br />
(lant) este examinata. In final, daca nu mai exista reguli de examinat,<br />
kernelul se uita la politica acelui chain-ului pentru a decide soarta pachetului.<br />
Intr-un sistem sigur, politica in chain-uri este de obicei sa taie pachetul<br />
(DROP).</p>
<p>1. Cand un pachet vine (sa zicem, prin placa de retea) kernelul se<br />
uita intai la destinatia pachetului: aceasta se numeste &#8220;routing&#8221;<br />
(rutare).</p>
<p>2. Daca pachetul este destinat pentru aceasta masina, pachetul trece pe<br />
diagrama in chain-ul INPUT. Daca trece de acest chain, orice proces care<br />
asteapta acel pachet il va primi.</p>
<p>3. In caz contrar, daca kernelul nu are forwarding-ul pus, sau nu stie<br />
cum sa forward-eze pachetul, acesta este ignorat. Daca este pus<br />
forwarding-ul, si pachetul are ca destinatie o alta interfata de<br />
retea (daca mai ai inca una), atunci pachetul se duce in diagrama<br />
noastra direct catre chain-ul FORWARD. Daca este acceptat pachetul va<br />
fi transmis.</p>
<p>4. In final, un program ce ruleaza pe sistem poate trimite pachete.<br />
Aceste pachete trec direct in chain-ul OUTPUT: daca este acceptat<br />
pachetul isi continua drumul fara sa conteze interfata spre care este<br />
destinat.</p>
<p>7. Folosirea iptables</p>
<p>iptables are o pagina de manual destul de detaliata (man iptables), si daca<br />
ai nevoie de detalii mai in amanunt. Aceia dintre voi familiarizati cu<br />
ipchains vor dori poate sa se uite la &#8220;Diferente intre iptables si<br />
ipchains&#8221;; sunt comenzi foarte similare.</p>
<p>Sunt mai multe lucruri pe care le poti face cu iptables. Pornesti la drum cu<br />
trei chainu-ri default care nu pot fi sterse INPUT, OUTPUT si FORWARD. Sa<br />
privim operatiile care se pot aplica pentru un intreg chain:</p>
<p>1. Creearea unui chain nou (-N).<br />
2. Stergerea unui chain gol (care nu contine reguli) (-X).<br />
3. Schimbarea politicii pentru un chain default (-P).<br />
4. Listarea regulilor dintr-un chain (-L).<br />
5. Stergerea tuturor regulilor dintr-un chain (-F).<br />
6. Resetarea counter-elor de pachete si bytes pentru toate regulile<br />
dintr-un chain (-Z).</p>
<p>Sunt mai multe moduri in care se pot manipula regulile intr-un chain:</p>
<p>1. Adaugarea in coada chain-ului a unei noi reguli (-A).<br />
2. Insereaza o regula noua la o anumita pozitie in chain (-I). Daca<br />
nu este precizata pozitia printr-un numar atunci regula este adaugata<br />
la inceputul chain-ului.<br />
3. Inlocuieste o regula la o anumita pozitie in chain (-R).<br />
4. Sterge o regula la o anumita pozitie in chain, sau prima care se<br />
potriveste (-D).</p>
<p>7.1 Ce vei vedea cand porneste calculatorul</p>
<p>Iptables poate fi un modul, numit (&#8220;iptable_filter.o&#8221;), care ar trebui sa fie<br />
incarcat in mod automat cand rulezi prima oara iptables. Poate fi deasemenea<br />
compilat in kernel in mod permament.</p>
<p>Inainte de rularea oricarei comenzi iptables (ai grija: unele distributii vor<br />
rula iptables in scripturile lor de initializare), nu vor fi reguli in nici<br />
una din chain-urile default (&#8220;INPUT&#8221;, &#8220;OUTPUT&#8221; si &#8220;FORWARD&#8221;), toate<br />
chain-urile vor avea politica de acceptare a pachetelor (ACCEPT). Poti schimba<br />
politica default al chain-ului FORWARD prin stipularea optiunii &#8220;forward=0&#8243;<br />
modulului iptable_filter. (n.t. sau &#8220;echo 0 &gt; /proc/sys/net/ipv4/ip_forward&#8221;,<br />
depinde insa si de distributie, pe redhat default inseamna ca forward-ul<br />
este 0)</p>
<p>7.2 Operatii pentru o singura regula</p>
<p>Aceasta este paine-si-untul, sarea si piperul, si ce mai vreti voi, a filtrarii<br />
de pachete; manipularea regulilor. Cel mai obisnuit, vei folosi probabil<br />
comenzile de adaugare (-A) si stergere (-D). Celelalte (-I pentru inserare<br />
si -R pentru inlocuire) sunt doar extensii ale acestor concepte.</p>
<p>Fiecare regula specifica o multime de conditii pe care un pachet trebuie sa le<br />
indeplineasca si ce sa faca daca acestea sunt indeplinite (o &#8220;tinta&#8221;<br />
(target)). De exemplu, s-ar putea sa doresti sa ignori toate pachetele de<br />
tip ICMP care vin de la adresa 127.0.0.1. Deci, in acest caz conditiile<br />
noastre sunt ca protocolul sa fie ICMP si ca adresa sursa sa fie 127.0.0.1.<br />
&#8220;tinta&#8221; noastra este DROP. 127.0.0.1 este interfata &#8220;loopback&#8221;, pe care o ai<br />
chiar daca nu ai conexiune reala de retea. Poti folosi programul &#8220;ping&#8221;<br />
pentru a genera acest tip de pachete (pur si simplu trimite pachete ICMP de<br />
tip 8 (echo request) la care toate host-urile ar trebui sa raspunda cu<br />
pachete ICMP de tip 0 (echo replay)). Aceast program este foarte folositor<br />
pentru teste.</p>
<p># ping -c 1 127.0.0.1<br />
PING 127.0.0.1 (127.0.0.1): 56 data bytes<br />
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms</p>
<p>&#8212; 127.0.0.1 ping statistics &#8212;<br />
1 packets transmitted, 1 packets received, 0% packet loss<br />
round-trip min/avg/max = 0.2/0.2/0.2 ms<br />
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP<br />
# ping -c 1 127.0.0.1<br />
PING 127.0.0.1 (127.0.0.1): 56 data bytes</p>
<p>&#8212; 127.0.0.1 ping statistics &#8212;<br />
1 packets transmitted, 0 packets received, 100% packet loss<br />
#</p>
<p>Poti vedea aici ca primul ping reuseste (&#8220;-c 1&#8243; spune sa sa trimita doar un<br />
singur pachet).</p>
<p>Apoi adaugam in coada (-A) chain-ului &#8220;INPUT&#8221;, o regula ce spune ca<br />
pentru pachetele de la 127.0.0.1 (&#8220;-s 127.0.0.1&#8243;) de tip ICMP (&#8220;-p icmp&#8221;)<br />
trebuie sa sarim la &#8220;DROP&#8221; (&#8220;-j DROP&#8221;).</p>
<p>Apoi testam regula noastra, folosind al doilea ping. Va fi o pauza pana cand<br />
programul se da batut sa astepte un raspuns care nu va veni niciodata. (:)),<br />
cat de DRAMATIC)</p>
<p>Am putea sa stergem regula in  doua moduri. Intai, deoarece stim ca este<br />
singura regula din chain-ul INPUT, putem folosi o stergere numarata, ca<br />
in:</p>
<p># iptables -D INPUT 1<br />
#</p>
<p>Pentru a sterge regula cu numarul 1 in chain-ul de INPUT.</p>
<p>Al doilea mod este sa scriem comanda prin care am introdus regula -A, dar sa<br />
inlocuim -A cu -D. Aceasta este folositor cand ai un chain complex de reguli<br />
si nu doresti sa le numeri ca sa iti dai seama ca este a 37-a regula de<br />
care vrei sa scapi. In aces caz, vom folosi:</p>
<p># iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP<br />
#</p>
<p>Sintaxa comenzii -D trebuie sa aiba exact aceleasi optiuni cum are comanda -A<br />
(sau -I, sau -R). Daca sunt reguli identice in acelasi chain, numai prima<br />
regula va fi stearsa.</p>
<p>7.3 Optiuni de filtrare</p>
<p>Am vazut folosirea optiunii &#8220;-p&#8221; pentru a specifica protocolul, si optiunii<br />
&#8220;-s&#8221; pentru a specifica adresa sursa, dar sunt alte optiuni pe care le putem<br />
folosi pentru a preciza caracteristici ale pachetului. Ceea ce urmeaza este<br />
un compedium complet.</p>
<p>7.3.1 Specificarea IP-ului sursa si destinatie</p>
<p>Adresele IP ale sursei (&#8220;-s&#8221;, &#8220;&#8211;source&#8221; sau &#8220;&#8211;src&#8221;) si destinatiei (&#8220;-d&#8221;,<br />
&#8220;&#8211;destination&#8221; sau &#8220;&#8211;dst&#8221;) pot fi specificate in patru moduri. Cea mai<br />
obisnuita forma este sa folosesti numele complet, cum ar fi &#8220;localhost&#8221; sau<br />
&#8220;www.securityorg.net&#8221;. Cea de-a doua cale este sa specifici adresa IP cum ar fi<br />
&#8220;127.0.0.1&#8243;.</p>
<p>Cea de a treia si a patra cale permite specificarea unui grup de adrese IP,<br />
cum ar fi &#8220;199.95.207.0/24&#8243; sau &#8220;199.95.207.0/255.255.255.0&#8243;. Amandoua<br />
specifica orice adresa IP de la 199.95.207.0 pana la 199.95.207.255 inclusiv;<br />
cifrele dupa &#8220;/&#8221; spun care parti din adresa IP sunt semnificative. &#8220;/32&#8243; sau<br />
&#8220;/255.255.255.255&#8243; este default (se potriveste cu toata adresa IP). Pentru a<br />
specifica oricare adresa IP &#8220;/0&#8243; poate fi folosit, astfel:</p>
<p>[ NOTA: "-s 0/0" este redundant aici. ]<br />
# iptables -A INPUT -s 0/0 -j DROP<br />
#</p>
<p>Aceasta este folosit in mod rar, deoarece efectul de mai sus este asemanator<br />
cu nespecificare deloc a optiunii &#8220;-s&#8221;.</p>
<p>7.3.2 Specificarea inversa</p>
<p>Multe optiuni, inclusiv optiunile &#8220;-s&#8221; (sau &#8220;&#8211;source&#8221;) si &#8220;-d&#8221;<br />
(&#8220;&#8211;destination&#8221;) pot avea argumentele precedate de &#8220;!&#8221; (pronuntat &#8220;nu&#8221;)<br />
pentru a corespunde adreselor care NU sunt egale cu adresele date. De exemplu,<br />
&#8220;-s ! localhost&#8221; corespunde oricarui pachet care nu vine de la localhost.</p>
<p>7.3.3 Specificarea protocolului</p>
<p>Protocolul poate fi specificat prin optiunea &#8220;-p&#8221; (sau &#8220;&#8211;protocol&#8221;).<br />
Protocolul poate fi un numar ( daca stii valorile numerice de protocol pentru<br />
IP) sau un nume pentru cazurile speciale de &#8220;TCP&#8221;, &#8220;UDP&#8221; sau &#8220;ICMP&#8221;. Nu<br />
conteaza daca se foloseste sau nu CAPS, asa ca &#8220;tcp&#8221; merge la fel ca si<br />
&#8220;TCP&#8221;.</p>
<p>Numele protocolului poate fi precedat de &#8220;!&#8221;, pentru a inversa, ca si &#8220;-p !<br />
tcp&#8221; pentru a specifica pachetele care nu sunt TCP.</p>
<p>7.3.4 Specificarea unei interfete</p>
<p>Optiunea &#8220;-i&#8221; (sau &#8220;&#8211;in-interface&#8221;) si &#8220;-o&#8221; (sau &#8220;&#8211;out-interface&#8221;)<br />
specifica numele interfatei cu care sa corespunda. O interfata este<br />
dispozitivul fizic prin care intra pachetul (&#8220;-i&#8221;) sau prin care iese<br />
pachetul (&#8220;-o&#8221;). Poti folosi comanda ifconfig pentru a lista interfetele<br />
care sunt &#8220;sus&#8221; (i.e., in stare de functionare in acel moment).</p>
<p>Pachetele care traverseaza chain-ul &#8220;INPUT&#8221; nu au o interfata de iesire, asa<br />
ca orice regula care foloseste &#8220;-o&#8221; in acest chain nu se va potrivi<br />
niciodata. In mod similar pachetele care travereseaza chain-ul OUTPUT nu au o<br />
interfata de intrare, asa ca orice regula care foloseste &#8220;-i&#8221; in acest<br />
chain nu se va potrivi niciodata.</p>
<p>Doar pachetele care travereseaza chain-ul FORWARD au o interata de intrare si<br />
de iesire. Este perfect valabil sa specifici o interfata care nu exista;<br />
regula nu se va potrivi cu nici un pachet pana cand interfata nu este sus.<br />
Aceasta este extrem de folositor pentru legaturi PPP de dial-up (de obicei<br />
interfete ppp0) si asemanatoare.</p>
<p>Ca un caz special, un nume de interfata terminandu-se cu &#8220;+&#8221; se va potrivi cu<br />
toate interfetele (fie ca exista sau nu) care incep cu acel sir de caractere.<br />
De exemplu pentru a specifica o regula care sa se potriveasca tuturor<br />
interfetelor PPP, optiunea -i ppp+ ar fi folosita.</p>
<p>Numele interfetei poate fi precedata de &#8220;!&#8221; cu spatii in jur, pentru a<br />
corespunde cu pachetul care nu se potriveste cu intefata specificata, de<br />
exemplu: -i ! ppp+.</p>
<p>7.3.5 Specificarea fragmentelor</p>
<p>Uneori un pachet este prea mare pentru a incape cu totul pe conexiune. Cand<br />
aceasta se intampla, pachetul este divizat in fragmente, si trimis ca pachete<br />
multiple. Celalalt capat reansambleaza aceste fragmente pentru a construi<br />
intregul pachet.</p>
<p>Problema cu fragmentele este ca primul fragment are campurile complete in<br />
header (IP + TCP, UDP si ICMP) pentru a le examina, dar cele care urmeaza au<br />
doar o submultime a header-elor (IP fara campurile protocolului aditional).<br />
De aceea privirea in header-e dupa protocol in pachetelor care urmeaza (cum se<br />
face in cazul  TCP, UDP si ICMP)  nu este posibila.</p>
<p>Daca faci connection tracking sau NAT, atunci toate fragmentele vor fi reunite<br />
inainte de a ajunge la codul filtrului de pachete, asa ca nu trebuie sa te<br />
ingrijorezi vreodata pentru fragmente.</p>
<p>Te rog sa retii de asemenea: chain-ul INPUT al tabelei de filtrare (sau a<br />
oricarei alte tabele care depinde de NF_IP_LOCAL_IN) este traversat dupa<br />
defragmentarea stivei principale IP.</p>
<p>In caz contrar, este important sa stii cum sunt tratate fragmentele de catre<br />
regulile de filtrare. Orice regula de filtrare care cere informatii pe care<br />
nu le avem nu se va potrivi. Aceasta inseamna ca primul fragment este tratat<br />
ca orice alt pachet. Al doilea si urmatoarele nu vor mai fi. De aceea o<br />
regula  -p tcp &#8211;sport www (specificand un port sursa &#8220;www&#8221;) nu se vor potrivi<br />
cu un fragment (altul decat primul). Nici regula opusa nu va face acest lucru<br />
-p tcp &#8211;sport ! www.</p>
<p>Oricum, poti sa specifici o regula special pentru fragmentul al doilea si<br />
urmatoarele, folosind optiunea &#8220;-f&#8221; (sau &#8220;&#8211;fragment&#8221;). Este de asemenea<br />
legal sa specifici ca o regula nu se aplica la al doilea si urmatoarele<br />
fragmente, prin precedarea lui &#8220;-f&#8221; cu &#8220;!&#8221;.</p>
<p>De obicei este considerat sigur sa lasi sa treaca al doilea si urmatoarele<br />
fragmente, deoarece filtrarea va afecta primul fragment, si de aceea previne<br />
reansamblarea pe calculatorul destinatie; cu toate acestea, sunt cunoscute<br />
bug-uri care permit caderea sistemului doar prin simpla trasnmitere de<br />
fragmente. Este decizia ta.</p>
<p>Nota pentru network-heads: pachetele cu malformatii (pachete TCP, UDP si<br />
ICMP prea scurte codului de firewall ca sa citeasca tipul portului sau codul<br />
ICMP si tipul) sunt ignorate cand asemenea examinarii sunt incercate.<br />
Astfel sunt si fragmentele TCP care pornesc de la pozitia 8.</p>
<p>Ca un exemplu, urmatoarea regula va ignora fragmentele care se duc spre<br />
192.168.1.1:</p>
<p># iptables -A OUTPUT -f -d 192.168.1.1 -j DROP<br />
#</p>
<p>7.3.6 Optiuni extinse la iptables: Noi potriviri</p>
<p>iptables este extensibil, asta inseamna ca amandoua, iptables si kernelul pot<br />
fi extinse pentru a suporta noi optiuni.</p>
<p>Unele dintre aceste optiuni sunt standard, altele sunt mai exotice. Aceste<br />
optiuni pot fi facute de catre alti oameni si distribuite.</p>
<p>Extensiile kernelului sunt gasite deobicei in subdirectorul de module ale<br />
kernelului cum ar fi /lib/modules/2.4.0-test10/kernel/net/ipv4/netfilter. Ele<br />
se incarca automat daca kernelul tau a fost compilat cu optiunea CONFIG_KMOD,<br />
asa ca nu o sa fie necesar sa le incarci manual.</p>
<p>Extensiile la programul iptables sunt librarii shared care de obicei se gasesc<br />
in /usr/local/lib/iptables/, deseamenea o distributie poate sa le puna in<br />
directorul /lib/iptables sau /usr/lib/iptables.</p>
<p>Optiuniile vin in doua feluri: noi tinte si noi potriviri (vom vorbi despre<br />
tinte ceva mai tarziu). Unele protocoale automat ofera noi teste pentru<br />
pachete: in mod curent acestea sunt TCP, UDP si ICMP, cum sunt aratate mai jos.</p>
<p>Pentru acestea vei putea sa specifici noile teste in linia de comanda dupa<br />
optiunea &#8220;-p&#8221;, care va pune la dispozitie automat optiunile extinse. Pentru<br />
a preciza teste noi, foloseste optiunea &#8220;-m&#8221; pentru a incarca extensia, dupa<br />
care optiunile extinse vor putea fi folosite.</p>
<p>Pentru a vedea help-ul pentru  optiunile extinse foloseste optiunea de<br />
incarcare (&#8220;-p&#8221;, &#8220;-j&#8221; sau &#8220;-m&#8221;) urmat de &#8220;-h&#8221; sau &#8220;&#8211;help&#8221;, de exemplu:</p>
<p># iptables -p tcp &#8211;help<br />
#</p>
<p>7.3.6.1 Optiuni extinse TCP</p>
<p>Optiunile extinse TCP sunt disponibile in mod automat daca se specifica<br />
optiunea &#8220;-p tcp&#8221;. Aceste optiuni sunt urmatoarele (nici una dintre ele nu<br />
se vor potrivi cu fragmente):</p>
<p>&#8211;tcp-flags<br />
poate fi urmat de semnul optional &#8220;!&#8221;, apoi de doua siruri de<br />
flag-uri, care permite filtrarea dupa anumite flag-uri. Primul sir de<br />
flag reprezinta mask-ul, flag-urile pe care doresti a le examina. Al<br />
doilea sir reprezinta care dintre acestea ar trebui sa fie prezente.<br />
De exemplu:</p>
<p># iptables -A INPUT &#8211;protocol tcp &#8211;tcp-flags ALL SYN,ACK -j DROP</p>
<p>Aceasta comanda spune ca toate flag-urile trebuiesc examinate (&#8220;ALL&#8221;<br />
este sinonim cu &#8220;SYN,ACK,FIN,RST,URG,PSH&#8221;), dar doar SYN si ACK<br />
trebuie sa fie setate. Exista de asemnea un argumente &#8220;NONE&#8221; similar<br />
pentru nici unul dintre acestea.</p>
<p>&#8211;syn<br />
In mod optional precedata de semnul &#8220;!&#8221;, este o prescurtare pentru<br />
&#8220;&#8211;tcp-flags  SYN,RST,ACK SYN&#8221;</p>
<p>&#8211;source-port<br />
poate fi urmat de un optional &#8220;!&#8221;, si fie de un singur port, fie<br />
de o sir de porturi. Porturile pot fi specificate fie folosind numere<br />
fie folosind nume, asa cum sunt specificate in /etc/services.<br />
sirurile se specifica prin doua porturi despartite de &#8220;:&#8221;, sau<br />
(pentru a specifica o sir de porturi mai mare sau egal cu un port<br />
dat) un port urmat de &#8220;:&#8221;, sau (pentru a specifica o lista de porturi<br />
mai mica sau egala decat un port dat) un port precedat de &#8220;:&#8221;.</p>
<p>&#8211;sport este sinonim cu &#8211;source-port</p>
<p>&#8211;destination-port<br />
si<br />
&#8211;dport<br />
sunt similare cu modul in care se specifica portul sursa numai ca in<br />
loc de portul sursa se face potrivirea dupa portul destinatie.</p>
<p>&#8211;tcp-option<br />
urmat de un optional &#8220;!&#8221; si un numar, se potriveste pentru un<br />
pachet cu optiunea TCP egala cu acel numar. Un pachet care nu are un<br />
header complet TCP este ignorat automat daca este facuta incercarea<br />
de a se examina headerele TCP.</p>
<p>7.3.6.1.1 O explicatie pentru flag-urile TCP</p>
<p>Uneori este folositor sa permiti conexiunile TCP intr-o singura directie, nu<br />
si in cealalta. De exemplu, ai putea sa permiti conexiuni catre un server<br />
extern WWW, dar nici o conexiune de la acel server.</p>
<p>Naiv ar fi sa blochezi pachetele TCP dinspre server. Din pacate, conexiunile<br />
TCP cer pachetele sa circule in ambele directii.</p>
<p>Solutia ar fi sa blochezi numai pachetele folosite pentru a initia<br />
conexiuni. Aceste pachete sunt numite pachete SYN (ok, tehnic sunt pachete cu<br />
flag SYN pus si cu flagurile RST si ACK nepuse, dar le numim pe scurt<br />
pachete SYN). Prin ignorarea acestor pachete, putem sa oprim aceste<br />
conexiuni.</p>
<p>Optiunea &#8220;&#8211;syn&#8221; este folosita pentru aceasta; este valida numai pentru<br />
regulile in care specificam tcp ca protocol. De exemplu, pentru a specifica<br />
incercarile de conexiune de la 192.168.1.1:</p>
<p>-p TCP -s 192.168.1.1 &#8211;syn</p>
<p>Aceasta optiune poate fi inversat prin precedarea &#8220;&#8211;syn&#8221; cu semnul &#8220;!&#8221;.</p>
<p>7.3.6.2 Optiuni extinse UDP</p>
<p>Aceste optiuni sunt automat disponibile cand se specifica &#8220;-p udp&#8221;. Acestea<br />
sunt: &#8220;&#8211;source-port&#8221;, &#8220;&#8211;sport&#8221;,&#8221;&#8211;destination-port&#8221; si &#8220;&#8211;dport&#8221; care au<br />
fost detaliate mai sus.</p>
<p>7.3.6.3 Optiuni extinse ICMP</p>
<p>Aceste optiuni sunt automat disponibile cand se specifica &#8220;-p icmp&#8221;. Este<br />
doar o singura optiune noua:</p>
<p>&#8211;icmp-type<br />
urmat de un semnul optional &#8220;!&#8221;, apoi de numele tipului icmp (ex.<br />
&#8220;host-unreachable&#8221;), sau tipul numeric (ex. &#8220;3&#8243;), sau tipul numeric<br />
si codul separate de &#8220;/&#8221; (ex. &#8220;3/3&#8243;). O lista a numelor de tipuri de<br />
pachete icmp este data folosind &#8220;-p icmp &#8211;help&#8221;.</p>
<p>7.3.6.4 Alte optiuni extinse pentru potrivire</p>
<p>Alte optiuni extinse in pachtetul de filtrare sunt optiuni demonstrative,<br />
care (daca sunt instalate) pot fi invocate cu optiunea &#8220;-m&#8221;.</p>
<p>mac</p>
<p>Acest modul trebuie in mod explicit specificat prin optiunea &#8220;-m mac&#8221;<br />
sau &#8220;&#8211;match mac&#8221;. Este folosit pentru a se potrivi cu pachetele ce au o<br />
anumita adresa ethernet MAC, si de aceea este folositoare numai<br />
pentru pachetele care traverseaza chain-urile PREROUTING si INPUT.<br />
Este disponibila o singura optiune noua:</p>
<p>&#8211;mac-source<br />
urmat de semnul optional &#8220;!&#8221;, apoi de o adresa ethernet in notatie<br />
hexa separata prin &#8220;:&#8221;, ex. &#8220;&#8211;mac-source 00:60:08:91:CC:B7&#8243;.</p>
<p>limit</p>
<p>Acest modul trebuie in mod explicit specificat prin optiunea &#8220;-m limit&#8221;<br />
sau cu &#8220;&#8211;match limit&#8221;. Este folosit pentru a restrange rata de<br />
potriviri, ca de exemplu pentru reprimarea mesajelor in log-uri<br />
(log-urile sunt fisierele in care sistemul scrie anumite date<br />
considerate importante, in ideea de a putea fi accesate mai tarziu). Se<br />
vor potrivi numai un numar dat de pachete pe secunda (default 3<br />
potriviri pe ora, la un numar maxim de 5 potriviri). Sunt disponibile<br />
doua optiuni:</p>
<p>&#8211;limit<br />
urmat de un numar; specifica numarul maxim de potriviri permise pe<br />
secunda. Numarul poate fi specificat pe unitati de timp explicite,<br />
folosind &#8220;/second&#8221;, &#8220;/minute&#8221;, &#8220;/hour&#8221; or &#8220;/day&#8221;, sau parti din ele<br />
(ex. &#8220;5/second&#8221; este la fel cu &#8220;5/s&#8221;).</p>
<p>&#8211;limit-burst<br />
urmat de un numar, indica numarul maxim de potriviri dupa care limita<br />
de mai sus intra in actiune.</p>
<p>Aceasta potrvire poate adesea fi folosita cu tinta LOG pentru a face<br />
logare limitata dupa o rata. Pentru a intelege cum functioneaza sa ne<br />
uitam la urmatoarea regula care logheaza cu parametri de limita default:</p>
<p># iptables -A FORWARD -m limit -j LOG</p>
<p>Prima data cand se ajunge la aceasta regula, pachetul va fi scris in<br />
log-uri, de fapt, deorece numarul limita este 5, primele 5 pachete vor<br />
ajunge in log-uri. Dupa aceasta vor trece 20 de minute pana cand alt<br />
pachet sa ajunga in log-uri datorita acestei reguli, fara sa conteze<br />
numarul de pachete care ajung la regula. Dupa 20 de minute<br />
limit-burst-ul,	numarul de pachete care vor putea fi primite va fi unu,<br />
dupa inca 20 de minute va mai creste cu o unitate, daca nici un pachet<br />
nu s-a potrivit cu regula. Deasemenea, la fiecare 20 de minute	care<br />
trec fara ca pachete sa se potriveasca  regulii, numarul limita va<br />
creste cu o unitate; daca nici un pachet nu se potriveste cu regula dupa 	100 de minute, numarul limita va fi din nou atins, inapoi de unde am<br />
plecat.</p>
<p>Nota: nu poti crea o regula cu un timp de reincarcare mai mare de 59<br />
de ore, asa ca daca pui o limita de 1/zi, atunci numarul maxim de<br />
potriviri (burst-rate) trebuie sa fie mai mic decat 3.</p>
<p>Poti de asemenea sa folosesti acest modul pentru a te feri de<br />
diferitele atacuri denial of service (DoS) cu o rata mai mare pentru a<br />
creste sensibilitatea.</p>
<p>Protectie pentru syn-flood:</p>
<p># iptables -A FORWARD -p tcp &#8211;syn -m limit 1/s -j ACCEPT</p>
<p>Pentru scannere de porturi clandestine:</p>
<p># iptables -A FORWARD -p tcp &#8211;tcp-flags SYN,ACK,FIN,RST RST<br />
-m limit &#8211;limit 1/s -j ACCEPT</p>
<p>Pingul mortii:</p>
<p># iptables -A FORWARD -p icmp &#8211;icmp-type echo-request -m<br />
-m limit &#8211;limit 1/s -j ACCEPT</p>
<p>Acest modul se comporta ca o &#8220;usa histeresis&#8221;, ca in graficul urmator:</p>
<p>rata (pachete/s)<br />
^        .&#8212;.<br />
|       / DoS \<br />
|      /       \<br />
Limita   DoS -|&#8230;..:&#8230;&#8230;&#8230;\&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<br />
= (limit *  |    /:          \<br />
limit-burst) |   / :           \         .-.<br />
|  /  :            \       /   \<br />
| /   :             \     /     \<br />
End of DoS  -|/&#8230;.:&#8230;&#8230;&#8230;&#8230;..:&#8230;/&#8230;&#8230;.\&#8230;./.<br />
= limit     |     :              :&#8221;-&#8221;         &#8220;&#8211;&#8221;<br />
&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt; time (s)<br />
LOGIC =&gt;  Potrivire | Nepotrivire  |  Potrivire</p>
<p>Sa consideram ca avem o potrivire de un pachet pe secunda cu o<br />
limita maxima de 5 pachete, dar pachetele vin cu o rata de patru pe<br />
secunda timp de 3 secunde, apoi incep din nou sa vina peste 3 secunde.</p>
<p>&lt;&#8211;Flood 1&#8211;&gt;           &lt;&#8212;Flood 2&#8212;&gt;</p>
<p>Pachete^                   Line  __&#8211;      YNNN<br />
total  |               Rate  __&#8211;      YNNN<br />
|            mum  __&#8211;      YNNN<br />
10 |        Maxi __&#8211;         Y<br />
|         __&#8211;            Y<br />
|     __&#8211;               Y<br />
| __&#8211;    YNNN<br />
|-    YNNN<br />
5 |    Y<br />
|   Y         Legenda:  Y -&gt; se potriveste cu regula<br />
|  Y          	  	 N -&gt; nu se potriveste cu regula<br />
| Y<br />
|Y<br />
0 +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt; timpul in<br />
secunde<br />
0   1   2   3   4   5   6   7   8   9  10  11  12</p>
<p>Se poate vedea ca primele 5 pachete sunt permise sa depaseasca limita<br />
de un pachet pe secunda, apoi limit intervine. Daca este o  pauza de o<br />
secunda inca un pachet in plus va fi permis sa treaca. Intodeauna<br />
insa, nu se va permite depasirea de un pachet/secunda dupa ca<br />
numarul limita (burst-limit) este atins.</p>
<p>owner</p>
<p>acest modul incearca sa se potriveasca trasaturilor diferite ale<br />
creatorului pachetului, pentru pachetele generate local. Este valid<br />
numai in chain-ul OUTPUT, si chiar si atunci unele pachete (cum ar<br />
fi raspunsurile de tip ICMP) pot sa nu aiba creator, si de aceea sa<br />
nu se potriveasca.</p>
<p>&#8211;uid-owner userid<br />
se potriveste daca pachetul a fost creat de catre un proces cu<br />
acelasi id de user.</p>
<p>&#8211;gid-owner groupid<br />
se potriveste daca pachetul a fost creat de catre un proces cu<br />
acelasi id de group.</p>
<p>&#8211;pid-owner processid<br />
se potriveste daca pachetul a fost creat de catre un proces cu<br />
acelasi id de proces.</p>
<p>&#8211;sid-owner sessionid<br />
se potriveste daca pachetul a fost creat de catre un proces in grupul<br />
de sesiune dat.</p>
<p>unclean</p>
<p>Acest modul experimental trebuie sa fie in mod explicit specificat cu<br />
optiunea &#8220;-m unclean&#8221; sau &#8220;&#8211;match unclean&#8221;. Realizeaza niste teste<br />
variate de sanatate asupra pachetelor. Acest modul nu a fost testat,<br />
si nu ar trebui sa fie folosit ca o unealta in securitate (probabil<br />
ca inrautateste lucrurile din cauza ca el insusi s-ar putea sa aiba<br />
buguri). Nu este disponibila nici o optiune.</p>
<p>7.3.6.5 Potrivirea dupa stare</p>
<p>Cele mai folositoare optiuni este furnizata de modulul &#8220;state&#8221;, care<br />
interpreteaza analizele detectorului de conexiuni ale modulului<br />
&#8220;ip_conntrack&#8221;. Aceasta este foarte recomandata.</p>
<p>Specificarea modulului &#8220;-m state&#8221; permite folosirea unei optiuni<br />
aditionale de stare  &#8220;&#8211;state&#8221;. Aceste stari sunt:</p>
<p>NEW<br />
un pachet care creeaza o noua conexiune.</p>
<p>ESTABLISHED<br />
un pachet care apartine unei conexiuni deja stabilite (un pachet<br />
replica (replay), sau un pachet care pleaca al unei conexiuni care a primit<br />
replayuri).</p>
<p>RELATED<br />
Un pachet care este inrudit, dar care nu este parte a unei conexiuni existente,<br />
cum ar fi o eroare ICMP, sau (cu modulul FTP introdus), un pachet care<br />
stabileste o conexiune FTP.</p>
<p>INVALID<br />
Un pachet care nu a putut fi identificat pentru niste motive: aceasta include<br />
ramanerea fara memorie sau erori ICMP care nu apartin nici unei conexiuni<br />
cunoscute. In mod normal aceste pachete ar trebui ignorate.</p>
<p>Un exemplu pentru aceasta puternica optiune de potrivire ar fi:</p>
<p># iptables -A FORWARD -i ppp0 -m state ! NEW -j DROP</p>
<p>7.4 Argumente asupra tintei</p>
<p>Acum stim ce examinare poate fi facuta asupra unui pachet, avem nevoie de o<br />
cale pentru a preciza ce sa facem cu pachetele care se potrivesc  testelor<br />
noastre. Aceasta este numita tinta unei reguli.</p>
<p>Exista doua foarte simple tinte incluse: DROP si ACCEPT. Ne-am intalnit deja<br />
cu aceastea. Daca o regula se potriveste cu un pachet si tinta regulii este<br />
una din aceste doua, nici una din regulile urmatoare nu  sunt consultate,<br />
soarta pachetului a fost decisa.</p>
<p>Mai sunt doua tipuri de tinte pe langa acestea incluse: tinte extinse si<br />
chain-urile definite de catre utilizator.</p>
<p>7.4.1 Chain-uri definite de utilizator</p>
<p>O caracteristica puternica pe care iptables o mosteneste de la ipchains este<br />
posibilitatea utilizatorului de a crea chain-uri noi, pe langa cele incluse<br />
default (INPUT, OUTPUT si FORWARD). Prin conventie, chain-urile definite de<br />
catre utilizator se scriu cu litera mica pentru a le deosebi (vom descrie<br />
mai jos cum sa cream acest tip de chain-uri in &#8220;7.5 Operatii asupra unui<br />
intreg chain&#8221;).</p>
<p>Cand un pachet se potriveste cu o regula a carei tinta este un chain definit<br />
de catre utilizator, pachetul incepe sa traverseze chain-ul definit de catre<br />
utilizator. Daca acel chain-ul nu decide soarta pachetul de indata ce<br />
pachetul ajunge la sfarsitul chain-ului respectiv, pachetul continua<br />
traversarea  chain-ului initial.</p>
<p>Este timpul pentru niste arta ASCII. Considera doua chain-uri aiurea: INPUT<br />
(chain-ul inclus default) si test (un chain definit de utilizator).</p>
<p>&#8220;INPUT&#8221;                         &#8220;test&#8221;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
| Rule1: -p ICMP -j DROP   |    | Rule1: -s 192.168.1.1    |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|    |&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|<br />
| Rule2: -p TCP -j test    |    | Rule2: -d 192.168.1.1    |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
| Rule3: -p UDP -j DROP    |<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Considera un pachet TCP venind de la 192.168.1.1 si ducandu-se catre 1.2.3.4.<br />
Acesta intra in chain-ul INPUT. Rule1 nu se potriveste cu el, Rule2 se<br />
potriveste asa ca urmatoarea regula care este examinata este prima din<br />
chain-ul test. Rule1 se potriveste dar nu este specificata nici o tinta,<br />
asa ca urmatoarea regula este examinata. Rule2 nu se potriveste asa ca am<br />
ajuns la sfarsitul chain-ului. Astfel ne reintoarcem in chain-ul INPUT, unde<br />
am examinat Rule2, asa ca examinam Rule3 care nici aceasta nu se potriveste.</p>
<p>Deci calea urmata de catre pachet este:</p>
<p>v    __________________________<br />
&#8220;INPUT&#8221;                |   /    &#8220;test&#8221;                v<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8211;/    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;-<br />
| Rule1                 | /|    | Rule1                |   |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|/-|    |&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|&#8212;|<br />
| Rule2                 /  |    | Rule2                |   |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;v&#8212;-<br />
| Rule3 	               /&#8211;+___________________________/<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;<br />
v</p>
<p>Chain-urile definite de catre utilizator pot sari la alte chain-uri definite<br />
de catre utilizator (dar nu crea trasee in cerc, pachetele tale vor fi<br />
ignorate daca intra in bucla).</p>
<p>7.4.2 Optiuni extinse la iptables: Noi tinte</p>
<p>Celalat tip de optiune extinsa este o tinta. O tinta extinsa este formata<br />
dintr-un modul de kernel si o extensie optionala la iptables pentru a pune<br />
la dispozitie noi optiuni in linia de comanda. Sunt mai multe optiuni<br />
extinse in distributia default a netfilter-ului:</p>
<p>LOG</p>
<p>Acest modul permite log-area de catre kernel a pachetelor care se<br />
potrivesc. Acest modul pune la dispozitie urmatoarele optiuni<br />
aditionale:</p>
<p>&#8211;log-level<br />
urmat de un numar al nivelului sau de un nume. Numele corecte sunt<br />
(nu conteaza daca sunt scrise cu litera mare sau nu) &#8220;debug&#8221;, &#8220;info&#8221;,<br />
&#8220;notice&#8221;, &#8220;warning&#8221;, &#8220;err&#8221;, &#8220;crit&#8221; and &#8220;emerg&#8221;, corespunzand numerelor<br />
de la 7 la 0. Citeste man-ul de la syslog.conf pentru o explicatie<br />
privind aceste niveluri de logare. Nivelul default este &#8220;warning&#8221;.</p>
<p>&#8211;log-prefix<br />
urmat de un sir de caractere pana la 29 de caractere, acest mesaj<br />
este pus in fata mesajului care este logat, pentru a-i permite<br />
identificarea unica.</p>
<p>Acest modul este bun dupa o limita de potrivire, pentru a nu-ti<br />
flooda fisierele de log.</p>
<p>REJECT</p>
<p>Acest modul are acelasi efect cu &#8220;DROP&#8221;, cu exceptia faptului ca<br />
celui ce trimite pachetele ii este trimis mesaj de eroare ICMP &#8220;port<br />
unreachable&#8221;. Bagati la cap ca mesajul de eroare ICMP nu este trimis<br />
daca (citeste RFC 1122):<br />
- pachetul de il filtrezi a fost de la inceput o eroare ICMP<br />
sau alt tip de pachet ICMP necunoscut.<br />
- pachetul ce este filtrat nu este un fragment de inceput.<br />
- am trimis recent prea multe mesaje de eroare ICMP catre acea<br />
destinatie ( cat /proc/sys/net/ipv4/icmp_ratelimit).<br />
REJECT pune de asemenea la dispozitie o noua optiune<br />
&#8220;&#8211;reject-with&#8221; care modifica pachetul folosit la replay: man<br />
iptables.</p>
<p>7.4.3 Tinte speciale construite default</p>
<p>Sunt doua tinte speciale contruite default: RETURN si QUEUE.</p>
<p>RETURN are acelasi efect cu trecerea direct la sfarsitul chain-ului: pentru<br />
o regula in chain-ul inclus default politica acelui chain-ului este executata.<br />
Pentru o regula intr-un chain definit de catre utilizator, traversarea continua in<br />
chain-ul anterior, exact dupa regula care a determinat trecerea la acest<br />
chain.</p>
<p>QUEUE este o tinta speciala, care pune in rand pachetul pentru procesare de<br />
catre programe utilizator. Pentru ca aceasta sa fie folositor doua urmatoare<br />
componente sunt cerute:</p>
<p>- un &#8220;gestionar al cozii&#8221;, care se ocupa de mecanismele propriu-zise de<br />
trecere a pachetelor intre kernel si modul utilizator; si</p>
<p>- un program in mod utilizator pentru a primi, posibil a manipula, si a<br />
da verdicte in ceea ce priveste pachetele.</p>
<p>Gestionarul standard al cozii pentru iptables IPv4 este modulul ip_queue, care<br />
este distribuit cu kernelul si considerat experimental.</p>
<p>Ceea ce urmeaza este un scurt exemplu despre cum sa folosesti iptables pentru<br />
a pune in coada pachetele pentru procesare in mod utilizator:</p>
<p># modprobe iptable_filter<br />
# modprobe ip_queue<br />
# iptables -A OUTPUT -p icmp -j QUEUE</p>
<p>Cu aceasta regula, pachetele ICMP  generate local (care sunt create<br />
, sa zicem, cu ping) sunt pasate modulului ip_queue, care apoi incearca sa<br />
livreze pachetele unei aplicatii in mod utilizator. Daca nici o<br />
aplicatie nu asteapta acele pachete, acestea sunt ignorate.</p>
<p>Pentru a scrie o aplicatie in mod utilizator, poti folosi libipq API. Acesta<br />
este distribuit impreuna cu iptables. Cod exemplu poate fi gasit in programele<br />
de testare (redirect.c) in CVS.</p>
<p>Starea lui ip_queue poate fi verificata prin:</p>
<p>/proc/net/ip_queue</p>
<p>Marimea maxima a unei cozi (i.e. numarul de pachete livrata modului utilizator<br />
fara primirea inapoi a unei comfirmari) poate fi controlat prin:</p>
<p>/proc/sys/net/ipv4/ip_queue_maxlen</p>
<p>Marimea default pentru marimea maxima a cozii este 1024. Odata ce aceasta<br />
limita este atinsa, noile pachete vor fi ignorate pana cand marimea cozii<br />
scade sub nivelul limita. Protocoale bine gandite ca TCP interpreteaza<br />
pachetele ignorate ca aglomerare, si din fericire va inceta livrarea de<br />
pachete cand coada este plina. Cu toate acestea, va lua ceva experimente<br />
pentru a determina valoare ideala pentru marimea cozii pentru o situatie data<br />
daca valoarea default este prea mica.</p>
<p>7.5 Operatii asupra unui intreg chain</p>
<p>O foarte folositoare caracteristica a iptables-ului este posibilitatea de a<br />
grupa mai multe reguli intr-un chain. Poti numi chain-urile cum doresti, dar<br />
recomand folosirea literelor mici pentru a evita confuzia cu chain-urile<br />
incluse default si tinte. Numele de chain-uri pot fi pana la 31 de litere in<br />
lungime.</p>
<p>7.5.1 Creearea unui nou chain</p>
<p>Sa cream un nou chain. Pentru ca sunt un tip cu atata imaginatie o sa o<br />
numesc test. Pentru aceasta folosim optiunea &#8220;-N&#8221; sau &#8220;&#8211;new-chain&#8221;:</p>
<p># iptables -N test<br />
#</p>
<p>Este atat de simplu. Acum poti introduce reguli in el cum am aratat mai sus.</p>
<p>7.5.2 Stergerea unui chain</p>
<p>Si sergerea unui chain este deasemenea simpla, prin folosirea optiunilor &#8220;-X&#8221;<br />
sau &#8220;&#8211;delete-chain&#8221;. De ce &#8220;-X&#8221;? Pai toate literele bune au fost luate.</p>
<p># iptables -X test<br />
#</p>
<p>Sunt cateva restricitii la stergerea de chain-uri: acestea trebuie sa fie<br />
goale (vezi &#8220;Stergerea tuturor regulilor unui chain&#8221; dedesubt) si nu trebuie<br />
sa fie tinta nici unei reguli. Nu poti sterge nici unul dintre chain-rile<br />
incluse default.</p>
<p>Daca nu specific numele chain-ului, atunci toate chain-urile definite de catre<br />
utilizator vor fi sterse daca este posibil.</p>
<p>7.5.3 Stergerea tuturor regulilor unui chain</p>
<p>Exista un mod simplu de de sterge toate regulile dintr-un chain, folosind<br />
optiunile &#8220;-F&#8221; (sau &#8220;&#8211;flush&#8221;).</p>
<p># iptables -F FORWARD<br />
#</p>
<p>Daca nu este specificat chain-ul atunci toate chain-urile vor fi sterse de<br />
reguli.</p>
<p>7.5.4 Listarea unui chain</p>
<p>Poti lista toate regulile dintr-un chain prin folosirea optiunii &#8220;-L&#8221; (sau<br />
&#8220;&#8211;list&#8221;).</p>
<p>&#8220;refcnt-ul&#8221;(reference count) listat pentru fiecare chain definit de catre<br />
utilizator  este numarul de reguli care au ca tinta acest chain. Acesta<br />
trebuie sa fie zero (si chain-ul sa fie gol) inainte ca acest chain sa poata<br />
fi sters.</p>
<p>Daca numele chain-ului este omis, toate chain-urile sunt listate, chiar si<br />
cele care sunt goale.</p>
<p>Exista trei optiuni care pot fi adaugate la &#8220;-L&#8221;. Optiunea &#8220;-n&#8221; (numeric)<br />
este foarte folositoare deoarece previne iptables in a incerca sa rezolve<br />
IP-urile in nume, care (daca folosesti DNS ca majoritatea oamenilor) va cauza<br />
mari intarzieri daca DNS-ul tau nu este setat corect, sau ai filtrat cererile<br />
catre DNS. Determina deasemenea ca porturile TCP si UDP sa fie afisate ca<br />
numere in loc de nume.</p>
<p>Optiunea &#8220;-v&#8221; arata toate detaliile regulilor, cum ar fi counter-ele pentru de<br />
pachete si bytes, comparatiile TOS, interfata. Altfel aceste detalii sunt<br />
omise.</p>
<p>Observa faptul urmator: counter-ele pentru pachete si bytes sunt afisate<br />
folosind sufixele &#8220;K&#8221;, &#8220;M&#8221; sau &#8220;G&#8221; pentru 1000, 1,000,000 si respectiv<br />
1,000,000,000. Folosirea lui optiunii &#8220;-x&#8221; (expandare a numerelor) afiseaza<br />
numerele in formatul maxim, fara sa conteze cat sunt de mari.</p>
<p>7.5.5 Resetarea counter-elor</p>
<p>Este folositoare posibilitatea de a putea sa resetezi counter-ele. Aceasta<br />
poate fi facuta cu optiune &#8220;-Z&#8221; (sau &#8220;&#8211;zero&#8221;).</p>
<p>Considera urmatoarele:</p>
<p># iptables -L FORWARD<br />
# iptables -Z FORWARD<br />
#</p>
<p>In exemplul de mai sus, unele pachete au putut sa vina intre cele doua<br />
comenzi. Pentru acest motiv, poti folosi cele doua optiuni &#8220;-L&#8221; si &#8220;-Z&#8221;<br />
impreuna, pentru a reseta counter-ele in timp ce le afisezi.</p>
<p>7.5.6 Setarea policy-ului</p>
<p>Am explicat ce se intampla cand un pachet ajunge la capatul unui chain inclus<br />
default si am discutat mai devreme cum parcurge un pachet chain-urile. In<br />
acest caz, policy-ul chain-ului determina soarta pachetului. Doar chain-urile<br />
incluse default (INPUT, OUTPUT si FORWARD) au policy-uri, deoarece daca un<br />
pachet ajunge la capatul unui chain definit de catre utilizator, traversarea<br />
continua in chain-ul anterior.</p>
<p>Politica poate fi fie ACCEPT, fie DROP, de exemplu:</p>
<p># iptables -P FORWARD drop<br />
#</p>
<p>8. Folosirea ipchains si ipfwadm</p>
<p>Sunt module in distributia netfilter pe nume ipchains.o si ipfwadm.o.<br />
Insereaza unul dintre acestea in kernelul tau ( Observatie: aceste module<br />
sunt incompatibile cu ip_tables.o). Apoi poti folosi ipchains sau ipfwadm  ca<br />
in vremurile de alta data.</p>
<p>Aceasta va fi suportata pentru inca un timp. Cred ca o formula rezonabila<br />
este 2 * [nota inlocuirii - prima versiune stabila], dupa data cand o versiune<br />
stabila a inlocuirii este disponibila.<br />
Asta inseamna ca suportul va fi probabil abandonat in Linux 2.6 sau 2.8.</p>
<p>9. Folosirea impreuna a NAT-ului si a filtrarii de pachete</p>
<p>Este normal sa vrei sa faci NAT (vezi NAT HOWTO) si filtrare de pachete.<br />
Veste buna este ca se pot folosi impreuna extrem de bine.</p>
<p>Faci filtrarea de pachete ingorand total orice NAT ai deja. Sursa si<br />
destinatia vazute de catre filtrul de pachete vor fi sursele si destinatiile<br />
reale. De exemplu daca faci DNAT pentru a trimite orice conexiune pentru<br />
1.2.3.4 portul 80 spre 10.1.1.1 portul 8080, filtrul de pachete va vedea<br />
pachetele ducandu-se catre 10.1.1.1 portul 8080 (adresa reala), nu 1.2.3.4<br />
port 80. In mod similar poti ignora masquerading: pachetele vor parea ca vin<br />
de la adresa lor IP interna reala (sa zicem 10.1.1.1), si replay-urile vor<br />
parea ca se duc inapoi acolo.</p>
<p>Poti folosi optiunea extinsa de potrivire &#8220;match&#8221; fara sa pui filtrul de<br />
pachete sa faca munca in plus, deoarece NAT cere detectarea de conexiuni<br />
oricum. Pentru a dezvolta exemplul simplu de masquerading din NAT HOWTO pentru<br />
a nu permite noi conexiuni pe interfata ppp0, vei face urmatoarele:</p>
<p># masquerading pentru ppp0<br />
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</p>
<p># refuzarea de pachete NOI sau INVALIDE forwardate sau care vin prin ppp0<br />
iptables -A INPUT -i ppp0 -m state &#8211;state NEW,INVALID -j DROP<br />
iptables -A FORWARD -i ppp0 -m state &#8211;state NEW,INVALID -j DROP</p>
<p># se da drumu la IP forwarding<br />
echo 1 &gt; /proc/sys/net/ipv4/ip_forward</p>
<p>10. Diferente intre iptables si ipchains</p>
<p>o In primul rand, numele chain-urilor predefinite si-au schimbat scrierea din<br />
litere mici in litere mari, deoarece chain-urile INPUT si OUTPUT primesc acum<br />
doar pachete cu destinatie locala si pachete generate local. Ele obisnuiau<br />
sa vada toate pachetele care intrau si respectiv care ieseau.</p>
<p>o Optiunea &#8220;-i&#8221; acum inseamna interfata de intrare si are sens numai in<br />
chain-urile INPUT si FORWARD. Regulile in chain-urile OUTPUT si FORWARD care<br />
foloseau inainte &#8220;-i&#8221; vor trebuie sa fie schimbate cu &#8220;-o&#8221;.</p>
<p>o Porturile TCP si UDP trebuie sa fie precizate folosind optiunile<br />
&#8211;source-port  sau &#8211;sport (sau &#8211;destination-port/&#8211;dport), si trebuie<br />
puse dupa optiunile &#8220;-p tcp&#8221; sau &#8220;-p udp&#8221;, deorece acestea incarca optiunile<br />
disponibile extensiilor TCP si respectiv UDP.</p>
<p>o Argumentul TCP -y a devenit acum &#8211;syn si trebuie pus dupa &#8220;-p tcp&#8221;.</p>
<p>o In cele din urma tinta DENY a deveni DROP.</p>
<p>o Resetarea counter-elor pentru un singur chain in timp concomitent cu<br />
listarea acestuia este acum posibila.</p>
<p>o Resetara counter-elor pentru chain-urile predefinite resetezeaza desemenea<br />
counter-ele policy-ului chain-urilor respective.</p>
<p>o Listarea counter-elor iti arata counter-ele instant.</p>
<p>o REJECT si LOG sunt acum tinte extinse, insemnand ca sunt module de kernel<br />
separate.</p>
<p>o Numele pentru chain-uri pot fi pana la 31 de caractere in lungime.</p>
<p>o MASQ este acum MASQUERADE si foloseste o sintaza diferita. REDIRECT, desi<br />
si-a pastrat vechiul nume, a suferit deasemenea o schimbare de sintaxa.<br />
Citeste NAT-HOWTO pentru mai multe informatii despre cum sa le configurezi.</p>
<p>o Optiunea &#8220;-o&#8221; nu mai este folosita pentru a conduce pachetele in mod<br />
utilizator (vezi -i de mai sus). Pachetele sunt trimise acum in mod utilizator<br />
folosind tinta QUEUE.</p>
<p>o Probabil o gramada de alte lucruri pe care le-am uitat.</p>
<p>11. Sfaturi asupra designului filtrului de pachete</p>
<p>In domeniul securitatii cel mai bun lucru este sa blochezi totul, apoi sa<br />
deschizi gauri acolo unde este necesar. Aceasta este deobicei spus &#8220;ceea ce nu<br />
este in mod explicit permis este interzis&#8221;. Recomand aceasta  daca securitatea<br />
este grija ta cea mai mare.</p>
<p>Nu rula nici un serviciu de care nu ai nevoie, chiar daca ai blocat accesul la<br />
el.</p>
<p>Recomand securitatea in adancime: combina tcp-wrappers (pentru conexiuni catre<br />
insusi filtrul de pachete), proxy-uri (pentru conexiuni ce trec peste filtrul<br />
de pachete), verificarea routei si filtrare de pachete. Verificarea routei<br />
este cand un pachet care vine de la o interfata de la care nu poate veni este<br />
ignorate: de exemplu, daca reteaua ta interna are adresele 10.1.1.0/24, si<br />
un pachet care are ca sursa o adresa apartinand acelei clase vine pe<br />
interfata externa, acesta va fi ignorat. Aceasta verificare a routei poate<br />
fi activate pentru o interfata (ppp0) astfel:</p>
<p># echo 1 &gt; /proc/sys/net/ipv4/conf/ppp0/rp_filter<br />
#</p>
<p>Sau pentru toate interfetele existente si viitoare astfel:</p>
<p># for f in /proc/sys/net/ipv4/conf/*/rp_filter; do<br />
#     echo 1 &gt; $f<br />
# done<br />
#</p>
<p>Debian realizeaza acest lucru &#8220;by default&#8221; cand este posibil. Daca ai routare<br />
asimetrica  (te astepti sa primesti pachete din directii ciudate), vei<br />
dori sa dezactivezi aceasta filtrare pe interfetele respective.</p>
<p>Logarea pachetelor este folositoare cand configurezi un firewall si ceva nu<br />
merge, insa pe un sistem in productie, intodeauna foloseste aceasta in<br />
combinatie cu limitare, pentru a preveni floodarea fisierelor cu log-uri.</p>
<p>Recomand pentru sistemele sigure depistarea conexiunilor (connection<br />
tracking): determina o incarcare a sistemului, deoarece toate conexiunile sunt<br />
depistate, dar este foarte folositoare pentru a controla accesul la retelele<br />
tale. S-ar putea sa trebuiasca sa incarci modulul &#8220;ip_conntrack.o&#8221; daca<br />
kernelul tau nu incarca in mod automat modulele si nu este compilat in<br />
kernel. Daca vrei sa depistezi cu precizie protocoale complexe, va trebui sa<br />
incarci modulul necesar pentru aceasta (ex. &#8220;ip_conntrack_ftp.o&#8221;).</p>
<p># iptables -N no-conns-from-ppp0<br />
# iptables -A no-conns-from-ppp0 -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
# iptables -A no-conns-from-ppp0 -m state &#8211;state NEW -i ! ppp0 -j ACCEPT<br />
# iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG &#8211;log-prefix &#8220;Bad packet from ppp0:&#8221;<br />
# iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG &#8211;log-prefix &#8220;Bad packet not from ppp0:&#8221;<br />
# iptables -A no-conns-from-ppp0 -j DROP<br />
# iptables -A INPUT -j no-conns-from-ppp0<br />
# iptables -A FORWARD -j no-conns-from-ppp0</p>
<p>Construirea unui bun firewall este peste scopul acestui HOWTO, dar sfatul meu<br />
este ca &#8220;intodeauna sa fii minimalist&#8221;. Citeste Security HOWTO pentru mai multe<br />
informatii privind testarea si examinarea sistemului.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=171</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
